我的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();
问题是当用户按下后退按钮时,我必须至少通过调用
来更改操作栏和菜单getActionBar().setTitle(title);
getActionBar().setDisplayHomeAsUpEnabled(isEnabled);
invalidateOptionsMenu();
我必须知道当前显示的是哪种片段,以便我知道如何设置操作栏。我将设置选项存储在fragment中作为参数。
String title = fragment.getArguments().getString("KEY_TITLE");
boolean isEnabled = fragment.getArguments().getBoolean("KEY_ISENABLED");
我确实搜索了相关的问题,我意识到我可以通过调用
来获取片段MyFragment fragment = (MyFragment) getSupportFragmentManager()
.findFragmentByTag("tag");
但是,我必须将所有标记存储在自定义堆栈中,并在用户按下onBackPressed()
中的按钮时每次调用 pop()。
所以,我的问题是 是否可以让我直接从堆栈中获取当前可见的片段?
注意:请记住片段类型不同,而不仅仅是MyFragment。
答案 0 :(得分:66)
这样的事情应该有助于你的活动在背景上解决这个问题:
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();
}
希望这有帮助。
答案 1 :(得分:27)
FragmentManager.findFragmentById(fragmentsContainerId)
function返回backstack中顶部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());
}
}
});
编辑:现在2018年,FragmentManager
中的getFragments方法返回List<Fragment>
。来自docs:The order of the fragments in the list is the order in which they were added or attached
。所以看起来我们可以从该列表中获取最后一个片段:
List<Fragment> list = fragmentManager.getFragments();
//get last one
Fragment topFragment = list.get(list.size() - 1);
答案 2 :(得分:1)
已经有一个标记为正确的答案,我的其他信息不会 与那不同。但是,当我尝试使用接收器时,我遇到了麻烦 弄清楚接收器来自哪里的片段是当前的顶部 片段在堆栈上。你可以很容易地在很多NPE和Index中运行。 因此我写了这个,也许它对某人有帮助。
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)
答案 3 :(得分:0)
这个帮助器方法从堆栈顶部获取片段:
public Fragment getTopFragment() {
if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
return null;
}
String fragmentTag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
return getSupportFragmentManager().findFragmentByTag(fragmentTag);
}
答案 4 :(得分:0)
看起来有些改变了,因为下面的代码非常适合我,但是我在这里既没有提供的答案中也没有在邻居问题中找到它。
科特琳:
supportFragmentManager.fragments[supportFragmentManager.fragments.size - 1]
Java:
getSupportFragmentManager().getFragments()
.get(getSupportFragmentManager().getFragments().size() - 1)