【问题标题】:OnCreateView NullPointerExceptionOnCreateView NullPointerException
【发布时间】:2015-06-11 04:11:56
【问题描述】:

我在 Google Play 商店中有一个应用程序。我通过 Crashlytics/Fabric 收到崩溃通知,所以我没有真正的 LogCat 可供参考。此外,我无法弄清楚如何在我自己的系统上复制此错误。

我从 Crashlytics 得到的错误如下:

com.company.appname.Fragment.onCreateView (Fragment.java:48)

这是类声明的相关细节:

import android.support.v4.app.Fragment;
public class MyTypeFragment extends Fragment {...

以下是该片段部分的代码:

44 mRestartButton = (Button)contentView.findViewById(R.id.restart_button);
45 mRestartButton.setTypeface(regularTf);
46 mRestartButton.setOnClickListener(new View.OnClickListener() {
47     @Override
48     public void onClick(View v) {
49         getFragmentManager().popBackStack("startingFragment", 0);
50     }
51 });

我觉得有趣的是,崩溃报告将崩溃列为 onCreateView() 方法,但第 48 行是我按钮的 onClickListeneronClick() 方法的声明。

我研究了以下问题:

在访问此片段的 XML 时,它们似乎都表明问题与不正确的 id 有关。但是,我认为这不是问题所在,因为这是该片段的 XML 部分(并且该片段只有一个布局):

<LinearLayout
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:orientation="vertical"

    >

    <Button
        android:id="@+id/restart_button"
        android:layout_gravity="right"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:paddingBottom="8dp"
        android:paddingTop="8dp"
        android:text="Restart"

        />

可能需要关注的一件事:我在我的许多片段上都使用了相同的范例。该应用程序的功能是钻取一系列问题以获得答案。 “重置”按钮允许他们一路回到起点,而无需经过他们一路上看到的任何中间片段。这些片段中的每一个都有一个以R.id.reset_button 命名的按钮。不过,正如我所说,我试图在我的最后复制这个问题,但无法弄清楚它是如何发生的。

我读过一些资料,表明此问题可能与某个片段以某种方式与其活动分离有关,但我什至尝试离开我的应用并返回,但仍然无法复制此错误。

【问题讨论】:

  • ...或者布局可能是特定于平台的...您提供的信息无法回答这个问题...
  • @Selvin 我不明白你的评论是什么意思。你能详细说明一下吗?我对每个片段只有一个布局。平台的变化会有什么影响?
  • 点击监听器is inside onCreateView - 所以报告很好,很可能崩溃发生在这里:getFragmentManager().popBackStack("startingFragment", 0);
  • @Selvin 不,就像我说的,所有片段只有一种布局。这是一个相当简单的应用程序 UI。

标签: android android-fragments nullpointerexception


【解决方案1】:

我假设代码适用于许多设备,并且该错误不容易重现。我唯一的建议是我自己的编码技术是将发布的代码移动到onViewCreated() 方法而不是onCreateView()。原因是有时onCreateView 无法完成及时处理 GUI 布局。至少,这很容易尝试。祝您在使用不同设备进行测试时好运。

示例代码:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    return inflater.inflate(R.layout.list_layout, container, false);
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
   Context thisContext = view.getContext();

   mRestartButton = (Button) view.findViewById(R.id.restart_button);
   mRestartButton.setTypeface(regularTf);
   mRestartButton.setOnClickListener(new View.OnClickListener() {
   ...

注意事项:

  • onCreateView() 改为只返回根视图传递给onViewCreated()
  • onViewCreated() 现在正在做 UI 工作。

【讨论】:

  • 这样做的后果是什么?我该怎么做呢?我是否仍然在 onCreateView() 中关联/填充我的班级的 UI 变量,还是 all 被移动到 onViewCreated()
  • @mbm29414,我在帖子和笔记中添加了示例代码。如您所见,变化不大。
  • 感谢您的更新。我将使用什么来替代使用onCreateView() 中的充气机创建的contentView 变量?是 View view 传递给 onViewCreated(),还是我必须以其他方式访问/创建它?
  • @mbm29414,哎呀,这是我的错。我只是从我的项目中复制代码。只需使用 view.findViewById。我编辑了我的帖子,希望其他人可以简单地从帖子中复制代码。
  • 我是这么想的,但我只是想确定一下。那么,您对创建的每个片段都执行此操作吗?有什么需要注意的实际副作用或“陷阱”吗?
猜你喜欢
  • 2013-03-16
  • 2013-02-18
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
相关资源
最近更新 更多