【问题标题】: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_width="80dp"
    android:layout_height="40dp"
    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,你是对的!在我膨胀布局之后,事情就变得正确了。您能否将您的评论移至答案,以便我接受您的答案?

标签: android android-layout android-emulator android-widget android-manifest


【解决方案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,只需选择一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      • 2014-04-26
      • 2011-03-13
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      相关资源
      最近更新 更多