【发布时间】:2015-10-30 22:25:31
【问题描述】:
我的问题涉及托管三个支持片段的活动。一个是普通的程序片段(我们称它为家庭片段)。一个是在设备定向时添加到主页片段顶部的纵向片段,一个是“无头”,以继续异步任务而不管配置更改。很简单,我在工作this nice example。
public class HeadlessCustomerDetailFetchFragment extends Fragment{
private RequestCustomerDetails mRequest;
private AsyncFetchCustomerDetails mAsyncFetchCustomerDetails;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
mRequest = (RequestCustomerDetails)getActivity();
}
public void startFetching(String scannedBarcode) {
if(mAsyncFetchCustomerDetails != null && mAsyncFetchCustomerDetails.getStatus() == AsyncTask.Status.RUNNING) return;
if(mAsyncFetchCustomerDetails == null || mAsyncFetchCustomerDetails.getStatus() == AsyncTask.Status.FINISHED)
mAsyncFetchCustomerDetails = new AsyncFetchCustomerDetails(getActivity(), mRequest, mPartner, scannedBarcode);
}
public void stopFetching() {
if(mAsyncFetchCustomerDetails != null && mAsyncFetchCustomerDetails.getStatus() != AsyncTask.Status.RUNNING) return;
mAsyncFetchCustomerDetails.cancel(true);
}
}
在我的活动的 onCreate() 中,如果需要,我会创建并添加无头片段。
mHeadlessCustomerDetailFetchFragment = (HeadlessCustomerDetailFetchFragment)getSupportFragmentManager()
.findFragmentByTag(HeadlessCustomerDetailFetchFragment.class.getSimpleName());
if(mHeadlessCustomerDetailFetchFragment == null) {
mHeadlessCustomerDetailFetchFragment = HeadlessCustomerDetailFetchFragment.instantiate(this, HeadlessCustomerDetailFetchFragment.class.getName());
getSupportFragmentManager().beginTransaction()
.add(mHeadlessCustomerDetailFetchFragment, mHeadlessCustomerDetailFetchFragment.getClass().getSimpleName())
.commit();
getSupportFragmentManager().executePendingTransactions();
id = null;
}
然后,在方向更改为纵向时添加的纵向片段的 onCreateView() 中启动 6 秒延迟(用于测试)后,我启动了一个异步任务(通过我的 startFetching() 函数)。在 Activity 的 onCreate() 中检测到方向变化:
if (savedInstanceState == null) {
// Do some initial stuff for the home fragment
}
else {
getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
//Launch portrait fragment
FragmentLauncher.launchPortraitFragment(this);
}
任务完成后,我返回activity并尝试更新活动肖像片段的UI,但片段管理器找不到它,findFragmentByTag()返回null。
要明确:
- 标签正确
- 如果我不定位设备,而是在其他地方启动异步任务,例如在活动的 onResume() 期间,则会找到片段。
- 如果我不告诉无头片段保留自身 - 从而失去不重新创建它的好处,也可以正确找到肖像片段。
- 调试我可以在管理器中看到所有 3 个片段 如果无头片段未设置为保留自己。如果是,我只能看到无头片段。
也许保留一个片段会积极杀死其他未保留的片段或类似的东西?
【问题讨论】:
-
你为什么不能在服务中执行你的异步任务?我相信这消除了您的轮换问题,也是一种更简洁的方法?
-
我也是这么认为的——我对服务了解不多,不过对于一项任务来说这似乎有点矫枉过正,但它可能是我唯一的选择——会调查一下谢谢
-
酷豆。如果您需要任何帮助,请告诉我。
-
也许
setRetained改变了popBackStackImmediate(name, flags)的工作方式?我可能会尝试删除或修改getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
标签: android android-fragments android-configchanges fragmentmanager