【问题标题】:How to listen when a fragment is on the screen当片段在屏幕上时如何收听
【发布时间】:2015-11-09 23:24:23
【问题描述】:

我需要的是一个特定片段的 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的情况。

【问题讨论】:

    标签: android android-fragments fragment-backstack


    【解决方案1】:

    在 Fragment 中重写此方法并检查布尔值

       @Override
       public void setUserVisibleHint(boolean isVisibleToUser) {
            super.setUserVisibleHint(isVisibleToUser);
    
            //Log.e("setUserVisibleHint", "isVisibleToUser " + isVisibleToUser);
    
       }
    

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

    【讨论】:

    • 我试过这个,但这个方法永远不会被调用。我检查了其他几个主题,人们说这种方法应该用于通知系统,而不是用于监听变化。
    • 我已经在我的应用程序中成功使用了它,这是唯一有效的解决方案。我有一个浏览器,其中的片段被左右滑动,只有当片段实际在屏幕上时,只有这种方法才能检测到。我不知道还能向您提出什么建议,因为其他解决方案不适合我
    • ViewPager 可能会自动调用此方法,但由于我没有在我的应用程序中使用 ViewPager,因此我可能需要别的东西。还是谢谢!
    • @J.K.除非片段与 ViewPager 一起使用,否则此方法不起作用。
    【解决方案2】:

    您是否以这种方式尝试过 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);
        }
    }
    

    【讨论】:

    • 这符合我的要求,但感觉不正确。我会继续搜索,但仍然非常感谢您的帮助!
    【解决方案3】:

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

    1) 在您的 Activity

    上放置/调用 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) 在您的 Fragment 上提供一个您希望被触发的方法。在这种情况下,我创建了名为 onFragmentResume()

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

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      • 1970-01-01
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多