开/关抽屉和后退按钮之间的Andr​​oid棒棒糖工具栏开关 [英] Android lollipop toolbar switch between open/close drawer and back button

查看:242
本文介绍了开/关抽屉和后退按钮之间的Andr​​oid棒棒糖工具栏开关的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有非标准的导航抽屉里,但现在我试图修改它,使用工具栏。

此前我的code样子: MainActivity.java

  @覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);

    Log.v(主,创建);
    initViews();
    setListeners();

    getFragmentManager()。addOnBackStackChangedListener(新FragmentManager.OnBackStackChangedListener(){
        @覆盖
        公共无效onBackStackChanged(){
            shouldDisplayHomeUp();
        }
    });

    mNavigationDrawerFragment =(NavigationDrawerFragment)
            。getFragmentManager()findFragmentById(R.id.navigation_drawer);
    mTitle =的getTitle();

    //设置抽屉。
    mNavigationDrawerFragment.setUp(
            R.id.navigation_drawer,
            (DrawerLayout)findViewById(R.id.drawer_layout));
}
 

NavigationDrawerFragment.java

 公共无效设置(INT fragmentId,DrawerLayout drawerLayout){
    mFragmentContainerView = getActivity()findViewById(fragmentId)。
    mDrawerLayout = drawerLayout;

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

    ((MainActivity)getActivity())getSupportActionBar()setDisplayHomeAsUpEnabled(真)。;
    ((MainActivity)getActivity())getSupportActionBar()setHomeButtonEnabled(真)。;

    mDrawerToggle =新ActionBarDrawerToggle(getActivity(),mDrawerLayout,
            ((MainActivity)getActivity())。getToolbar(),
            R.string.navigation_drawer_open,
            R.string.navigation_drawer_close){
        @覆盖
        公共无效onDrawerClosed(查看drawerView){
            super.onDrawerClosed(drawerView);
            如果(!isAdded()){
                返回;
            }

            。getActivity()invalidateOptionsMenu();在prepareOptionsMenu //调用()
        }

        @覆盖
        公共无效onDrawerOpened(查看drawerView){
            super.onDrawerOpened(drawerView);
            如果(!isAdded()){
                返回;
            }

            如果(!mUserLearnedDrawer){
                //用户手动打开抽屉;该标志存储prevent自动显示
                //在未来导航自动抽屉。
                mUserLearnedDrawer = TRUE;
                共享preferences SP = preferenceManager
                        .getDefaultShared preferences(getActivity());
                。sp.edit()putBoolean(preF_USER_LEARNED_DRAWER,真)。适用();
            }
            如果(mDrawerListView!= NULL){

            }
            。getActivity()invalidateOptionsMenu();在prepareOptionsMenu //调用()
        }

        @覆盖
        公共无效onDrawerSlide(查看drawerView,浮slideOffset){
            super.onDrawerSlide(drawerView,slideOffset);
        }
    };

    //如果用户没有学习关于抽屉,打开它,给他们介绍的抽屉里,
    //每导航抽屉式设计的指导方针。
    如果(mUserLearnedDrawer&安培;!&安培;!mFromSavedInstanceState){
        mDrawerLayout.openDrawer(mFragmentContainerView);
    }

    //推迟code依赖于恢复previous实例状态。

    mDrawerToggle.setDrawerIndicatorEnabled(真正的);

    mDrawerLayout.post(新的Runnable(){
        @覆盖
        公共无效的run(){
            mDrawerToggle.syncState();
        }
    });

    mDrawerLayout.setDrawerListener(mDrawerToggle);
}
 

现在我修改了code: MainActivity.java

  @覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);

    mToolbar =(工具栏)findViewById(R.id.toolbar);

    如果(mToolbar!= NULL){
        setSupportActionBar(mToolbar);
        getSupportActionBar()setDisplayHomeAsUpEnabled(真)。
    }

    initViews();
    setListeners();

    mNavigationDrawerFragment =(NavigationDrawerFragment)
            。getFragmentManager()findFragmentById(R.id.navigation_drawer);
    mTitle =的getTitle();

    //设置抽屉。
    mNavigationDrawerFragment.setUp(
            R.id.navigation_drawer,
            (DrawerLayout)findViewById(R.id.drawer_layout));


    shouldDisplayHomeUp();

    getFragmentManager()。addOnBackStackChangedListener(新FragmentManager.OnBackStackChangedListener(){
        @覆盖
        公共无效onBackStackChanged(){
            mBackCount ++;
            shouldDisplayHomeUp();
        }
    });
}
 

NavigationDrawerFragment.java

 公共无效设置(INT fragmentId,DrawerLayout drawerLayout){
    mFragmentContainerView = getActivity()findViewById(fragmentId)。
    mDrawerLayout = drawerLayout;

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

    mDrawerToggle =新ActionBarDrawerToggle(getActivity(),mDrawerLayout,
            ((MainActivity)getActivity())。getToolbar(),
            R.string.navigation_drawer_open,
            R.string.navigation_drawer_close){
        @覆盖
        公共无效onDrawerClosed(查看drawerView){
            super.onDrawerClosed(drawerView);
            如果(!isAdded()){
                返回;
            }

            。getActivity()invalidateOptionsMenu();在prepareOptionsMenu //调用()
        }

        @覆盖
        公共无效onDrawerOpened(查看drawerView){
            super.onDrawerOpened(drawerView);
            如果(!isAdded()){
                返回;
            }

            如果(!mUserLearnedDrawer){
                //用户手动打开抽屉;该标志存储prevent自动显示
                //在未来导航自动抽屉。
                mUserLearnedDrawer = TRUE;
                共享preferences SP = preferenceManager
                        .getDefaultShared preferences(getActivity());
                。sp.edit()putBoolean(preF_USER_LEARNED_DRAWER,真)。适用();
            }
            如果(mDrawerListView!= NULL){

            }
            。getActivity()invalidateOptionsMenu();在prepareOptionsMenu //调用()
        }

        @覆盖
        公共无效onDrawerSlide(查看drawerView,浮slideOffset){
            super.onDrawerSlide(drawerView,slideOffset);
        }
    };

    //如果用户没有学习关于抽屉,打开它,给他们介绍的抽屉里,
    //每导航抽屉式设计的指导方针。
    如果(mUserLearnedDrawer&安培;!&安培;!mFromSavedInstanceState){
        mDrawerLayout.openDrawer(mFragmentContainerView);
    }

    //推迟code依赖于恢复previous实例状态。

    mDrawerToggle.setDrawerIndicatorEnabled(真正的);

    mDrawerLayout.post(新的Runnable(){
        @覆盖
        公共无效的run(){
            mDrawerToggle.syncState();
        }
    });

    mDrawerLayout.setDrawerListener(mDrawerToggle);
}
 

shouldDisplayHomeUp 功能:

 公共无效shouldDisplayHomeUp(){
    布尔canBack = getFragmentManager()getBackStackEntryCount()> 0;
    mNavigationDrawerFragment.getDrawerToggle()setDrawerIndicatorEnabled。(canBack!);
}
 

但后退箭头不显示

我试图调用

  getSupportActionBar()setDisplayHomeAsUpEnabled(canBack)。
getSupportActionBar()setHomeButtonEnabled(canBack)。
 

于是后退箭头appers但点击它没有任何效果

解决方案

从文档:

  

要允许向上导航与操作栏中的应用程序图标,通话   setDisplayHomeAsUpEnabled():

  @覆盖公共无效的onCreate(包savedInstanceState){
     ...
     getActionBar()setDisplayHomeAsUpEnabled(真)。 }
 

  

这增加了一个向左的插入符号旁边的应用程序图标,它能够作为一个行动   按钮,使得当用户presses它,你的活动接收   来电onOptionsItemSelected()。在操作中的ID   android.R.id.home。

这意味着你将不得不执行你的背部程序上<​​code> onOptionsItemSelected 和检查 R.id.home 。为了避免调用程序,当你点击汉堡包菜单检查 canback 太上 onOptionsItemSelected

<一个href="http://developer.android.com/training/implementing-navigation/ancestral.html#up">http://developer.android.com/training/implementing-navigation/ancestral.html#up

修改

要archieve你想你将不得不实现自己的导航程序是什么。

  mToolbar.setNavigationOnClickListener(新View.OnClickListener(){
        @覆盖
        公共无效的onClick(视图v){
            如果(shouldBack()){
               //调用onback pressed什么
                如果(displayBackAgain)
                    返回;经过这么你不叫syncState //返回();
            }否则,如果(mNavigationDrawerFragment.isDrawerOpen())
                mNavigationDrawerFragment.closeDrawer();
            其他
                mNavigationDrawerFragment.openDrawer();
            。mNavigationDrawerFragment.getActionBarDrawerToggle()syncState();
        }
    });
}
 

要启用后退按钮图标,只需拨打 getSupportActionBar()setDisplayHomeAsUpEnabled(真); 来禁用它就叫 mNavigationDrawerFragment.getActionBarDrawerToggle()syncState。 ();

I had standart navigation drawer, but now i'm trying to modify it, using toolbar.

Earlier my code looked like: MainActivity.java

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

    Log.v("MAIN", "CREATE");
    initViews();
    setListeners();

    getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            shouldDisplayHomeUp();
        }
    });

    mNavigationDrawerFragment = (NavigationDrawerFragment)
            getFragmentManager().findFragmentById(R.id.navigation_drawer);
    mTitle = getTitle();

    // Set up the drawer.
    mNavigationDrawerFragment.setUp(
            R.id.navigation_drawer,
            (DrawerLayout) findViewById(R.id.drawer_layout));
}

NavigationDrawerFragment.java

public void setUp(int fragmentId, DrawerLayout drawerLayout) {
    mFragmentContainerView = getActivity().findViewById(fragmentId);
    mDrawerLayout = drawerLayout;

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

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

    mDrawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawerLayout,
            ((MainActivity) getActivity()).getToolbar(),
            R.string.navigation_drawer_open,
            R.string.navigation_drawer_close) {
        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);
            if (!isAdded()) {
                return;
            }

            getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
        }

        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            if (!isAdded()) {
                return;
            }

            if (!mUserLearnedDrawer) {
                // The user manually opened the drawer; store this flag to prevent auto-showing
                // the navigation drawer automatically in the future.
                mUserLearnedDrawer = true;
                SharedPreferences sp = PreferenceManager
                        .getDefaultSharedPreferences(getActivity());
                sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).apply();
            }
            if (mDrawerListView != null) {

            }
            getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
        }

        @Override
        public void onDrawerSlide(View drawerView, float slideOffset) {
            super.onDrawerSlide(drawerView, slideOffset);
        }
    };

    // If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer,
    // per the navigation drawer design guidelines.
    if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
        mDrawerLayout.openDrawer(mFragmentContainerView);
    }

    // Defer code dependent on restoration of previous instance state.

    mDrawerToggle.setDrawerIndicatorEnabled(true);

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

    mDrawerLayout.setDrawerListener(mDrawerToggle);
}

Now i modified my code: MainActivity.java

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

    mToolbar = (Toolbar) findViewById(R.id.toolbar);

    if (mToolbar != null) {
        setSupportActionBar(mToolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    initViews();
    setListeners();

    mNavigationDrawerFragment = (NavigationDrawerFragment)
            getFragmentManager().findFragmentById(R.id.navigation_drawer);
    mTitle = getTitle();

    // Set up the drawer.
    mNavigationDrawerFragment.setUp(
            R.id.navigation_drawer,
            (DrawerLayout) findViewById(R.id.drawer_layout));


    shouldDisplayHomeUp();

    getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            mBackCount++;
            shouldDisplayHomeUp();
        }
    });
}

NavigationDrawerFragment.java

public void setUp(int fragmentId, DrawerLayout drawerLayout) {
    mFragmentContainerView = getActivity().findViewById(fragmentId);
    mDrawerLayout = drawerLayout;

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

    mDrawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawerLayout,
            ((MainActivity) getActivity()).getToolbar(),
            R.string.navigation_drawer_open,
            R.string.navigation_drawer_close) {
        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);
            if (!isAdded()) {
                return;
            }

            getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
        }

        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            if (!isAdded()) {
                return;
            }

            if (!mUserLearnedDrawer) {
                // The user manually opened the drawer; store this flag to prevent auto-showing
                // the navigation drawer automatically in the future.
                mUserLearnedDrawer = true;
                SharedPreferences sp = PreferenceManager
                        .getDefaultSharedPreferences(getActivity());
                sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).apply();
            }
            if (mDrawerListView != null) {

            }
            getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
        }

        @Override
        public void onDrawerSlide(View drawerView, float slideOffset) {
            super.onDrawerSlide(drawerView, slideOffset);
        }
    };

    // If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer,
    // per the navigation drawer design guidelines.
    if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
        mDrawerLayout.openDrawer(mFragmentContainerView);
    }

    // Defer code dependent on restoration of previous instance state.

    mDrawerToggle.setDrawerIndicatorEnabled(true);

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

    mDrawerLayout.setDrawerListener(mDrawerToggle);
}

And shouldDisplayHomeUp function:

public void shouldDisplayHomeUp (){
    boolean canBack = getFragmentManager().getBackStackEntryCount() > 0;
    mNavigationDrawerFragment.getDrawerToggle().setDrawerIndicatorEnabled(!canBack);
}

But the back arrow is not shown

I tried call

getSupportActionBar().setDisplayHomeAsUpEnabled(canBack);
getSupportActionBar().setHomeButtonEnabled(canBack);

So the back arrow appers but clicking on it has no effect

解决方案

From the docs:

To allow Up navigation with the app icon in the action bar, call setDisplayHomeAsUpEnabled():

@Override public void onCreate(Bundle savedInstanceState) {
     ...
     getActionBar().setDisplayHomeAsUpEnabled(true); }

This adds a left-facing caret alongside the app icon and enables it as an action button such that when the user presses it, your activity receives a call to onOptionsItemSelected(). The ID for the action is android.R.id.home.

This means that you will have to implement your back routine on onOptionsItemSelected and check for R.id.home. To avoid calling the routine when you click on the hamburger menu check for canback too on onOptionsItemSelected.

http://developer.android.com/training/implementing-navigation/ancestral.html#up

EDIT

To archieve what you want you will have to implement your own navigation routine.

    mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(shouldBack()) {
               //call onbackpressed or something
                if(displayBackAgain)
                    return; //return after so you don't call syncState();       
            }else if (mNavigationDrawerFragment.isDrawerOpen())
                mNavigationDrawerFragment.closeDrawer();
            else
                mNavigationDrawerFragment.openDrawer();
            mNavigationDrawerFragment.getActionBarDrawerToggle().syncState();
        }
    });
}

To enable the backbutton icon just call getSupportActionBar().setDisplayHomeAsUpEnabled(true); to disable it just call mNavigationDrawerFragment.getActionBarDrawerToggle().syncState();

这篇关于开/关抽屉和后退按钮之间的Andr​​oid棒棒糖工具栏开关的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆