【问题标题】:Android-switching navigation burger icon to back iconAndroid-switching navigation burger icon to back icon
【发布时间】:2018-08-14 18:08:33
【问题描述】:

我已经实现了本教程中的导航抽屉:https://www.journaldev.com/9958/android-navigation-drawer-example-tutorial

这里的问题是如何更改 Fragment 中的 ActionBar,所以当我转到 Fragment 时,它会在 ActionBar 上显示后退箭头而不是汉堡图标,当单击后退箭头图标时,它将离开片段并且 ActionBar 应该回到第一个状态。

【问题讨论】:

    标签: android navigation-drawer


    【解决方案1】:

    您需要在打开片段时更改抽屉切换的图标。当用户从片段中单击返回按钮时,弹出堆栈并将支持操作栏指示器重置为汉堡包。您可能需要覆盖

    onSupportNavigateUp()

    如果后退按钮不起作用,则在您的活动中使用方法

     @Override
    public boolean onSupportNavigateUp() {
        onBackPressed();
        return true;
    }
    

    祝你好运。

    编辑

    这是实现您需要的行为的示例代码。

    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.view.GravityCompat;
    import android.support.v4.widget.DrawerLayout;
    import android.support.v7.app.ActionBarDrawerToggle;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.support.v7.widget.Toolbar;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ListView;
    
    public class MainActivity extends AppCompatActivity {
        private String[] mNavigationDrawerItemTitles;
        private DrawerLayout mDrawerLayout;
        private ListView mDrawerList;
        Toolbar toolbar;
        private CharSequence mTitle;
        ActionBarDrawerToggle mDrawerToggle;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mTitle = getTitle();
            mNavigationDrawerItemTitles= getResources().getStringArray(R.array.navigation_drawer_items_array);
            mDrawerLayout = findViewById(R.id.drawer_layout);
            mDrawerList = findViewById(R.id.left_drawer);
    
            setupToolbar();
    
            DataModel[] drawerItem = new DataModel[2];
    
            drawerItem[0] = new DataModel(R.drawable.ic_menu_camera, "Connect");
            drawerItem[1] = new DataModel(R.drawable.ic_menu_gallery, "Fixtures");
    
            DrawerItemCustomAdapter adapter = new DrawerItemCustomAdapter(this, R.layout.list_view_item_row, drawerItem);
            mDrawerList.setAdapter(adapter);
            mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
            mDrawerLayout =  findViewById(R.id.drawer_layout);
            setupDrawerToggle();
        }
    
        private class DrawerItemClickListener implements ListView.OnItemClickListener {
    
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                selectItem(position);
            }
    
        }
    
        private void selectItem(int position) {
    
            Fragment fragment = null;
    
            switch (position) {
                case 0:
                    fragment = new TestFragment();
                    break;
                case 1:
                    fragment = new TestFragment2();
                    break;
                default:
                    break;
            }
    
            if (fragment != null) {
                FragmentManager fragmentManager = getSupportFragmentManager();
                fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).addToBackStack(fragment.getTag()).commit();
                mDrawerList.setItemChecked(position, true);
                mDrawerList.setSelection(position);
                setTitle(mNavigationDrawerItemTitles[position]);
                showBackButton(true);
                mDrawerLayout.closeDrawer(mDrawerList);
    
            }
        }
    
        @Override
        public void setTitle(CharSequence title) {
            mTitle = title;
            getSupportActionBar().setTitle(mTitle);
        }
    
        void setupToolbar(){
            toolbar = findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            getSupportActionBar().setDisplayShowHomeEnabled(true);
            getSupportActionBar().setDisplayHomeAsUpEnabled(false);
            getSupportActionBar().setHomeButtonEnabled(true);
        }
    
        void setupDrawerToggle(){
            mDrawerToggle = new android.support.v7.app.ActionBarDrawerToggle(this,mDrawerLayout,toolbar,R.string.app_name, R.string.app_name);
            //This is necessary to change the icon of the Drawer Toggle upon state change.
            mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if(mDrawerToggle.isDrawerIndicatorEnabled()){
                       mDrawerLayout.openDrawer(GravityCompat.START);
                    }else{
                        onBackPressed();
                    }
                }
            });
            mDrawerLayout.addDrawerListener(mDrawerToggle);
            mDrawerToggle.syncState();
        }
    
        public void showBackButton(boolean isBack){
            mDrawerToggle.setDrawerIndicatorEnabled(!isBack);
            getSupportActionBar().setDisplayHomeAsUpEnabled(isBack);
            mDrawerToggle.syncState();
        }
    
        @Override
        public void onBackPressed() {
            if(mDrawerLayout.isDrawerOpen(GravityCompat.START)){
                mDrawerLayout.closeDrawer(GravityCompat.START);
            }else{
                FragmentManager fm = getSupportFragmentManager();
                if (fm.getBackStackEntryCount() > 0) {
                    fm.popBackStack();
                } else {
                    super.onBackPressed();
                }
                showBackButton(false);
                setTitle(getTitle());
            }
        }
    
        @Override
        public boolean onSupportNavigateUp() {
            onBackPressed();
            return true;
        }
    }
    

    检查onBackPressed()showBackButton()setupDrawerToggle 方法。

    【讨论】:

    • 如果您不是我的,请提供更多信息。
    • @AnuCute 你能告诉我你需要澄清什么吗?
    • 我必须在哪里实现 showBackButton() 方法?在片段或主要活动中?
    • @AnuCute 您必须在您的活动中实现该方法并在打开您的片段后调用它。 onSupportNavigateUp 也将在您的活动中。当用户按下返回按钮时,您必须通过代码将图标改回汉堡包并启用抽屉。
    • 非常感谢,它正在工作,但是在单击片段的后退按钮时出现问题,它重定向到片段抽屉列表而不是主页如何实现它?
    猜你喜欢
    • 2021-02-17
    • 2011-08-21
    • 2011-07-30
    • 2018-01-16
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    相关资源
    最近更新 更多