【问题标题】:How to avoid the Null Pointer Exception when calling a method from a fragment in Android Studio? [duplicate]从Android Studio中的片段调用方法时如何避免空指针异常? [复制]
【发布时间】:2026-02-12 22:05:01
【问题描述】:

所以我为我的应用创建了一个片段。在片段中,我通过 xml 文件(其 id 为 myText)创建了一个 EditText 字段。现在,在这个片段的 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);

而且效果很好。

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

【问题讨论】:

  • 这个问题不是重复什么是空指针异常,我该如何解决?。这是关于获取View 的纯Android 问题,而不是关于尚未初始化的变量。 我正在投票重新打开它。
  • 你还觉得不重复吗? ;-)
  • @piotrek1543 请仔细阅读我写的内容。通过将问题标记为重复,您必须链接已经回答的问题。问题什么是空指针异常,我该如何解决? 由 Hrundi 标记不包含答案,它直接回答了 James Bond 的问题。您提供的链接更好,这些链接可能会链接在这篇文章的顶部,在 This question already have an answer here 下: text :)

标签: java android xml android-studio


【解决方案1】:

从官方 Android 文档中查看guide

当您创建片段时,您使用onCreateView 中提供的LayoutInflater 扩充片段的视图

inflater.inflate(R.layout.article_view, container, false);

要访问此布局中的视图,您可以在 inflater.inflate 返回的视图上调用 findViewById(R.id.yourId);

它应该看起来像这样

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;
}

【讨论】:

    【解决方案2】:

    这是因为使用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;
    }
    

    【讨论】: