导航抽屉项目未注册单击事件

时间:2014-02-21 17:48:13

标签: android android-listview onclick navigation-drawer

我正在努力让导航抽屉项目注册并启动和开展新活动。 抽屉打开正常并正确显示但是当我点击列表中的项目时没有任何反应。 这是我从谷歌教程中获取的代码。

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

如果你可以提供任何帮助,那将是非常好的,因为我真的在拉扯我的头发。谢谢。

6 个答案:

答案 0 :(得分:64)

问题是z排序。当您展开onDrawerOpened put:

中的列表时
mDrawerList.bringToFront();
mDrawerLayout.requestLayout();

在这篇文章中解释问题以及如何解决它: http://vardhan-justlikethat.blogspot.com.es/2014/05/android-custom-navigation-drawer-not.html

答案 1 :(得分:13)

通过将drawerView.bringToFront();添加到

修复了类似问题
@Override
public void onDrawerOpened(View drawerView) {

} 

答案 2 :(得分:2)

如果您在导航抽屉中有一个列表,那么只需编写代码并使listview可单击:

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

答案 3 :(得分:1)

您应该检查ListView父级(布局资源)中是否有android:animateLayoutChanges="true"属性。 删除该属性对我有用。

答案 4 :(得分:0)

您的DrawerItemClickListener.class似乎无法正常工作selectItem()方法仅在您的活动结束时onCreate() selectItem(0);

而不是打电话

mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

您可以使用this作为参数,让Activity实现ListView.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;
        }
        [...]
    }
    [...]
}

答案 5 :(得分:0)

我还遇到了点击导航驱动程序没有响应的问题。不知怎的,我找到了一个解决方案:问题出现在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"/>

希望这会有用。

相关问题