为啥以编程方式添加我的文本视图时出现 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 错误