我像这样添加第一个片段
FragmentManager fm = SliderActivity.this
.getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
Fragment fragment = null;
fragment = new HomeFragment();
ft.add(R.id.content_fragment, fragment, "Home");
ft.addToBackStack("Home");
ft.commit();
和第二个片段
FragmentManager fm = SliderActivity.this
.getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
Fragment fragment = null;
fragment = new HomeFragment();
ft.add(R.id.content_fragment, fragment, "About");
ft.addToBackStack("About");
ft.commit();
我的问题是,如果我按下AboutFragment(第二个)按钮,然后如何调用HomeFragment方法(第一个)
onResume() is not fired which is creating problem
答案 0 :(得分:5)
我发布了迟到的答案,但我认为这对其他人有用
虽然我们将add()
与片段交易一起使用,但来源片段不会调用onResume()
。只有目标片段才能获得onResume()
回调
但是使用这种方式,我们可以实现onResume()
回调来源片段:
在Host Activity的onBackPressed()
@Override
public void onBackPressed() {
getSupportFragmentManager().getFragments()
.get(getSupportFragmentManager().getBackStackEntryCount() - 1).onResume();
super.onBackPressed();
}
注意:请务必使用addToBackStack()
commit()
此代码会将onResume()
回调给来源片段
谢谢
答案 1 :(得分:0)
我正在为我的所有片段使用此方法
// For the Fragment Replace And AddtobackStack
void replaceFragment(Fragment fragment) {
String backStateName = fragment.getClass().getName();
String fragmentTag = backStateName;
FragmentManager manager = this.getSupportFragmentManager();
boolean fragmentPopped = manager
.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped && manager.findFragmentByTag(fragmentTag) == null) {
// fragment not in back stack, create it.
FragmentTransaction ft = manager.beginTransaction();
ft.replace(R.id.container, fragment, fragmentTag);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(backStateName);
ft.commit();
}
}
答案 2 :(得分:0)
而不是为第二个片段调用“add”而不是“替换”
即。而不是
ft.add(R.id.content_fragment, fragment, "Home");
使用
ft.replace(R.id.content_fragment, fragment, "Home");
所以每当你按下后退按钮去上一个片段时,第一个片段的生命周期将再次被回调。
或如果不符合您的要求,您可以这样做:
private final static String TAG_FRAGMENT = "TAG_FRAGMENT";
private void showFragment() {
final Myfragment fragment = new MyFragment();
final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment, fragment, TAG_FRAGMENT);
transaction.addToBackStack(null);
transaction.commit();
}
@Override
public void onBackPressed() {
final Myfragment fragment = (Myfragment) getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT);
if (fragment.allowBackPressed()) { // and then you define a method allowBackPressed with the logic to allow back pressed or not
super.onBackPressed();
}
}
答案 3 :(得分:0)
如果要添加片段
ft.add(R.id.content_fragment, fragment, "About");
然后它不会在背压时调用任何第一个片段的方法。
要调用第一个片段的方法,而是将片段替换为:
ft.replace(R.id.content_fragment, fragment, "About");
但是这会首先调用onCreateView()
然后调用其他方法。在反向片段中调用onResume()
是不可能的,因为活动发生了