为了账号安全,请及时绑定邮箱和手机立即绑定

片段onResume()和onPause()在后台程序中未调用

片段onResume()和onPause()在后台程序中未调用

隔江千里 2019-12-16 10:21:26
我在一个活动中有多个片段。在一个按钮上,单击“我正在开始一个新的片段,将其添加到堆栈”。我自然希望可以调用onPause()当前Fragment和onResume()new Fragment 的方法。好吧,这没有发生。LoginFragment.javapublic 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.javapublic 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);  }我所期望的是当用户点击按钮,LoginFragment被替换为 HomeFragment,onPause()的LoginFragment和onResume()的 HomeFragment被调用当被压回,HomeFragment是POP操作并LoginFragment看到,和onPause()的HomeFragment和onResume()的LoginFragment 被调用。我得到的是当用户点击按钮,HomeFragment正确更换 LoginFragment,的onResume()的HomeFragment被调用,但在onPause(的)LoginFragment永远不会被调用。当按下回来,HomeFragment正确弹出透露 LoginFragment,在onPause()的HomeFragment被调用,但的onResume(的)LoginFragment不会被调用。这是正常行为吗?为什么当我按下“后退”按钮时onResume(),LoginFragment没有被调用。片段onResume()和onPause()在后台程序中未调用
查看完整描述

3 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

片段onResume()onPause()仅在调用活动onResume()或时才onPause()被调用。他们紧密地联系在一起Activity



查看完整回答
反对 回复 2019-12-16
?
回首忆惘然

TA贡献1847条经验 获得超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. 

                    }

                }

            }

        }

    });

和“ 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;

}


查看完整回答
反对 回复 2019-12-16
  • 3 回答
  • 0 关注
  • 692 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信