Ash*_*bey 13 android android-layout
我在Activity上使用Action Bar.对于每个标签,我显示不同的布局.由于布局太重.所以我将每个布局充气到视图中.所以在每个Tab上选择
public void onTabSelected(Tab tab, FragmentTransaction ft) {
if (mView == null) {
mView = LayoutInflater.from(mAct).inflate(mLayout, null); // mAct is Activity reference
}
mAct.setContentView(mView);
for (int i = 0; i < mFrags.length; i++) {
mFrags[i] = (LutronFragment) mAct.getFragmentManager()
.findFragmentById(mIds[i]);
if (mFrags[i] != null) {
mFrags[i].setupHeader();
}
}
}
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
for (Fragment f : mFrags) {
try {
if (f != null) {
ft.remove(f);
}
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以,如果我第二次选择tab并在该选项卡上执行某些操作,app会在getActivity上崩溃.(NullPointerException)
请建议是否有其他方法来缓存繁重的布局.
Mik*_*e T 38
问题很可能是您使用的旧片段已从您的活动中分离出来.
因此,第一次创建片段时,它会附加到您的活动中.一切都很好.然后,当您更改选项卡时,您的片段可能会或可能不会与活动分离.当您回溯到它时,旧片段可能与活动分离,因此getActivity()返回null.
如果您试图保留对Fragments的引用,而不是通过它访问它们,就会发生这种情况FragmentManager.
如果您的适配器返回对片段的引用而不是新片段,也会发生这种情况.我陷入了这个陷阱.
(发布创建片段的代码可能有帮助)
编辑
也许看看这个以及他们如何创建添加他们的ActionBar监听器.您的活动需要范围.他们这样做的方法是在Activity/Fragment中定义监听器(通过实现接口),然后将其附加到Tab.这将为您提供范围,可能是一种更稳定的做事方式.
小智 6
如果在调用的片段内创建匿名对象,则会发生这种情况getActiviy().如果getActivity()在片段从片段堆栈弹出后在匿名对象中调用,getActivity()则返回null.此时,片段不再与活动相关联.
| 归档时间: |
|
| 查看次数: |
23530 次 |
| 最近记录: |