我在一个活动中有多个片段。单击一个按钮,我将开始一个新的片段,并将其添加到backstack。我自然希望调用当前片段的onPause()
方法和新片段的onResume()
。好吧,这是不会发生的。
LoginFragment.java
public class LoginFragment extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.login_fragment, container, false);
final FragmentManager mFragmentmanager = getFragmentManager();
Button btnHome = (Button)view.findViewById(R.id.home_btn);
btnHome.setOnClickListener(new View.OnClickListener() {
public void onClick(View view){
HomeFragment fragment = new HomeFragment();
FragmentTransaction ft2 = mFragmentmanager.beginTransaction();
ft2.setCustomAnimations(R.anim.slide_right, R.anim.slide_out_left
, R.anim.slide_left, R.anim.slide_out_right);
ft2.replace(R.id.middle_fragment, fragment);
ft2.addToBackStack("");
ft2.commit();
}
});
}
@Override
public void onResume() {
Log.e("DEBUG", "onResume of LoginFragment");
super.onResume();
}
@Override
public void onPause() {
Log.e("DEBUG", "OnPause of loginFragment");
super.onPause();
}
}
HomeFragment.java
public class HomeFragment extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.login_fragment, container, false);
}
@Override
public void onResume() {
Log.e("DEBUG", "onResume of HomeFragment");
super.onResume();
}
@Override
public void onPause() {
Log.e("DEBUG", "OnPause of HomeFragment");
super.onPause();
}
}
我所期待的是,
onPause()
和HomeFragment的onResume()
将调用我得到的是,
这是正常的行为吗?为什么当我按下后退按钮时没有调用LoginFragment的onResume()
。
发布于 2013-04-27 21:55:02
只有在调用活动onResume()
或onPause()
时,才会调用片段onResume()
或onPause()
。它们与Activity
紧密耦合。
发布于 2013-04-27 21:45:08
ft2.replace()
,因此将调用FragmentTransaction.remove()
方法并移除该Loginfragment
。请参阅this。因此,将调用LoginFragment
的onStop()
而不是onPause()
。ft2.addtobackstack()
,因此Loginfragment
的状态将保存为一个包,当您在HomeFragment
中单击back按钮时,将调用onViewStateRestored()
,然后调用onStart()
of LoginFragment
。所以最终onResume()
将不会被调用。发布于 2016-11-25 01:41:30
这是我对Gor答案的更健壮的版本(使用fragments.size()是不可靠的,因为在片段弹出后大小没有减少)
getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
if (getFragmentManager() != null) {
Fragment topFrag = NavigationHelper.getCurrentTopFragment(getFragmentManager());
if (topFrag != null) {
if (topFrag instanceof YourFragment) {
//This fragment is being shown.
} else {
//Navigating away from this fragment.
}
}
}
}
});
和'getCurrentTopFragment‘方法:
public static Fragment getCurrentTopFragment(FragmentManager fm) {
int stackCount = fm.getBackStackEntryCount();
if (stackCount > 0) {
FragmentManager.BackStackEntry backEntry = fm.getBackStackEntryAt(stackCount-1);
return fm.findFragmentByTag(backEntry.getName());
} else {
List<Fragment> fragments = fm.getFragments();
if (fragments != null && fragments.size()>0) {
for (Fragment f: fragments) {
if (f != null && !f.isHidden()) {
return f;
}
}
}
}
return null;
}
https://stackoverflow.com/questions/11326155
复制相似问题