【问题标题】:Control the Toolbar icon with NavigationDrawer使用 NavigationDrawer 控制工具栏图标
【发布时间】:2014-11-28 11:03:53
【问题描述】:

我目前在我的应用程序中使用 android.support.v7.widget.Toolbarandroid.support.v4.widget.DrawerLayout。一切正常,但有一点我想改变它的行为。

当我打开抽屉时,整个抽屉占据了space of the Toolbar。工具栏最好保持在顶部,就像在 Google Music app 中一样。我怎样才能做到这一点?

但最重要的不是前者。 At first, the icon which is loaded in the application is the three stripped one。我意识到打开抽屉后,图标变成了一个箭头。加载片段后,箭头仍作为工具栏图标保留在那里,即使我按下回直到第一个屏幕。如何避免打开抽屉后出现箭头?我想手动更改此图标,特别是在我加载较低级别的片段时。

感谢您的帮助!

代码:

public class HomeActivity extends BaseActivity {



...

    private DrawerLayout mDrawer;
    private ActionBarDrawerToggle mDrawerToggle;
    private ListView mDrawerList;
    private ListView mDrawerRightList;
    private RelativeLayout mDrawerRelativeLayout;
    private String[] mDrawerMenuTitles;
    private Toolbar mToolbar;

    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        mDrawerMenuTitles = getResources().getStringArray(R.array.main_menu_options);

        mDrawer = (DrawerLayout) findViewById(R.id.drawer);

        mDrawerRelativeLayout = (RelativeLayout) findViewById(R.id.theDrawerRelativeLayout);

        mDrawer.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);

        mDrawerRightList = (ListView) findViewById(R.id.theDrawerRight);
        mDrawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, mDrawerRightList);

        mDrawerList = (ListView) findViewById(R.id.theDrawer);

        mDrawerList.setAdapter(new ArrayAdapter<String>(
                getSupportActionBar().getThemedContext(), 
                R.layout.drawer_list_item,
                mDrawerMenuTitles
        ));

        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

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

        setmToolbar((Toolbar) findViewById(R.id.toolbar));

        mDrawerToggle = new ActionBarDrawerToggle(
                this, 
                mDrawer,
                mToolbar,
                R.string.drawer_open, 
                R.string.drawer_close){

            @Override
            public void onDrawerSlide(View drawerView, float slideOffset) {
                // TODO Auto-generated method stub
                super.onDrawerSlide(drawerView, slideOffset);
            }

            @Override
            public void onDrawerClosed(View view) {
                super.onDrawerClosed(view);
                //getSupportActionBar().setTitle(CURRENT_FRAGMENT);
            }

            /** Called when a drawer has settled in a completely open state. */
            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                //getSupportActionBar().setTitle("Configuración");
            }           

        };

        mDrawerToggle.setDrawerIndicatorEnabled(true);
        mDrawerToggle.syncState();
        mDrawer.setDrawerListener(mDrawerToggle);

        setToolbarSubtitle(getString(R.string.misrutas_titulo));

        initialisePreferences(savedInstanceState);

        if (savedInstanceState == null) {
            replaceFragment(DEFAULT_FRAGMENT);
        }

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                mDrawer.openDrawer(GravityCompat.START);
                return true;
        }

        return super.onOptionsItemSelected(item);
    }

     private class DrawerItemClickListener implements OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            //selectItem(position);
            final int thePos = position;
            mDrawer.setDrawerListener( new DrawerLayout.SimpleDrawerListener(){
                @Override
                public void onDrawerClosed(View drawerView){
                ....
                }
            });

            if(mDrawer.isDrawerOpen(GravityCompat.START))
                mDrawer.closeDrawer(mDrawerRelativeLayout);

        }
    }

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

    @Override
    public void onBackPressed(){
        setToolbarSubtitle(getString(R.string.app_name_subtitle));
      if (getSupportFragmentManager().getBackStackEntryCount() == 1){
        finish();
      }
      else {
        super.onBackPressed();
      }
    }

    private void replaceFragment (String to){

        if(!to.equalsIgnoreCase(CURRENT_FRAGMENT)){
            CURRENT_FRAGMENT = to;
            Fragment fragment = Fragment.instantiate(HomeActivity.this, to);
            String backStateName =  fragment.getClass().getName();
            String fragmentTag = backStateName;

            FragmentManager manager = getSupportFragmentManager();
            boolean fragmentPopped = manager.popBackStackImmediate (backStateName, 0);

            if (!fragmentPopped && manager.findFragmentByTag(fragmentTag) == null){ //fragment not in back stack, create it.
                FragmentTransaction ft = manager.beginTransaction();
                ft.replace(R.id.content_frame, fragment, fragmentTag);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                ft.addToBackStack(backStateName);
                ft.commit();
            } 

        }

    }

    //More methods
    ....

}

编辑:

我已经能够稍微修改我的布局,以便工具栏保持在其余屏幕(抽屉和片段)的顶部。但我无法控制图标。当我打开抽屉时,汉堡图标变成了箭头。当我关上抽屉时,箭头变成了汉堡包。但是当我按下抽屉中的一个选项时,一个新的片段会膨胀,并且汉堡图标被箭头替换,直到应用程序关闭,所以汉堡图标永远不会看到。

如何调整图标行为,以便在单击抽屉选项时它不会从汉堡包变为箭头?

【问题讨论】:

    标签: android android-fragments icons navigation-drawer android-toolbar


    【解决方案1】:

    现在我尝试做一个与您类似的导航抽屉... 基本上尊重我的是,我有一个不同的导航抽屉包,我认为这与你的导航抽屉不同......我的包是:

     //From android studio
     compile 'com.android.support:appcompat-v7:21.0.0'
    

    我不知道这是否可以帮助你,但我遵循这个最棒的教程,我的导航抽屉工作就像你希望的那样!

    http://androideity.com/2013/12/16/android-navigation-drawer-parte-1/ http://androideity.com/2014/02/26/android-navigation-drawer-parte-2/

    我等着我帮你!祝你好运!

    PD:如果您对本教程有任何疑问或同样的建议! :D

    【讨论】:

    • 我明白你的意思,但在该示例中使用的库是 v4 ActionBar,目前我正在使用新的 v7,其中包含全新的工具栏。无论如何,我会按照本指南进行调整。
    • 是的,我在本指南中使用了我的 customActionBar,感谢您的意见,祝您好运!
    • 考虑使用新的工具栏和新的 v7 库升级您的应用程序 :)
    【解决方案2】:

    乍一看,您似乎在每次选择项目时都在设置新的抽屉侦听器,正是在这个 sn-p 中:

     private class DrawerItemClickListener implements OnItemClickListener {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //selectItem(position);
                final int thePos = position;
                mDrawer.setDrawerListener( new DrawerLayout.SimpleDrawerListener(){
                    @Override
                    public void onDrawerClosed(View drawerView){
                    ....
                    }
                });
    
                if(mDrawer.isDrawerOpen(GravityCompat.START))
                    mDrawer.closeDrawer(mDrawerRelativeLayout);
    
            }
        }
    

    这个 sn-p 替换了 ActionBarDrawerToggle(它也实现了 DrawerListener),因此不会调用控制图标的 ActionBarDrawerToggle。

    How can I adapt the icon behaviour so that it doesn't change from hamburger to arrow when I click over a drawer option?

    关于你之前的陈述,这对我来说听起来很模糊。为什么要阻止这种默认行为?您可以通过不在DrawerListener 的方法中调用超级调用来防止变形。

    【讨论】:

    • 通过说“防止其默认行为”我的意思是,如果单击一个仅加载新片段的选项,防止汉堡图标被箭头替换,更准确地说,只是替换开始新活动时的箭头。我现在解释正确了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    相关资源
    最近更新 更多