Navigation drawer Items not registering click event

J4C3N-14 picture J4C3N-14 · Feb 21, 2014 · Viewed 23.1k times · Source

I am struggling to get the Navigation drawer items to register and start and intent for a new activity. The drawer opens fine and is displayed correctly but nothing happens when I click on the items in the list. Here is my code that is taken from the google tutorials.

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;                      */
           }

If you can provide any help that would be great as I am really pulling my hair out on this. Thank you.

Answer

user3798518 picture user3798518 · Jul 2, 2014

The problem is the z ordering. When you expand the list in onDrawerOpened put:

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

In this post explain the problem and how fix it: http://vardhan-justlikethat.blogspot.com.es/2014/05/android-custom-navigation-drawer-not.html