4

我现在正在用这个挠我的脑袋....我有一个ActionBarActivity加载一个初始Fragment - 原始菜单在活动内膨胀。现在,我有一个导航栏,当选择一个项目时,加载一个不同的片段并将其添加到后台堆栈中。与片段/工具栏返回导航

当我做到这一点,有一对夫妇的事情,我想设置:

  1. 将家里高达指标
  2. 从主要活动
  3. 设置有选项无效选项菜单真实的片段
  4. 确保了指标正确导航回原来的片段

Someth比较奇怪的是正在进行 - 向上指示符只出现一次,并不像后退按钮一样,尽管我已经使新菜单失效并使其充满,但新菜单将附加到到原始活动菜单。

编辑:好的我解决了附加问题 - 忘记在onCreateOptionsMenu方法中添加menu.clear()

我的抽屉式导航栏布局有onClick方法,所有菜单项可能会触发另一片段的负载:

public void navItemClick(View view) { 

     switch (view.getId()) { 
      case R.id.ripSMS: 
       mNavigationDrawer.toggleHome(false); 
       getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
       FragmentTransaction mTrans = getSupportFragmentManager().beginTransaction(); 
       mTrans.replace(R.id.voiceover_frame_layout,new MessageFragment(),"main_ui") 
         .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).addToBackStack("msg").commit(); 
       break; 
      case R.id.ripEmail: 
       break; 
      case R.id.ripSettings: 
       break; 
     } 

     mNavigationDrawer.closeDrawer(); 
    } 

toggleHome:

public void toggleHome(boolean show) { 
     mDrawerToggle.setDrawerIndicatorEnabled(show); 

     if (!show) { 
      mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 
     } else { 
      mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); 
     } 
    } 

一旦项目被触发onCreate含有无效和hasOptions代码:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getActivity().invalidateOptionsMenu(); 
    setHasOptionsMenu(true); 
} 

onCreateOptionsMenu然后膨胀另一个菜单布局(包含一个称为设置的单个项目)。

如上所述,这只是部分工作一次 - 我第一次使用该项目来加载片段,我得到后面的图标,但它也不工作(这是设置在onOptionsItemSelected检查家庭项目按 - 它什么也没做)。当我按下后退按钮时,它将我带回正确的位置。但是,如果我导航回来,即使代码运行通过onCreate,现在更长的后退箭头也会显示!

回答

11

好吧,所以我设法解决这个经过一些试验和错误。两个更改时间:

  1. 实施addOnBackStackChangedListener
  2. ActionBarDrawerToggle'ssetToolbarNavigationClickListener需要设置

正如我只有一个活动(其他的一切都是碎片班),我增加了堆栈中监听到父活动的onCreate方法:

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
       getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
      } else { 
       getSupportActionBar().setDisplayHomeAsUpEnabled(false); 
      } 
     } 
    }); 

这解决了消失后退箭头goi回到片段。最后添加侦听到我的NavigationDrawer的设置类:

mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       getActivity().onBackPressed(); 
      } 
     }); 

我想我就是一切向尖使用onOptionsItemSelectedandroid.R.id.home但从来没有为我的唯一问题。这可能是我实施事情的方式,但如果有人看到任何明显的事情,为什么请让我知道!

2

这些步骤可帮助您在加载片段时显示工具栏中的按钮。点击时弹出。

setNavigationOnClickListener设置为您活动中的工具栏。

final DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    toggle = new ActionBarDrawerToggle(
      this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    drawer.setDrawerListener(toggle); 
    toggle.syncState(); 

    toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if(getSupportFragmentManager().getBackStackEntryCount() > 0){ 
       getSupportFragmentManager().popBackStack(); 
      }else { 
       drawer.openDrawer(GravityCompat.START); 
      } 
     } 
    }); 

在您的活动中执行FragmentManager.OnBackStackChangedListener活动。并与SupportFragmentManagerOnCreate()

getSupportFragmentManager().addOnBackStackChangedListener(this); 

OnBackStackChangedListener实现方法进行注册:

@Override 
public void onBackStackChanged() { 
    if(getSupportFragmentManager().getBackStackEntryCount() > 0){ 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    }else { 
     getSupportActionBar().setDisplayHomeAsUpEnabled(false); 
     toggle.syncState(); 
    } 
} 
+0

这只是其中很多的奋斗之后为我工作的解决方案。感谢分享! 调用'toggle.syncState();'是一个关键因素,否则汉堡菜单一旦返回就不可见。 – 2017-03-30 22:50:58

1

对我来说,上述回答是不够的,但我用@ Hamz4h_和挖掘到ActionBarDrawerToggle后,更增添了几分类。我打电话我的这个方法从活动的onCreate:

private void initNavigationElements() { 
    final ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      this, mBinding.drawerLayout, mBinding.appBarMain.toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    mBinding.drawerLayout.addDrawerListener(toggle); 

    // Tricking the toggle by giving it its own arrow as a custom indicator. 
    // It will use it when setDrawerIndicatorEnabled is called with false 
    toggle.setHomeAsUpIndicator(toggle.getDrawerArrowDrawable()); 
    toggle.syncState(); 

    getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      DrawerArrowDrawable drawerArrowDrawable = toggle.getDrawerArrowDrawable(); 
      if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
       // 1 - Display as arrow 
       drawerArrowDrawable.setProgress(1); 
       toggle.setDrawerIndicatorEnabled(false); 

      } else { 
       // 2 - Display as arrow menu 
       drawerArrowDrawable.setProgress(0); 
       toggle.setDrawerIndicatorEnabled(true); 
      } 
     } 
    }); 

    toggle.setToolbarNavigationClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // This is called only when setDrawerIndicatorEnabled is set as false, meaning we are not at the "root" fragment. 
      getSupportFragmentManager().popBackStackImmediate(); 
     } 
    }); 
} 

希望这会帮助别人:)