Kri*_*dra 183 android onresume android-fragments back-stack
我在一个活动中有多个片段.在按钮上单击我开始一个新片段,将其添加到backstack.我自然希望调用onPause()当前片段和onResume()新片段的方法.好吧,它没有发生.
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();
}
}
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
我所期待的是,
onPause()的LoginFragment和onResume()的
HomeFragment被调用onPause()的HomeFragment和onResume()的LoginFragment
被调用.我得到的是,
这是正常行为吗?为什么是onResume()的LoginFragment当我按下后退按钮没有得到调用.
Sag*_*are 175
片段onResume()或onPause()将仅在活动onResume()或被onPause()调用时被调用.他们紧紧联系在一起Activity.
阅读本文的处理片段生命周期部分.
小智 19
ft2.replace(),FragmentTransaction.remove()
因此调用方法并Loginfragment删除它.参考这个.所以onStop()的LoginFragment将被调用,而不是onPause().(因为新片段完全取代旧片段).ft2.addtobackstack(),那么它的状态Loginfragment将被保存为一个包,当你点击后退按钮时HomeFragment,
onViewStateRestored()将被调用,然后onStart()是
LoginFragment.所以最终onResume()不会被召唤.aar*_*ino 11
这是我更强大的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.
}
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
'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;
}
Run Code Online (Sandbox Code Playgroud)
如果你真的想要替换其他片段中的片段,你应该使用嵌套片段.
在您的代码中,您应该替换
final FragmentManager mFragmentmanager = getFragmentManager();
Run Code Online (Sandbox Code Playgroud)
同
final FragmentManager mFragmentmanager = getChildFragmentManager();
Run Code Online (Sandbox Code Playgroud)
小智 7
getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
List<Fragment> fragments = getFragmentManager().getFragments();
if (fragments.size() > 0 && fragments.get(fragments.size() - 1) instanceof YoureFragment){
//todo if fragment visible
} else {
//todo if fragment invisible
}
}
});
Run Code Online (Sandbox Code Playgroud)
但如果有多个片段可见,请小心
| 归档时间: |
|
| 查看次数: |
227182 次 |
| 最近记录: |