【问题标题】:How to change drawer toggle icon on Android apps?如何更改 Android 应用程序上的抽屉切换图标?
【发布时间】:2017-08-21 17:39:50
【问题描述】:

我在我的安卓应用上创建了一个抽屉开关。它显示在屏幕的左上角。当我单击切换时,列表视图项目将显示在左侧。 下面的屏幕是主屏幕:

当我点击切换时,它将显示如下:

现在我想通过以下代码更改切换按钮的图标:

mDrawerToggle.setHomeAsUpIndicator(R.drawable.ic_drawer);
mDrawerToggle.setDrawerIndicatorEnabled(false);

切换图标已更改为我的可绘制对象,但当我单击切换时不会显示列表视图项。我想知道为什么更改切换图标会禁用切换点击。

下面是我的活动课:

public class MainActivity extends AppCompatActivity {
    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;
    private String[] mPlanetTitles;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
        getSupportActionBar().setDisplayShowTitleEnabled(false);

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

        mDrawerList = (ListView) findViewById(R.id.left_drawer);
        mPlanetTitles = getResources().getStringArray(R.array.planets_array);
        // Set the adapter for the list view
        mDrawerList.setAdapter(new ArrayAdapter<String>(this,
                R.layout.drawer_list_item, mPlanetTitles));
        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

        mDrawerToggle = new ActionBarDrawerToggle(
                this,                  /* host Activity */
                mDrawerLayout,
                R.string.drawer_open,  /* "open drawer" description for accessibility */
                R.string.drawer_close  /* "close drawer" description for accessibility */
        ) {
            public void onDrawerClosed(View view) {
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }

            public void onDrawerOpened(View drawerView) {
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
        };
        mDrawerToggle.setHomeAsUpIndicator(R.drawable.ic_drawer);
//        mDrawerToggle.setDrawerIndicatorEnabled(false);
        mDrawerLayout.addDrawerListener(mDrawerToggle);
    }

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

    @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);
    }


    /* 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) {
        }
    }
}

【问题讨论】:

    标签: android


    【解决方案1】:

    v7 ActionBarDrawerToggle 实际上只做两件事:打开/关闭抽屉,提供汉堡图标及其动画。调用 setDrawerIndicatorEnabled(false) 将删除它的图标,但它也会禁用切换。如果你不想要那个图标,那么你最好不要使用ActionBarDrawerToggle,而是自己处理打开/关闭抽屉。

    • 首先,删除ActionBarDrawerToggle 的所有代码。
    • 然后使用getSupportActionBar().setHomeAsUpIndicator() 设置您想要的图标。
    • onOptionsItemSelected() 中,如果MenuItem 的ID 为android.R.id.home,则根据需要打开或关闭抽屉。
    • 最后,ActionBarDrawerToggleDrawerLayout.DrawerListener 功能可以替换为基本的SimpleDrawerListener

    public class MainActivity extends AppCompatActivity {
        private DrawerLayout mDrawerLayout;
        private ListView mDrawerList;
        private String[] mPlanetTitles;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setDisplayShowTitleEnabled(false);
    
            mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    
            mDrawerList = (ListView) findViewById(R.id.left_drawer);
            mPlanetTitles = getResources().getStringArray(R.array.planets_array);
            // Set the adapter for the list view
            mDrawerList.setAdapter(new ArrayAdapter<String>(this,
                R.layout.drawer_list_item, mPlanetTitles));
            mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
    
            // *** Set your desired icon
            getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_drawer);
    
            // *** Replace the DrawerListener functionality of the ActionBarDrawerToggle
            mDrawerLayout.addDrawerListener(new DrawerLayout.SimpleDrawerListener() {
                    @Override
                    public void onDrawerClosed(View view) {
                        invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
                    }
    
                    @Override
                    public void onDrawerOpened(View drawerView) {
                        invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
                    }
                }
            );
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // *** If the home button is clicked, open/close the drawer as needed
            if (item.getItemId() == android.R.id.home) {
                if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
                    mDrawerLayout.closeDrawer(GravityCompat.START);
                }
                else {
                    mDrawerLayout.openDrawer(GravityCompat.START);
                }
    
                return true;
            }
    
            return super.onOptionsItemSelected(item);
        }
    
        @Override
        protected void onPostCreate(Bundle savedInstanceState) {
            super.onPostCreate(savedInstanceState);
        }
    
        @Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
        }
    
        /* 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) {
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      更改切换按钮的图标后使用syncState()

      mDrawerToggle.setHomeAsUpIndicator(R.drawable.ic_drawer);
      mDrawerToggle.setDrawerIndicatorEnabled(false);
      mDrawerToggle.syncState();
      

      【讨论】:

      • 添加此代码后,可以更改图标,但单击该图标不会使列表视图项目显示在左侧。我看到 Mike 回答我的问题,说 ActionBarDrawerToggle 不支持更改图标。可能我需要一种不同的方法
      • @ZhaoYi ActionBarDrawerToggle 确实允许您在一定程度上更改图标。但是,您设置的图标必须是 DrawerArrowDrawable 子类,这可能不是您想要的。如果您仍然需要解决方案,我可以在上面的评论中发布我建议的示例。
      • @MikeM。演示代码真的很有帮助。如果对您来说不难,请发布一个示例。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多