【问题标题】:Appcompatv7 - v21 Navigation drawer not showing hamburger iconAppcompatv7 - v21 导航抽屉不显示汉堡包图标
【发布时间】:2015-01-01 12:16:42
【问题描述】:

我正在使用最新的 appcompat 支持库实现棒棒糖风格的导航抽屉,但问题是汉堡图标永远不会显示。只显示后退图标。

这是我的活动代码

import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.Toolbar;
import android.view.View;

public class Home extends ActionBarActivity {

private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    initViews();
}


private void initViews(){

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);


    toolbar.setTitleTextColor(getResources().getColor(android.R.color.white));
    setSupportActionBar(toolbar);

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,toolbar ,  R.string.drawer_open, R.string.drawer_close) { 

        /** Called when a drawer has settled in a completely closed state. */ 
        public void onDrawerClosed(View view) {
            super.onDrawerClosed(view);
            //getActionBar().setTitle(mTitle);
            //invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        } 

        /** Called when a drawer has settled in a completely open state. */ 
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            //getActionBar().setTitle(mDrawerTitle);
            //invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        } 
    }; 


    // Set the drawer toggle as the DrawerListener 
    mDrawerLayout.setDrawerListener(mDrawerToggle);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true); 

 }
}

这是我的样式文件

 <resources>
 <!-- Application theme. -->
<style name="Theme.Test" parent="@style/Theme.AppCompat.Light">

    <!-- customize the color palette -->
    <item name="colorPrimary">@color/primary</item>
    <item name="colorPrimaryDark">@color/primary_dark</item>
    <item name="colorAccent">@color/accent</item>
    <item name="windowActionBar">false</item>
    <item name="drawerArrowStyle">@style/Theme.Test.DrawerArrowStyle</item>
</style>

<style name="Theme.Test.DrawerArrowStyle" parent="@style/Widget.AppCompat.DrawerArrowToggle">
    <item name="spinBars">true</item>
    <item name="color">@android:color/white</item>
</style>

布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    app:theme="@style/ThemeOverlay.AppCompat.ActionBar" />

<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:layout_below="@+id/toolbar">

    <!-- The main content view -->

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <!-- The navigation drawer -->

    <ListView
        android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#111"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp" />
</android.support.v4.widget.DrawerLayout>

</RelativeLayout>

在这两种情况下都只显示后退箭头,我已经阅读了很多帖子,但似乎没有任何区别。任何帮助将不胜感激。

【问题讨论】:

    标签: android android-layout android-support-library android-navigation


    【解决方案1】:

    你需要打电话

    mDrawerToggle.syncState();
    

    【讨论】:

    • 我猜在 onDrawerClosed() 和 onDrawerOpened() 里面
    • 就在你初始化你的ActionBarDrawerToggle之后
    • 嗨!我们可以在不调用mDrawerToggl.syncState() 的情况下显示汉堡图标吗,实际上我将导航抽屉显示为工具栏上的叠加层,因此在我的情况下不需要动画。
    • 也许你的问题是另一个@AlexVPerl。无需仅仅因为它对您不起作用而投反对票。见鬼,如果我要否决所有对我不起作用的答案....
    • @PedroOliveira 这不是上/下投票按钮的用例吗?
    【解决方案2】:

    使用 ActionBarDrawerToggle 时,必须在 onPostCreate() 和 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);
        }
    

    【讨论】:

    • 还有onOptionsItemSelected
    • 对我没有帮助。安卓6.0
    【解决方案3】:

    在包含 ActionBarDrawerToggle 时,请务必使用 post 方法:

    mDrawerLayout.post(new Runnable() {
       @Override
       public void run() {
           mDrawerToggle.syncState();
       }
    });
    

    【讨论】:

    • 这对我有用!那并删除了通过使用setHomeAsUpIndicator(R.drawable.ic_menu/ic_back) 完成的解决方法,该解决方法强制在片段之间切换时假装的图标。但是在更新为新的动画汉堡图标后,它就不起作用了。
    【解决方案4】:

    不要忘记覆盖 onOptionsItemSelected 方法并检查是否单击了 ctionBarDrawerToggle,在这种情况下返回 true 否则活动将结束。

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (actionBarDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
    

    【讨论】:

    • 单线:return actionBarDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item)
    【解决方案5】:

    您可以在 Activity 的 onPostCreate 中调用 syncState() 以在 onRestoreInstanceState 发生后将指示器与链接的 DrawerLayout 的状态同步。

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

    ActionBarDrawerToggle 也可以直接用作 DrawerLayout.DrawerListener,或者如果您已经提供了自己的侦听器,请从您自己的每个侦听器方法中调用。

    private ActionBarDrawerToggle mDrawerToggle;
    private DrawerLayout mDrawerLayout;
      .
      .
      .
      .
    mDrawerLayout.setDrawerListener(mDrawerToggle);
    
        mDrawerLayout.post(new Runnable() {
            @Override
            public void run() {
                mDrawerToggle.syncState();
            }
        });
    

    【讨论】:

      【解决方案6】:

      mDrawerToggle.syncState() 对我不起作用,但我最终得到了它:

      getSupportActionBar().setHomeAsUpIndicator(R.drawable.hamburger_icon);
      

      但是,我没有使用工具栏。

      【讨论】:

      • 这行代码拯救了我的一天。我已经将我的eclipse代码转换为android studio,突然我的抽屉切换按钮自动转换为箭头。现在添加这行代码后它工作正常。非常感谢@john Leehey
      【解决方案7】:

      确保您正在导入正确的抽屉开关。

      当我导入 v4 版本时,我看到了箭头(下图)。

      import android.support.v4.app.ActionBarDrawerToggle;
      

      将其更改为此(以下,v7)解决了我的问题。

      import android.support.v7.app.ActionBarDrawerToggle;
      

      【讨论】:

        【解决方案8】:

        由于我的 NavigationDrawer 扩展的是 Fragment 而不是 Activity,因此我无法覆盖 postCreate。以下是我所做的。

           ActionBar actionBar = getActionBar();
           actionBar.setDisplayHomeAsUpEnabled(true); // this sets the button to the    back icon
           actionBar.setHomeButtonEnabled(true); // makes it clickable
           actionBar.setHomeAsUpIndicator(R.drawable.ic_drawer);// set your own icon
        

        希望对你有帮助!

        【讨论】:

        • 也许可以稍微扩展一下您认为这会对提问的人有所帮助的原因?
        • 对不起,他们希望显示汉堡包图标,而我更改它的方式是使用上面的代码。请阅读代码旁边的 cmets。这可以帮助那些被导航抽屉上的后退图标卡住的人。
        • 如何在工具栏中显示可绘制的汉堡包,而不将工具栏设为操作栏?
        【解决方案9】:

        你可以简单地使用这个:

        // Defer code dependent on restoration of previous instance state.
        mDrawerLayout.post(new Runnable() {
            @Override
            public void run() {
                mDrawerToggle.syncState();
                getActionBar().setHomeAsUpIndicator(R.drawable.ic_drawer);
            }
        });
        

        【讨论】:

        • 删除 mDrawerToggle.syncState() 之后的代码,一切顺利。
        【解决方案10】:

        确保你打电话

        mDrawerToggle.syncState();

        调用后

        getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
        getSupportActionBar().setHomeButtonEnabled(true); 
        

        【讨论】:

        • 是否可以在不将工具栏设置为操作栏的情况下显示汉堡可绘制对象?
        【解决方案11】:

        这对我有用。我扩展了 AppCompatActivity 而不是 ActionBarActivity。

        mActionBarDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,null, R.string.drawer_opened, R.string.drawer_closed) {
            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                if( getSupportActionBar()!= null)
                getSupportActionBar().setTitle(R.string.drawer_opened);
                mActionBarDrawerToggle.syncState();
            }
        
            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);
                if(getSupportActionBar() != null)
                    getSupportActionBar().setTitle(R.string.drawer_closed);
                    mActionBarDrawerToggle.syncState();
        
            }
        };
        

        【讨论】:

          【解决方案12】:

          单击操作栏菜单时未显示导航抽屉。这为我解决了问题。

             @Override
              public boolean onOptionsItemSelected(MenuItem item) {
                  if (mDrawerToggle.onOptionsItemSelected(item)) {
                      return true;
                  }
                //add your switch statement
          
          
                  return super.onOptionsItemSelected(item);
              }
          

          【讨论】:

            【解决方案13】:

            我也遇到了类似的问题,就我而言,问题是, 启动 actionbartoggle 时, 我没有传递有效的工具栏参数(工具栏稍后被初始化), 如果没有适当的非空工具栏,ActionBarToggle 将无法创建汉堡图标。

            actionBarToggle = ActionBarDrawerToggle(this, mDrawer, toolbar, 
            R.string.drawer_open, R.string.drawer_close);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-02-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多