小编典典

使用片段时在 Android 导航抽屉图像和向上插入符号之间切换

all

在使用 Navigation Drawer 时,Android 开发人员建议在 ActionBar 中“只有那些在 Navigation Drawer
中表示的屏幕才应该真正具有 Navigation Drawer 图像”,并且“所有其他屏幕都具有传统的 up carat”。

我正在使用一个活动来控制多个级别的片段,并且可以让导航抽屉图像在所有级别上显示和运行。

创建较低级别的片段时,我可以调用ActionBarDrawerToggle
setDrawerIndicatorEnabled(false)隐藏导航抽屉图像并显示向上插入符号

LowerLevelFragment lowFrag = new LowerLevelFragment();

//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout, 
lowFrag, "lowerFrag").addToBackStack(null).commit();

我遇到的问题是,当我导航回顶层片段时,Up 克拉仍然显示,而不是原始的 Navigation Drawer 图像。关于如何“刷新”顶级片段上的
ActionBar 以重新显示 Navigation Drawer 图像的任何建议?


解决方案

汤姆的建议对我有用。这是我所做的:

主要活动

此活动控制应用程序中的所有片段。

在准备新的片段来替换其他片段时,我将 DrawerToggle 设置为setDrawerIndicatorEnabled(false)

LowerLevelFragment lowFrag = new LowerLevelFragment();

//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout,   
lowFrag).addToBackStack(null).commit();

接下来,在覆盖中onBackPressed,我通过将 DrawerToggle
设置为这样来恢复上述内容setDrawerIndicatorEnabled(true)

@Override
public void onBackPressed() {
    super.onBackPressed();
    // turn on the Navigation Drawer image; 
    // this is called in the LowerLevelFragments
    setDrawerIndicatorEnabled(true)
}

在 LowerLevelFragments

在我修改的片段中onCreateonOptionsItemSelected如下所示:

onCreate添加以setHasOptionsMenu(true)启用配置选项菜单。还设置setDisplayHomeAsUpEnabled(true)为启用操作栏中的
<

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // needed to indicate that the fragment would 
    // like to add items to the Options Menu        
    setHasOptionsMenu(true);    
    // update the actionbar to show the up carat/affordance 
    getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
}

然后,onOptionsItemSelected每当按下 <
时,它都会从活动中调用onBackPressed()以在层次结构中向上移动一级并显示导航抽屉图像:

@Override
public boolean onOptionsItemSelected(MenuItem item) {   
    // Get item selected and deal with it
    switch (item.getItemId()) {
        case android.R.id.home:
            //called when the up affordance/carat in actionbar is pressed
            getActivity().onBackPressed();
            return true;
        ...
    }

阅读 72

收藏
2022-08-19

共1个答案

小编典典

您已经写过,要实现较低级别的片段,您将替换现有的片段,而不是在新活动中实现较低级别的片段。

我认为您将不得不手动实现后退功能:当用户按下后您有弹出堆栈的代码(例如在Activity::onBackPressed覆盖中)。因此,无论您在哪里执行此操作,都可以反转setDrawerIndicatorEnabled.

2022-08-19