片段onResume()&onPace()在Back堆栈上不被调用

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

我在一个活动中有多个片段。在单击按钮时,我将启动一个新片段,将其添加到后台。我很自然地以为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();
  }
}

我所期望的是,

  1. 当按钮被点击时,登录帧被替换为家庭框架,,,onPause()登录帧,和onResume()家庭框架 gets called
  2. 当背部被压紧时,家庭框架突然出现登录帧被看到,而且onPause()家庭框架onResume()登录帧会被打电话。

我得到的是,

  1. 当按钮被点击时,家庭框架是正确的替换登录帧,onResume()家庭框架调用,但由于登录帧从未被召唤过。
  2. 当背压时,家庭框架正确地弹出以显示登录帧,因为...的()家庭框架获取调用,但是onResume()登录帧从来没人叫过。

这是正常行为吗?为什么onResume()登录帧当我按后退按钮时没有人叫我。

提问于
用户回答回答于

碎片onResume()onPause()只有当活动被调用时onResume()onPause()叫做。它们紧密地连接到Activity.

用户回答回答于
  • 因为你用过ft2.replace(),FragmentTransaction.remove()方法调用,并且Loginfragment将被移除。所以onStop()LoginFragment将被调用而不是onPause()
  • 但既然你也用了ft2.addtobackstack()的状态Loginfragment将被保存为一个包,当单击“上一步”按钮时,HomeFragment,onViewStateRestored()将被称为onStart()LoginFragment

扫码关注云+社区