异常
Android在一个Fragment中发现有的组件采用findViewById方法获取的结果为null,导致后面抛出空指针异常:
Process: com.lcl100.taskmanage, PID: 29657
java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getId()' on a null object reference
at com.lcl100.taskmanage.fragment.AddTaskFragment$5.onClick(AddTaskFragment.java:225)
at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:164)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
错误代码
该Fragment的错误代码如下:
public class AddTaskFragment extends Fragment implements View.OnClickListener {
private final static String TAG = AddTaskActivity.class.getSimpleName();
private View view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_add_task, container, false);
this.view = view;
// 获取组件
Button addFirstLevelSubTaskButton = view.findViewById(R.id.addFirstLevelSubTaskButton);
addFirstLevelSubTaskButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
addFirstTaskCompetent(addFirstLevelSubTaskButton, view.findViewById(R.id.secondSubTaskLinearLayout));
}
});
return view;
}
}
即发现 view.findViewById(R.id.secondSubTaskLinearLayout)的结果为null。
原因
调试发现按钮监听器setOnClickListener里面的view表示的是按钮addFirstLevelSubTaskButton 视图,而不是外面这个Fragment的视图,所以导致获取不到组件。
解决
不要在setOnClickListener用view.findViewwById方法,因为它里面的view和外面的view重名了,导致调用的是内部的那个。解决办法是在外部把这个变量声明好,即:
LinearLayout secondSubTaskLinearLayout = view.findViewById(R.id.secondSubTaskLinearLayout);
addFirstLevelSubTaskButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
addFirstTaskCompetent(addFirstLevelSubTaskButton, secondSubTaskLinearLayout);
}
});
正确代码
public class AddTaskFragment extends Fragment implements View.OnClickListener {
private final static String TAG = AddTaskActivity.class.getSimpleName();
private View view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_add_task, container, false);
this.view = view;
// 获取组件
Button addFirstLevelSubTaskButton = view.findViewById(R.id.addFirstLevelSubTaskButton);
LinearLayout secondSubTaskLinearLayout = view.findViewById(R.id.secondSubTaskLinearLayout);
addFirstLevelSubTaskButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
addFirstTaskCompetent(addFirstLevelSubTaskButton, secondSubTaskLinearLayout);
}
});
return view;
}
}
1862

被折叠的 条评论
为什么被折叠?



