【发布时间】:2016-01-09 10:42:23
【问题描述】:
在我的应用程序中,我在MainActivity 中捕获onBackPressed 并向片段发送广播。每个片段中的接收器通过
@Override
public void onPause() {
super.onPause();
getActivity().unregisterReceiver(receiver);
Bundle args = getArguments();
int tab = args.getInt("Tab");
Log.d(log, String.format("Tab1Fragment %d onPause", tab));
}
@Override
public 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”。两个片段的广播接收器现在都处于活动状态。那是我的问题。
【问题讨论】:
-
请描述您尝试通过接收者处理的任务,也许我会帮助您解决问题。
-
根据片段的种类有不同的任务。覆盖的必须更改列表内容。第二个必须以覆盖之前的状态重新激活第一个。
-
尝试使用删除和添加。
标签: android android-fragments android-lifecycle