【问题标题】:Toggle button not working for navigation drawer切换按钮不适用于导航抽屉
【发布时间】:2014-04-24 15:27:24
【问题描述】:

我正在为我的 android 应用程序实现一个导航抽屉。我通过从侧面拖动来使抽屉工作,但是操作栏上的主页/切换按钮不会更改为我想要的图标并且不会响应点击,你调用了其中定义的 onDrawerClosed 和 onDrawerOpened 方法. 我的代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <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">


    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/loadingFragment"
        android:name="com.whostr.clients.android.LoadingFragment" />

    <fragment 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/eventFragment"
        android:name="com.whostr.clients.android.EventDisplayFragment"/>

    <fragment 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/emptyFragment"
        android:name="com.whostr.clients.android.EmptyView"/>



<!--  Listview to display slider menu -->
<ListView android:id="@+id/left_drawer"
    android:layout_width = "240dp"
    android:layout_height = "match_parent"
    android:layout_gravity = "start"
    android:choiceMode = "singleChoice"
    android:dividerHeight = "1dp"
    android:divider = "@android:color/transparent"
    android:background="#111"
    />

在活动中我有以下代码:

    @Override
public void onCreate(Bundle savedDataInstace)
{
    super.onCreate(savedDataInstace);
    setContentView(R.layout.eventdisplay);

    fm = getSupportFragmentManager();
    //get fragments by id
    fragments[EVENT_VIEW]= fm.findFragmentById(R.id.eventFragment);
    fragments[LOADING] = fm.findFragmentById(R.id.loadingFragment);
    fragments[EMPTY_VIEW] = fm.findFragmentById(R.id.emptyFragment);


    menuList = getResources().getStringArray(R.array.menuArray);
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) findViewById(R.id.left_drawer);

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawwer_open, R.string.drawer_closed)
                        {
                            /*
                             * Called when a drawer has settled in a completely closed state
                             */
                            public void onDrawerClosed(View view)
                            {
                                Log.d("drawerToggle", "Drawer closed");
                                super.onDrawerClosed(view);
                                getActionBar().setTitle(R.string.app_name);
                                invalidateOptionsMenu(); //Creates call to onPrepareOptionsMenu()
                            }

                            /*
                             * Called when a drawer has settled in a completely open state
                             */
                            public void onDrawerOpened(View drawerView)
                            {
                                Log.d("drawerToggle", "Drawer opened");
                                super.onDrawerOpened(drawerView);
                                getActionBar().setTitle("NavigationDrawer");
                                invalidateOptionsMenu();
                            }
                        };
    mDrawerLayout.setDrawerListener(mDrawerToggle);

    //Set the adapter for the list view
    mDrawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, menuList));
    mDrawerList.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View view, int position,
                long id) {
            Log.d("navigationDrawer", "Clicked on an item");
        }

    });


    FragmentTransaction transaction = fm.beginTransaction();

    //Hide the event view
    transaction.hide(fragments[EVENT_VIEW]);
    transaction.hide(fragments[EMPTY_VIEW]);
    transaction.commit();

    AsyncTask<String, Void, EventResponseCollection> task = new GetEventsNearByAsyncTask().execute();
    try {
        if(task != null)
            events = task.get().getItems();

    } catch (InterruptedException | ExecutionException e) {
        Log.d("viewEvent", "Error when retrieving task details " + e.getMessage());
    }

    if(events == null)
    {
        //show create your own event fragment
        changeFragment(EMPTY_VIEW);
    }
    else
    {
        Log.d("viewEvent", "I have " + events.size());
        //show proper fragment with the first event displayed
        currentEvent = events.get(eventIndex);
        ((EventDisplayFragment) fragments[EVENT_VIEW]).updateFragment(currentEvent);
        changeFragment(EVENT_VIEW);
    }
}

    @Override
public boolean onOptionsItemSelected(MenuItem item)
{
    Log.d("onOptionsItemSelected", "In the on item select");
    //Pass the event to ActionBarDrawerToggle, if it returns
    //true, then it has handled the app icon touch event
    if(mDrawerToggle.onOptionsItemSelected(item))
    {
        Log.d("onOptionsItemSelected", "Clicked on action bar item");
        return true;
    }

    //Handle your other action bar items...

    return super.onOptionsItemSelected(item);
}

有人对我能做什么有任何建议吗?我已经尝试了我在网上找到的所有解决方案来完成这项工作,但显然我不走运,似乎没有任何工作:(

【问题讨论】:

    标签: android navigation-drawer togglebutton


    【解决方案1】:

    你必须在你的活动中添加这样的东西

    @Override
    public boolean onOptionsItemSelected(android.view.MenuItem item) {
        return drawerToggle.onOptionsItemSelected(item);
    }
    

    【讨论】:

    • 我已经覆盖了那个方法,但是由于某种原因它永远不会被调用:(。我在上一篇文章中添加了那个方法的代码。
    【解决方案2】:

    这对我有用,几乎就像之前的帖子一样

    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle presses on the action bar items
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
          } }
    

    【讨论】:

    • 这更符合Android Drawer Design Guidelines。另外,如果它到达方法的末尾(不输入if),那么它应该return super.onOptionsItemSelected(item);
    【解决方案3】:

    好的,这是我这边的一个小疏忽,我忘记包含以下两行代码:

    getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setHomeButtonEnabled(true);

    在 onCreate 方法中。

    【讨论】:

      【解决方案4】:

      我也遇到过类似的问题。 我希望这个答案可以帮助面临类似问题的人。 检查抽屉布局中的 openDrawer 属性

      tools:openDrawer="start"
      

      此外,如果您不小心锁定了抽屉,请检查您的 Activity 中的抽屉锁定模式并将其移除。

      //drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
      

      【讨论】:

        【解决方案5】:

        多年后但无论如何.....它可以帮助任何人,当您有一个带有 Drawerlayout 的布局时,Drawer 假定第一个子项是显示时要重叠的视图,而第二个子项是导航面板。因此,在您的情况下,您可以执行类似...

        enter code here
        
        <?xml version="1.0" encoding="utf-8"?>
        <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">
        
        <RelativeLayout 
         android:layout_width="match_parent"
         android:layout_height="match_parent">
        
        <fragment
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/loadingFragment"
            android:name="com.whostr.clients.android.LoadingFragment" />
        
        <fragment 
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/eventFragment"
            android:name="com.whostr.clients.android.EventDisplayFragment"/>
        
        <fragment 
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/emptyFragment"
            android:name="com.whostr.clients.android.EmptyView"/>
        
        </RelativeLayout>
        
        <!--  Listview to display slider menu -->
        <ListView android:id="@+id/left_drawer"
        android:layout_width = "240dp"
        android:layout_height = "match_parent"
        android:layout_gravity = "start"
        android:choiceMode = "singleChoice"
        android:dividerHeight = "1dp"
        android:divider = "@android:color/transparent"
        android:background="#111"
        />
        

        这样一来,Drawer就知道RelativeLayout是要重叠的view,ListView是你想要的左侧面板。

        你还必须在java代码中做所有你知道的事情..设置工具栏,设置指示工具栏的抽屉,设置工具等......这一切都在cmets中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-05-25
          • 2019-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多