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

标签 android android-fragments android-actionbar navigation-drawer

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

详情请看这里:http://youtu.be/F5COhlbpIbY

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

在创建较低级别的 fragment 时,我可以调用 ActionBarDrawerToggle setDrawerIndicatorEnabled(false) 来隐藏 Navigation Drawer 图像并显示 Up caret

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();

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


解决方案

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

主要 Activity

此 Activity 控制应用中的所有 fragment 。

在准备新 fragment 替换其他 fragment 时,我将 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 的 fragment 中:

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 中,每当按下 < 时,它都会从 Activity 中调用 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;
        … 
    }

最佳答案

就像 1-2-3 一样简单。

如果你想达到:

1) Drawer Indicator - 当 Back Stack 中没有 fragment 或 Drawer 已打开时

2) 箭头 - 当一些 Fragment 在 Back Stack 中时

private FragmentManager.OnBackStackChangedListener
        mOnBackStackChangedListener = new FragmentManager.OnBackStackChangedListener() {
    @Override
    public void onBackStackChanged() {
        syncActionBarArrowState();
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    getSupportActionBar().setDisplayShowHomeEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    mDrawerToggle = new ActionBarDrawerToggle(
            this,             
            mDrawerLayout,  
            R.drawable.ic_navigation_drawer, 
            0, 
            0  
    ) {

        public void onDrawerClosed(View view) {
            syncActionBarArrowState();
        }

        public void onDrawerOpened(View drawerView) {
            mDrawerToggle.setDrawerIndicatorEnabled(true);
        }
    };

    mDrawerLayout.setDrawerListener(mDrawerToggle);
    getSupportFragmentManager().addOnBackStackChangedListener(mOnBackStackChangedListener);
}

@Override
protected void onDestroy() {
    getSupportFragmentManager().removeOnBackStackChangedListener(mOnBackStackChangedListener);
    super.onDestroy();
}

private void syncActionBarArrowState() {
    int backStackEntryCount = 
        getSupportFragmentManager().getBackStackEntryCount();
    mDrawerToggle.setDrawerIndicatorEnabled(backStackEntryCount == 0);
}

3) 两个指标根据自己的形状来行动

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (mDrawerToggle.isDrawerIndicatorEnabled() && 
        mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    } else if (item.getItemId() == android.R.id.home && 
               getSupportFragmentManager().popBackStackImmediate()) {
        return true;
    } else {
        return super.onOptionsItemSelected(item);
    }
}

附:见 Creating a Navigation Drawer on Android Developers关于 3 线指标行为的其他提示。

关于android - 使用 fragment 时在 Android 抽屉导航图像和向上插入符号之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17258020/

相关文章:

android - 操作栏中的 ShareActionProvider 图标

android - ActionBar 选项卡 - 用详细信息 fragment 替换列表 fragment

android - onChildDraw 使项目闪烁

java - 如何为 Android 动态壁纸创 build 置 Activity

android - PACKAGE_ADDED BroadcastReceiver 不起作用

java - 如何修复 fragment 重叠?

java - AndroidPlot:LineAndPointFormatter 在传入 Context 和 Colors.xml 资源 ID 时导致崩溃

android - 共享过渡不适用于 recyclerview 到 fragment

android - 如何在 android TextView 中显示 html 特殊字符

android - 溢出菜单行自定义