【问题标题】:Callback when Fragment is replaced and when it is visible again当 Fragment 被替换并且再次可见时的回调
【发布时间】:2016-01-19 19:32:45
【问题描述】:

我一直在研究这个主题,但到目前为止还没有运气。基本上,我使用FragmentTransaction.replace 将一个片段(A)替换为另一个片段(B)。在另一个片段 (B) 中,我在工具栏中有一个“取消”按钮,当按下该按钮时,它会通过调用 getActivity().getSupportFragmentManager().popBackStackImmediate() 弹回到上一个事务 (A)。

问题是当我显示片段 A 和片段 B 时,我需要更新 Activity 工具栏以显示不同的标题。我似乎无法找到在片段 A 中调用的方法,无论何时我从 A 出发 - > B -> A 通知我它再次可见。这个想法是在这个回调中设置我似乎找不到的工具栏标题。

谁能指点我正确的方向?

干杯。

编辑:

我调用的将片段替换为另一个片段的方法如下:

public static void replaceFragment(FragmentActivity parentActivity, int fragmentToReplaceId, Fragment withFragment, Integer enterAnim, Integer exitAnim)
{
    FragmentManager         fragmentManager;
    FragmentTransaction     transaction;

    fragmentManager = parentActivity.getSupportFragmentManager();
    transaction     = fragmentManager.beginTransaction();

    if (    (null != enterAnim) &&
            (null != exitAnim)  )
    {
        transaction.setCustomAnimations(enterAnim, exitAnim);
    }

    transaction.replace(fragmentToReplaceId, withFragment);
    transaction.addToBackStack(null);
    transaction.commit();
}

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    您可以通过覆盖片段中的onResume()方法并将消息发送到活动或直接更改工具栏来通知。

    @Override
    public void onResume() {
        super.onResume();
    
        ((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Title");
    }
    

    【讨论】:

    • 在Fragment中调用,而不是在Activity中调用。
    • 对不起!我的意思是片段而不是活动。换句话说,当我从片段 A -> 用片段 B 替换片段 A -> 弹出到片段 A 时,此时片段 A 中的 onResume 不会被调用。两个片段都在同一个 Activity 中。
    • @Nokiaowner 这很奇怪,因为它应该。你应该错过了什么。
    • 据我所知,片段 onResume() 只会在调用活动 onResume() 时被调用。请记住,两个片段都在同一个活动中。在应用程序的整个生命周期中,我只使用一项活动。
    • 由于fragment与Activity紧密绑定。替换或添加片段时不会调用 OnResume 和 onPause。
    【解决方案2】:

    在一个activity中,当替换A ---> B(A和B都是片段)时,可以使用这个回调:

     @Override
     public void onAttachFragment(Fragment fragment) {
    
     }
    

    【讨论】:

      【解决方案3】:

      通过在片段A中创建一个简单的静态方法解决如下:

      public static void updateActivityTitle(FragmentActivity activity)
      {
          activity.setTitle(kActivityTitle);
      }
      

      然后我在片段B中调用这个方法如下:

      // cancel button has been pressed
      private void cancel()
      {
          INV_CustomersFragment.updateActivityTitle(getActivity());
          getActivity().getSupportFragmentManager().popBackStackImmediate();
      }
      

      不理想,但它可以完成工作。任何其他涉及适当回调的解决方案都会更好

      更新:

      更好的解决方案是@Rani 在Fragment's onResume() not called when popped from backstack 描述的解决方案。这更优雅,更易于维护,实际上我在我的项目中实现了这个解决方案。与 iOS 的等效解决方案相比,如果您问我,这仍然很混乱,但似乎仍然是要走的路。

      【讨论】:

        猜你喜欢
        • 2015-10-19
        • 1970-01-01
        • 2021-01-25
        • 2017-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-16
        相关资源
        最近更新 更多