Android 当片段被替换并且再次可见时回调

Android 当片段被替换并且再次可见时回调,android,android-fragments,Android,Android Fragments,我一直在研究这个话题,但到目前为止运气不好。基本上,我使用FragmentTransaction.replace将一个片段(a)替换为另一个片段(B)。在另一个片段(B)中,我在工具栏中有一个“取消”按钮,按下该按钮时,通过调用getActivity().getSupportFragmentManager().popbackImmediate()返回到上一个事务(a) 问题是,当我显示片段a和片段B时,我需要更新“活动”工具栏以显示不同的标题。我似乎找不到一个方法,每当我从a->B->a转到该方

我一直在研究这个话题,但到目前为止运气不好。基本上,我使用
FragmentTransaction.replace
将一个片段(a)替换为另一个片段(B)。在另一个片段(B)中,我在工具栏中有一个“取消”按钮,按下该按钮时,通过调用
getActivity().getSupportFragmentManager().popbackImmediate()
返回到上一个事务(a)

问题是,当我显示片段a和片段B时,我需要更新“活动”工具栏以显示不同的标题。我似乎找不到一个方法,每当我从a->B->a转到该方法时,它都会在片段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();
}
public static void updateActivityTitle(FragmentActivity activity)
{
    activity.setTitle(kActivityTitle);
}
// cancel button has been pressed
private void cancel()
{
    INV_CustomersFragment.updateActivityTitle(getActivity());
    getActivity().getSupportFragmentManager().popBackStackImmediate();
}

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

@Override
public void onResume() {
    super.onResume();

    ((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Title");
}

通过在片段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();
}
public static void updateActivityTitle(FragmentActivity activity)
{
    activity.setTitle(kActivityTitle);
}
// cancel button has been pressed
private void cancel()
{
    INV_CustomersFragment.updateActivityTitle(getActivity());
    getActivity().getSupportFragmentManager().popBackStackImmediate();
}
然后我在片段B中调用此方法,如下所示:

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();
}
public static void updateActivityTitle(FragmentActivity activity)
{
    activity.setTitle(kActivityTitle);
}
// cancel button has been pressed
private void cancel()
{
    INV_CustomersFragment.updateActivityTitle(getActivity());
    getActivity().getSupportFragmentManager().popBackStackImmediate();
}
虽然不理想,但它完成了任务。任何涉及适当回调的其他解决方案都会更好

更新:


一个更好的解决方案是@Rani at所描述的解决方案。这更优雅,更易于维护,事实上我在我的项目中实现了这个解决方案。与iOS的等效解决方案相比,这仍然很混乱,如果你问我的话,这似乎仍然是一条路。

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

 @Override
 public void onAttachFragment(Fragment fragment) {

 }

它是在片段中调用的,不是在活动中。对不起!我的意思不是活动。换句话说,当我从片段A->用片段B替换片段A->弹出到片段A时,此时不会调用片段A中的onResume。两个片段都在同一个活动中。@这很奇怪,因为它应该。您应该遗漏了一些内容。据我所知,只有在调用Activities onResume()时才会调用片段onResume()。请记住,两个片段都在同一个活动中。在应用程序的整个生命周期中,我只使用一个活动。在替换或添加片段时,不会调用OnResume和onPause。