我申请时需要使用Tabs,所以我的代码以Android FragmentTabs为例, 发现 here. 。然而,我在代码中更改了几条线,以适应我的目的如下:
在给定的“机器人代码”中,每当用户修改标签时,断面断面的碎片就会被摧毁,断面的碎片就会被创建。为了我的目的,这不可取。虽然我的碎片可以相互独立,但它们会对通过网络连接产生的实时数据作出反应并采取行动。仅仅因为断面是断面的,并不意味着我希望它停止在背景中工作(可悲的是,这似乎是Android的例子中的思维路线 ) 。 因此,我修改了代码以隐藏和显示标签,而不是创建和摧毁标签。
为此,在示例代码I中,将 onTabChanged()
更改为以下两个地方:
public void onTabChanged(String tabId) {
TabInfo newTab = mTabs.get(tabId);
if (mLastTab != newTab) {
FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
if (mLastTab != null) {
if (mLastTab.fragment != null) {
ft.hide(mLastTab.fragment); //***** 1st Alteration
//ft.detach(mLastTab.fragment);
}
}
if (newTab != null) {
if (newTab.fragment == null) {
newTab.fragment = Fragment.instantiate(mActivity,
newTab.clss.getName(), newTab.args);
ft.add(mContainerId, newTab.fragment, newTab.tag);
} else {
ft.show(newTab.fragment); //************ 2nd Alteration
//ft.attach(newTab.fragment);
}
}
mLastTab = newTab;
ft.commit();
mActivity.getSupportFragmentManager().executePendingTransactions();
}
}
现在,这与我所希望的一样有效。 当设备重新定向时, 问题就会出现。 当第一个方向改变时, 之前选中的标签内容, 即零散部分没有显示 。 这与我隐藏和显示标签的事实有关 。 更严重的是, 在设备第二次调整方向时, 将会丢弃例外 :
E/AndroidRuntime( 371): Caused by: java.lang.NullPointerException E/AndroidRuntime( 371): at android.support.v4.app.FragmentManagerImpl.findFragmentByTag(FragmentManager.java:1211) E/AndroidRuntime( 371): at $TabManager.addTab(ClassName.java:121)
添加 Tab 方法在此 :
public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) {
tabSpec.setContent(new DummyTabFactory(mActivity));
String tag = tabSpec.getTag();
TabInfo info = new TabInfo(tag, clss, args);
// Check to see if we already have a fragment for this tab, probably
// from a previously saved state. If so, deactivate it, because our
// initial state is that a tab isn t shown.
FragmentManager fm = mActivity.getSupportFragmentManager();
Log.i("Class Name","addTab() FragmentManager = " + fm.toString());
Log.i("Class_Name","addTab() tag = " + tag);
info.fragment = fm.findFragmentByTag(tag); // **** This causes the exception
/*
* Commented the following as Fragments are not removed but hidden/shown on tab change.
*/
if (info.fragment != null && !info.fragment.isDetached()) {
FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
ft.detach(info.fragment);
ft.commit();
}
mTabs.put(tag, info);
mTabHost.addTab(tabSpec);
}
更具体地说,例外被扔到 info.frafgment = fm.findFrashmentByTag(gag);
(gag); 从我试图分离的代码中可以看出,什么物体是无效的,也就是说,是不成块管理器还是标签,但这些标记没有记录为无效。
我并不完全理解Android的例子,如果我附加和分解碎片而不是隐藏和展示它们,这很好。 有人能解释问题是什么吗?