2

我需要的正是onResume特定片段的方法(因为它适用于活动)。我将片段(假设片段 A)添加到后堆栈,并从片段 A 打开另一个片段(片段 B)(再次添加到后堆栈)。我想在片段 B 关闭且片段 A 时更新工具栏再次出现在屏幕上。我希望onCreateView被调用,但是当我弹出片段 B 时它不会被调用。我还尝试向OnBackStackChangedListener片段 A 添加一个,但是当返回堆栈更改时,我无法跟踪屏幕上的哪个片段。

所以我的问题是当我回到片段 A 时如何onCreateView调用。如果这不是一个好习惯,我还能如何跟踪这个事件?

编辑

我正在用这段代码展示新的片段:

getSupportFragmentManager().beginTransaction()
        .add(R.id.content, fragment)
        .addToBackStack(tag)
        .commit();

我应该以某种方式更改它以使其onCreateView被调用吗?由于我现有的片段 A 上添加了新的片段 B(当 B 在屏幕上时,我什至可以单击片段 A 中的按钮),当我弹出片段 B 时,片段 A 的情况没有任何变化。

4

3 回答 3

1

在 Fragment 中覆盖此方法并检查布尔值

   @Override
   public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);

        //Log.e("setUserVisibleHint", "isVisibleToUser " + isVisibleToUser);

   }

根据 isVisibleToUser 布尔值,将片段变为可见/隐藏时需要执行的代码放入此方法中

于 2015-11-09T23:28:17.383 回答
0

我希望这个解决方案能奏效。

1)在您的活动上放置/调用addOnBackStackChangedListener

getSupportFragmentManager().addOnBackStackChangedListener(backStacklistener);

2)在你的 Activity 中定义backStacklistener

FragmentManager.OnBackStackChangedListener backStacklistener = new FragmentManager.OnBackStackChangedListener() {
        public void onBackStackChanged() {
            FragmentManager manager = getSupportFragmentManager();
            if (manager != null) {
                Fragment fragment = manager.findFragmentById(R.id.fragment);
                if(fragment instanceof OutboxFragment) {
                    OutboxFragment currFrag = (OutboxFragment) fragment;
                    currFrag.onFragmentResume();
                }
            }
        }
    };

3)在您想要触发的片段上提供一个方法。在这种情况下,我创建名为onFragmentResume() 的方法

public void onFragmentResume() {
    MainActivity activity = (MainActivity) getActivity();
    activity.showFab();
    // or do another thing here
}

祝你好运!

于 2017-02-22T14:44:12.570 回答
0

您是否以这种方式尝试过 OnBackStackChangedListener?

public class BlankFragment2 extends Fragment {


    public BlankFragment2() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
            @Override
            public void onBackStackChanged() {
                if(getFragmentManager()==null)
                    return;
                Fragment fr = getFragmentManager().findFragmentById(R.id.container)//id of your container;

                if (fr instanceof BlankFragment2) {
                    //On resume code goes here
                }
            }
        });
        return inflater.inflate(R.layout.fragment_blank_fragment2, container, false);
    }
}
于 2015-11-10T00:54:22.877 回答