为啥以编程方式添加我的文本视图时出现 NullPointerException?

Posted

技术标签:

【中文标题】为啥以编程方式添加我的文本视图时出现 NullPointerException?【英文标题】:Why NullPointerException when programmatically add my text view?为什么以编程方式添加我的文本视图时出现 NullPointerException? 【发布时间】:2011-10-10 21:36:31 【问题描述】:

我以编程方式在我的 Activity 中创建了一个线性布局,如下所示:

LinearLayout myContent = new LinearLayout(this);
myContent.setOrientation(LinearLayout.VERTICAL);

然后,我在 xml 中定义了一个文本视图(在 res/layout/ 下),如下所示:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/name_text"
    android:layout_
    android:layout_
    android:gravity="center"
/>

之后,我想以编程方式将上面定义的几个TextView 添加到myContent 线性布局中,如下所示:

//my content is a linear layout
LinearLayout myContent = new LinearLayout(this);
myContent.setOrientation(LinearLayout.VERTICAL);

for(int i=0; i<10; i++)
  //get my text view resource
  TextView nameField = (TextView)findViewById(R.id.name_text);


  nameField.setText("name: "+Integer.toString(i)); //NullPointerException here


myContent.addView();

我认为上面的代码应该在 myContent 线性布局中添加 10 个带有名称的 TextView。但我最终在nameField.setText(...); 得到一个NullPointerException(见上面的代码)为什么?

附注(更新)

myContent 线性布局被添加到 main.xml 中定义的另一个线性布局中,我的活动 setContentView(R.layout.main)

【问题讨论】:

在附加布局之前,您的 setContentView(R.layout.youtrlayoutid) 在哪里? @sat ,查看我的更新,我做了 setContentView(R.id.main),上面所有的布局代码只是我的 main.xml 的一部分,我用上面的代码来实现动态布局功能 您应该使用 Inflater 来使用这些文本字段! 如果您的 R.id.name_text 在另一个布局中,您必须扩展该布局,然后附加它,因为当您调用 R.id.name_text 的引用时,由于您的布局无法找到它除非膨胀,否则不存在。 @sat,你是对的!在我膨胀布局之后,事情就变得正确了。您能否将您的评论移至答案,以便我接受您的答案? 【参考方案1】:

如果您的 R.id.name_text 在另一个布局中,您必须为该布局充气然后附加它, 因为当您引用 R.id.name_text 时,找不到它,因为您的布局不存在,除非它膨胀。

例如

查看子级 = getLayoutInflater().inflate(R.layout.child); myContent.addView(child);

【讨论】:

【参考方案2】:

问题出在这一行

 TextView nameField = (TextView)findViewById(R.id.name_text);

。查看布局文件中的拼写不匹配。并确保setContentView(R.layout.main);我运行了您的代码。它运行良好。

【讨论】:

@Rasel ,与 R.id.name_text 的拼写不匹配在哪里???我不明白。关于 R.id.main 这只是我的错字。 如果您将布局设置为 setContentView(R.layout.main);其中 main 是您的布局文件,那里是否有任何名为 name_text 的 TextView,那么您的代码就可以了。所以我告诉你看看 什么是 R.id.main。你没有使用 setContentView @Rasel,是的,我正在使用 R.layout.main,请忘记这个。只是有些误会。你如何看待@sat 的评论,他提到首先膨胀布局,因为我的 TextView(id=name_text) 是一个布局文件。虽然你在运行代码时没有问题,但我仍然有同样的问题,所以我认为他的话值得考虑。【参考方案3】:

您还没有使用布局文件调用 setContentView(...)。听起来您可能想要做的是在代码中创建 10 个视图并对其应用一些样式。

您无法使用 findViewById(...) 访问这 10 个视图,因为您的布局文件只指定了一个视图。您还可以将该布局导入主布局文件 10 次,并将 LinearLayout 定义为父视图。

【讨论】:

@ScouseChris,查看我的更新,我做了setContentView(R.id.main),上面所有的布局代码只是我main.xml的一部分,我用上面的代码来实现动态布局功能【参考方案4】:

看看这个Link复选框。您正在做的是动态创建布局并使用 xml,只需选择一个。

【讨论】:

以上是关于为啥以编程方式添加我的文本视图时出现 NullPointerException?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式(但不是以声明方式)实例化小部件时出现 Dojo 重复 ID 错误

在 swift 中以编程方式在堆栈视图中添加标签和文本视图

用户输入不适用于在表格视图中以编程方式添加的文本字段

标签文本增加时如何以编程方式增加集合视图单元格高度?

从自定义视图访问 RelativeLayout 时出现 NullPointerException

以编程方式在活动视图顶部添加自定义视图