被另一个片段覆盖的Android片段仍然是已显示而不是onPause

被另一个片段覆盖的Android片段仍然是已显示而不是onPause,第1张

概述在我的应用程序中,我在MainActivity中捕获onBackPressed并向片段发送广播.每个片段中的接收器都打开或关闭 @Overridepublic void onPause() { super.onPause(); getActivity().unregisterReceiver(receiver); Bundle args = getArguments() 在我的应用程序中,我在MainActivity中捕获onBackpressed并向片段发送广播.每个片段中的接收器都打开或关闭

@OverrIDepublic voID onPause() {    super.onPause();    getActivity().unregisterReceiver(receiver);    Bundle args = getArguments();    int tab = args.getInt("Tab");    Log.d(log,String.format("Tab1Fragment %d onPause",tab));}@OverrIDepublic voID onResume() {    super.onResume();    IntentFilter filter = new IntentFilter("de.foo.Backpressed");    receiver = new MyReceiver();    getContext().registerReceiver(receiver,filter);    Bundle args = getArguments();    int tab = args.getInt("Tab");    Log.d(log,String.format("Tab1Fragment %d onResume",tab));}

另外,在广播接收器中,我检查片段的可见性以确保,只有可见片段可以处理Backpressed事件:

if (intent.getAction().equals("de.foo.Backpressed")) {    if (getVIEw() != null && getVIEw().isShown()) {        ...    }}

当我用另一个片段替换现有的和可见的片段时,不会在被替换的片段上调用onPause().它的广播接收器仍然启用.也是新片段中的接收器.这两个片段对于getVIEw().isShown()都是真的,但事实并非如此:只有最后一个片段是可见的.

我怎样才能实现只有可见片段的反应呢?

编辑:第一个片段加载到我的标签栏的标签0中.我得到日志“Tab1Fragment 0 onResume”并启用广播接收器.
在此片段中,用户点击列表条目以显示HTML页面.我使用以下代码执行此 *** 作:

HTML_Fragment newFragment = new HTML_Fragment();            newFragment.setArguments(extras);            FragmentManager fm = getFragmentManager();            FragmentTransaction ft = fm.beginTransaction();            ft.replace(R.ID.content,newFragment);            ft.addToBackStack(null);            ft.commit();

HTML_Fragment现在在相同的空间中开始,我看到日志“HTMLFragment 0 onResume”.现在只能看到HTML_Fragment,但我没有得到日志“Tab1Fragment 0 onPause”.两个片段的广播接收器现在都是活动的.那是我的问题.

解决方法 从上面的代码中,我可以猜测,问题的根本原因是什么,但我有一个想法:

>确保您将旧片段替换为新片段,而不是在旧片段之上添加新片段:

// to show the root fragment getSupportFragmentManager().beginTransaction().                replace(R.ID.container,new FragmentA()).                commit(); .... // to show subfragment (i.e. fragment which is replacing the root fragment) getSupportFragmentManager().beginTransaction().                replace(R.ID.container,new FragmentB()).addToBackStack(null).                commit();

在这段代码片段中,FragmentA的onPause()将在FragmentB的onResume()之前调用(当你点击FragmentB的on-onPause() – > FragmentA的onResume()时).

replace() – 与使用相同的containerVIEwID添加的所有当前添加的片段调用remove(Fragment)相同,然后使用相同的参数添加(int,Fragment,String).而add() – 只是将一个片段添加到活动状态.

如果您只是添加()新片段(或添加两者,然后只是通过show()/ hIDe()切换它们) – 一些生命周期方法将从您身上溜走.

如果有帮助,请告诉我.

总结

以上是内存溢出为你收集整理的被另一个片段覆盖的Android片段仍然是已显示而不是onPause全部内容,希望文章能够帮你解决被另一个片段覆盖的Android片段仍然是已显示而不是onPause所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1123692.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存