web-dev-qa-db-ja.com

ナビゲーションドロワーアイテムがクリックイベントを登録していない

ナビゲーションドロワーアイテムを登録して開始し、新しいアクティビティに参加するのに苦労しています。引き出しはうまく開いて正しく表示されますが、リストの項目をクリックしても何も起こりません。これは、Googleチュートリアルから取得した私のコードです。

mTitle = mDrawerTitle = getTitle();
           mTitles = getResources().getStringArray(R.array.menu_items);
           mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
           mDrawerList = (ListView) findViewById(R.id.left_drawer);

           // set a custom shadow that overlays the main content when the drawer opens
           mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
           // set up the drawer's list view with items and click listener
           mDrawerList.setAdapter(new ArrayAdapter<String>(this,
                   R.layout.drawer_list_item, mTitles));
           mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

           // enable ActionBar app icon to behave as action to toggle nav drawer
           getActionBar().setDisplayHomeAsUpEnabled(true);
           getActionBar().setHomeButtonEnabled(true);

           // ActionBarDrawerToggle ties together the the proper interactions
           // between the sliding drawer and the action bar app icon
           mDrawerToggle = new ActionBarDrawerToggle(
                   this,                  /* Host Activity */
                   mDrawerLayout,         /* DrawerLayout object */
                   R.drawable.ic_drawer,  /* nav drawer image to replace 'Up' caret */
                   R.string.drawer_open,  /* "open drawer" description for accessibility */
                   R.string.drawer_close  /* "close drawer" description for accessibility */
                   ) {
               public void onDrawerClosed(View view) {
                   getActionBar().setTitle(mTitle);
                   invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
               }

               public void onDrawerOpened(View drawerView) {
                   getActionBar().setTitle(mDrawerTitle);
                   invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
               }
           };
           mDrawerLayout.setDrawerListener(mDrawerToggle);

          // if (savedInstanceState == null) {
               selectItem(0);
           }


       @Override
       public boolean onCreateOptionsMenu(Menu menu) {
           MenuInflater inflater = getMenuInflater();
           inflater.inflate(R.menu.main, menu);
           return super.onCreateOptionsMenu(menu);
       }

       /* Called whenever we call invalidateOptionsMenu() */
       @Override
       public boolean onPrepareOptionsMenu(Menu menu) {
           // If the nav drawer is open, hide action items related to the content view
           boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
         //  menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);
           return super.onPrepareOptionsMenu(menu);
       }

       @Override
       public boolean onOptionsItemSelected(MenuItem item) {
            // The action bar home/up action should open or close the drawer.
            // ActionBarDrawerToggle will take care of this.
           if (mDrawerToggle.onOptionsItemSelected(item)) {
               return true;
           }
               return super.onOptionsItemSelected(item);       
           }


       /* The click listner for ListView in the navigation drawer */
       private class DrawerItemClickListener implements ListView.OnItemClickListener {
           @Override
           public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
               selectItem(position);
           }
       }

       private void selectItem(int position) {
           switch (position) {
           case 1:
               new DataTask(MainActivity.this).execute();   
               MainActivity.this.finish();//Set this Activity to Finish so no loop back       
               Intent intent=new Intent(MainActivity.this,SplashScreen.class);
               startActivity(intent);
               break;
           case 2:
              // ft.replace(R.id.content_frame, new SecondFragment());
            //  setTitle("Second");
               break;
           case 3:
              // ft.replace(R.id.content_frame, new ThirdFragment());
            //   setTitle("Third");
               break;

           default:
               break;
           }
           // update selected item and title, then close the drawer
           mDrawerList.setItemChecked(position, true);
           //setTitle(mTitles[position]);
           mDrawerLayout.closeDrawer(mDrawerList);
       }

       @Override
       public void setTitle(CharSequence title) {
           mTitle = title;
           getActionBar().setTitle(mTitle);
       }

       /**
        * When using the ActionBarDrawerToggle, you must call it during
        * onPostCreate() and onConfigurationChanged()...
        */

       @Override
       protected void onPostCreate(Bundle savedInstanceState) {
           super.onPostCreate(savedInstanceState);
           // Sync the toggle state after onRestoreInstanceState has occurred.
           mDrawerToggle.syncState();
       }

       @Override
       public void onConfigurationChanged(Configuration newConfig) {
           super.onConfigurationChanged(newConfig);
           // Pass any configuration change to the drawer toggls
           mDrawerToggle.onConfigurationChanged(newConfig);
       }

       /**
        * Fragment that appears in the "content_frame", shows a planet
        */
       public static class PlanetFragment extends Fragment {
           public static final String ARG_PLANET_NUMBER = "planet_number";

           public PlanetFragment() {
               // Empty constructor required for fragment subclasses
           }

         //  @Override
        /*   public View onCreateView(LayoutInflater inflater, ViewGroup container,
                   Bundle savedInstanceState) {
               View rootView = inflater.inflate(R.layout.fragment_planet, container, false);
               int i = getArguments().getInt(ARG_PLANET_NUMBER);
               String planet = getResources().getStringArray(R.array.planets_array)[i];

               int imageId = getResources().getIdentifier(planet.toLowerCase(Locale.getDefault()),
                               "drawable", getActivity().getPackageName());
               ((ImageView) rootView.findViewById(R.id.image)).setImageResource(imageId);
               getActivity().setTitle(planet);
               return rootView;                      */
           }

私が本当にこれで私の髪を引っ張っているので、あなたが何か素晴らしい助けを提供することができれば。ありがとうございました。

21
J4C3N-14

問題はzの順序です。 onDrawerOpenedのリストを展開すると、次のようになります。

mDrawerList.bringToFront();
mDrawerLayout.requestLayout();

この投稿では、問題とその修正方法について説明します。 http://vardhan-justlikethat.blogspot.com.es/2014/05/Android-custom-navigation-drawer-not.html

66
user3798518

drawerView.bringToFront();を追加して、同様の問題を修正しました

@Override
public void onDrawerOpened(View drawerView) {

} 
13
aobrazcova

ナビゲーションドロワーにリストがある場合は、コードを記述してリストビューをクリック可能にします。

list.bringToFront();
drawerLayout.requestLayout(); 
2
Kunal

ListView親(レイアウトリソース内)にAndroid:animateLayoutChanges="true"属性があるかどうかを確認する必要があります。その属性を削除するのがうまくいきました。

1
user157745

selectItem()メソッドが呼び出されるのはアクティビティの最後であるonCreate() at selectItem(0);だけなので、DrawerItemClickListener.classが機能しないようです

呼び出す代わりに

mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

パラメータとしてthisを使用して、ActivityListView.OnItemClickListener自体を実装させることができます。

public class MyActivity extends Activity implements ListView.OnItemClickListener {

    public void onCreate(Bundle savedInstanceState) {
        [...]
        mDrawerList = (ListView) findViewById(R.id.left_drawer);

        [...]
        mDrawerList.setOnItemClickListener(this);
        [...]
     }

    [...]    

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        selectItem(position);
    }

    private void selectItem(int position) {
        switch (position) {
            case 1:
                [...]
                startActivity(new Intent(this, SplashScreen.class));
                break;
            [...]
            default:
            break;
        }
        [...]
    }
    [...]
}
0
Endzeit

また、クリックナビゲーションドライバーで応答しないという問題もありました。どういうわけか私は解決策を見つけました:問題はXMLファイルにありました。私はこれを使用し、私の問題はなくなりました:

<Android.support.v4.widget.DrawerLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/drawer_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent">

<!-- As the main content view, the view below consumes the entire
     space available using match_parent in both dimensions. -->
<FrameLayout
    Android:id="@+id/content_frame"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" />

<!-- Android:layout_gravity="start" tells DrawerLayout to treat
     this as a sliding drawer on the left side for left-to-right
     languages and on the right side for right-to-left languages.
     The drawer is given a fixed width in dp and extends the full height of
     the container. A solid background is used for contrast
     with the content view. -->


<ListView
    Android:id="@+id/left_drawer"
    Android:layout_width="240dp"
    Android:layout_height="match_parent"
    Android:layout_gravity="start"
    Android:choiceMode="singleChoice"
    Android:divider="@Android:color/transparent"
    Android:dividerHeight="0dp"
    Android:background="#ffff"/>

これが役立つことを願っています。

0
obolsh