有没有办法从堆栈顶部获取片段?

我的MainActivity中有一个ListFragment。 这是我如何设置我的片段对象。

FragmentManager fragmentManager = activity.getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); Fragment newFragment = new MyFragment(); fragmentTransaction.replace(R.id.framecontainer, newFragment, "tag"); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); 

问题是当用户按下返回button时,我不得不通过调用至less改变操作栏和菜单

 getActionBar().setTitle(title); getActionBar().setDisplayHomeAsUpEnabled(isEnabled); invalidateOptionsMenu(); 

我必须知道当前显示哪种片段,以便我知道如何设置操作栏。 我将片段中的设置选项存储为参数。

 String title = fragment.getArguments().getString("KEY_TITLE"); boolean isEnabled = fragment.getArguments().getBoolean("KEY_ISENABLED"); 

我search相关的问题,我意识到我可以通过调用来获取片段

 MyFragment fragment = (MyFragment) getSupportFragmentManager() .findFragmentByTag("tag"); 

但是,我必须将所有标记存储在自定义堆栈中,并且在用户按下onBackPressed()button时每次调用pop onBackPressed()

所以,我的问题是, 有没有办法让我直接从堆栈中获取当前可见的片段?

注意:请记住,片段types是不同的,不只是MyFragment。

Solutions Collecting From Web of "有没有办法从堆栈顶部获取片段?"

这样的一些事情应该可以帮助你的活动在后台处理:

 private Fragment getCurrentFragment(){ FragmentManager fragmentManager = getSupportFragmentManager(); String fragmentTag = fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount() - 1).getName(); Fragment currentFragment = fragmentManager.findFragmentByTag(fragmentTag); return currentFragment; } @Override public void onBackPressed() { Fragment fragmentBeforeBackPress = getCurrentFragment(); // Perform the usual back action super.onBackPressed(); Fragment fragmentAfterBackPress = getCurrentFragment(); } 

希望这可以帮助。

 FragmentManager.findFragmentById(fragmentsContainerId) 

函数返回链接到顶层Fragment在后台。 用法示例:

  fragmentManager.addOnBackStackChangedListener(new OnBackStackChangedListener() { @Override public void onBackStackChanged() { Fragment fr = fragmentManager.findFragmentById(R.id.fragmentsContainer); if(fr!=null){ Log.e("fragment=", f.getClass().getSimpleName()); } } }); 

已经有一个标记为正确的答案,我的附加信息将不会有所不同。 但是,在使用接收器试图确定接收器来自哪里的片段是堆栈上当前顶部片段时,我遇到了麻烦。 你可以很容易地运行在NPE和索引越界。 所以我写了这个,也许这对别人有帮助。

 private boolean isFragmentOnTop(Activity parentActivity, final String fragmentName){ FragmentManager fmManager = parentActivity.getFragmentManager(); if(fmManager.getBackStackEntryCount() == 0){ LOG.i("BackStack entry count is 0: " + this); return false; } String fragmentNameOnStackTop = ""; final FragmentManager.BackStackEntry topEntry = fmManager.getBackStackEntryAt(fmManager.getBackStackEntryCount() -1); if(topEntry != null) { fragmentNameOnStackTop = topEntry.getName(); } LOG.d("Got fragments name: " + fragmentNameOnStackTop); return fragmentNameOnStackTop != null ? fragmentNameOnStackTop.equals(fragmentName) : false; } 

请注意,这适用于有一些片段的活动。 请注意,如果您使用的ViewPager childfragmentmanager。

并且不要忘记在FragmentTransaction.addToBackStack(fragmentName)设置FragmentTransaction.addToBackStack(fragmentName)

这个辅助方法从栈顶获取片段:

 public Fragment getTopFragment() { if (getSupportFragmentManager().getBackStackEntryCount() == 0) { return null; } String fragmentTag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName(); return getSupportFragmentManager().findFragmentByTag(fragmentTag); }