我有一个标签式应用程序,片段作为标签。该应用程序大约5岁。
这与我长期以来的代码相同,但在最近几周,我在 Google控制台崩溃日志中突然出现了几个 nullpointers !
我看不出这段代码怎么可能导致 nullpointer ,所以我希望有人可以看到我不能的东西。
private TextView switchSpace;
@Override
public void onActivityCreated(Bundle savedState) {
super.onActivityCreated(savedState);
initGUIComponents();
checkSpace();
}
private void initGUIComponents() {
switchSpace = getView().findViewById(R.id.rightText);
}
private void checkSpace() {
if (shouldShowComponent) {
switchSpace.setText(textToShow);
switchSpace.setVisibility(View.VISIBLE);
} else {
switchSpace.setVisibility(View.GONE);//NULLPOINTER IN CONSOLE!!
}
}
堆栈跟踪显示在onActivityCreated
中调用checkSpace会导致 nullpointer 。再一次,它一直有效,我总共只有3次崩溃,但仍然如此。怎么会发生这种情况?
指针非常感谢。
编辑,堆栈跟踪:
at x.y.z.tabs.MainFragment.checkSpace(MainFragment.java:268) at x.y.z.tabs.MainFragment.onActivityCreated(MainFragment.java:81) 在android.support.v4.app.Fragment.performActivityCreated(Fragment.java:2363) 在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1442) 在android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1740) 在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1809) 在android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799) 在android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2580) 在android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:2367) 在android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:2
答案 0 :(得分:0)
shouldShowComponent
已初始化?TextView
时,您是否错过了setText(textToShow)
的演员?getView().findViewById(R.id.rightText);
会返回正确的视图(如果有的话)吗?答案 1 :(得分:0)
制作一个像这样的视图对象:
private TextView switchSpace;
private View view;
在片段的Oncreateview中初始化文本视图
//in on create view
// initialize view
view=inflater.inflate(R.layout.yourfragment, container, false);
//find text view
switchSpace = (TextView)view.findViewById(R.id.rightText);
return view;
然后在On activity中创建了什么
@Override
public void onActivityCreated(Bundle savedState) {
super.onActivityCreated(savedState);
checkSpace();
}
答案 2 :(得分:0)
您正在使用getView()
将视图与其ID相关联。根据{{1}}生命周期的文档,可以在Fragment
夸大之前调用getView()
,当发生这种情况时,View
实际上是getView()
因此null
{1}}无法将您的getView()
与ID和TextView
TextView
相关联。当应用尝试在视图上执行null
的操作时,exception
会抛出。因此,只需使用虚增null
将TextView
与其OnCreatView
内的ID相关联即可。这是我的意见,我可能错了,但这可以解释为什么View
总是反而有时(在视图实际膨胀之前调用exception
时)