从Android Studio中的片段调用方法时如何避免Null指针异常?

时间:2016-01-08 20:00:37

标签: java android xml android-studio

所以我为我的应用创建了一个片段。在片段中,我有一个通过xml文件创建的EditText字段(其id为myText)。现在在我的这个片段的Java类中,我使用命令:

创建对此文本字段的引用
EditText myText = (EditText) getView().findViewById(R.id.myText);

但是,我对此声明发出警告说:

Method invocation `getView().findViewById(R.id.myText)' may produce 'java.lang.NullPointerException'.

此外,当我运行应用时,由于相同的NullPointerException,它会过早终止。我做了完全相同的事情,除了不使用片段(也就是说,我在我的主要活动的xml文件中创建了一个EditText字段)并使用以下命令在Java文件中创建了对它的引用:

EditText myText = (EditText) findViewById(R.id.myText);

它完美无缺。

所以我的问题是,为什么这在第二种情况下有效而不在第一种情况下?如何在第一种情况下使其工作?

2 个答案:

答案 0 :(得分:2)

从官方Android文档中查看此guide

创建片段时,使用LayoutInflater

中提供的onCreateView对片段的视图进行充气
inflater.inflate(R.layout.article_view, container, false);

要在此布局中访问您的观看次数,您可以在findViewById(R.id.yourId);

返回的视图上调用inflater.inflate

所有这一切应该看起来像这样

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.yourLayout, container, false);
    EditText myText = (EditText) view.findViewById(R.id.myText);

    ...
    return view;
}

答案 1 :(得分:1)

这是因为使用getView()您可能无法查看包含所需组件的膨胀布局。还有一个选项是您尝试getView(),而视图尚未创建,因此这也将导致NPE。

您应该初始化视图,确保此View包含您要查找的组件。在Fragment中,它将是

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,    Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_layout, container, false);
    EditText myText = (EditText) v.findViewById(R.id.myText);
    return v;
}