所以我为我的应用创建了一个片段。在片段中,我有一个通过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);
它完美无缺。
所以我的问题是,为什么这在第二种情况下有效而不在第一种情况下?如何在第一种情况下使其工作?
答案 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;
}