当前位置: 首页 > 知识库问答 >
问题:

片段onResume()&onPause()不在backstack上调用

籍兴文
2023-03-14

我在一个activity里有多个碎片。在一个按钮点击我开始一个新的片断,将它添加到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();
  }
}
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();
  }
}

我所期待的是,

  1. 单击按钮时,LoginFragment将被替换为HomeFragment、LoginFragment的onPause()以及HomeFragment的onResume()将被调用
  2. 按下“上一步”时,将弹出HomeFragment并看到LoginFragment,并调用HomeFragment的onPause()和LoginFragment的onResume()

我得到的是,

  1. 单击按钮时,HomeFragment将正确替换LoginFragment,将调用HomeFragment的onResume(),但从不调用LoginFragment的onPause()。
  2. 当向后按时,HomeFragment将正确弹出以显示LoginFragment,HomeFragment的onPause()将被调用,但LoginFragment的onResume()从未被调用。

这是正常的行为吗?为什么当我按下后退按钮时,LoginFragment的onResume()没有被调用。

共有2个答案

廖君昊
2023-03-14
  • 由于您使用了FT2.replace(),因此将调用FragmentTransaction.Remove()方法,并删除LoginFragment。请参阅此。因此将调用loginfragmentonstop()而不是onpause()。(新片断将完全替换旧片断)。
  • 但由于您还使用了FT2.AddToBackStack()LoginFragment的状态将保存为一个包,并且当您单击HomeFragment中的“上一步”按钮时,将调用OnViewStateRestord(),然后调用LoginFragmentOnStart()。因此最终不会调用onResume()
公羊宇定
2023-03-14

只有在调用活动onresume()onpause()时,才会调用片段onresume()onpause()。它们与activity紧密耦合。

请阅读本文的“处理片段生命周期”一节。

 类似资料:
  • 在使用带有片段的时,在选项卡之间移动时不会调用我们的和方法。我们有什么办法可以从碎片中找出我们是被发现还是被隐藏? 不幸的是,我在、中有逻辑,就像在location services注册一样,在切换选项卡时永远不会停止,因为在退出整个应用程序之前,永远不会调用。

  • 我的主要活动是装载不同的碎片。此外,可以从MainActivity打开设置-activity。 如果用户只是在片段之间切换,那就万事大吉了。 当打开设置-activity并返回MainActivity时,onResume和onPause会被调用两次。如果用户打开设置-activity并再次返回MainActivity,onResume和onPause将被调用三次。每次用户打开“设置-activit

  • 在我们的应用程序中,我们有一个带有FrameLayout的活动。这个布局显示了几个片段。要在片段之间进行更改,我们使用以下方法: 如果用该方法更改片段,一切都将正常工作。不幸的是,问题是后退按钮似乎被打破了。如果我们在其中一个片段处按下它,FrameLayout将正确更新。但碎片不会被摧毁。Android不调用onPause()、onStop()和OnDestroyView()方法。因此,操作栏没

  • 我使用带有ViewPager的FragmentPagerAdapter来切换片段 那么我如何使片段调用它们的onResume()呢?

  • 我有点进退两难,不知道该怎么解决。情况是这样的... 我有一个多activity应用程序,播放音乐从它开始的时间到应用程序退出的时间。 但是,如果我使用onPause/onResume来检测activity何时被发送到后台,并在onPause中暂停音乐,在onResume中恢复播放,那么当我启动下一个activity时,音乐会短暂地“跳过”,因为调用startActivity()后,主叫activ

  • 我有一个有3个选项卡的ViewPager。根据我所看到的情况,当容器活动开始时,前两个片段将处于恢复状态。我还注意到,只有并排的两个片段被恢复,第三个被停止。我遇到的问题是,我从网络加载数据用于第一个片段,并将自定义对象存储在一个ArrayList中,这很正常,但当我导航到第三个片段时,数据会随着第一个片段进入停止状态而丢失。因此,当从第三个片段导航回第一个片段时,ArrayList就会为空(我在