0

我是 Android 开发和这些论坛的新手,如果您能提供帮助,我将不胜感激。我环顾四周并尝试了其他一些答案,但无处可去。

我编写了一个从 ArrayList 返回随机字符串的 Java 方法。我在主活动布局 XML 上有三个 TextView 元素,我想在按下按钮时设置它们(运行该方法以生成三个随机字符串)。

我该怎么做,每当我在手机上运行该应用程序时,它就会崩溃,所以显然存在一个重大缺陷。

这是我正在调用的方法

public void generateExercises() {


    Exercise e1 = new Exercise();
    Exercise e2 = new Exercise();
    Exercise e3 = new Exercise();

    e1.generateExercise();
    e2.generateExercise();
    e3.generateExercise();

    RelativeLayout lView = new RelativeLayout(this);


    myText1 = (TextView)findViewById(R.id.myText1);
    myText1.setText(e1.getName());

    myText2 = (TextView)findViewById(R.id.myText2);
    myText2.setText(e2.getName());

    myText3 = (TextView)findViewById(R.id.myText3);
    myText3.setText(e3.getName());

    lView.addView(myText1);
    lView.addView(myText2);
    lView.addView(myText3);     

    setContentView(lView);
}
//XML File

<TextView
    android:id="@+id/myText2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/exercise2title"
    android:layout_alignBottom="@+id/exercise2title"
    android:layout_alignLeft="@+id/textView1"
    android:textAppearance="?android:attr/textAppearanceSmall" />

<TextView
    android:id="@+id/myText3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/exercise3title"
    android:layout_alignBottom="@+id/exercise3title"
    android:layout_alignLeft="@+id/TextView01"
    android:textAppearance="?android:attr/textAppearanceSmall" />

<TextView
    android:id="@+id/exercise1title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/title"
    android:layout_marginLeft="39dp"
    android:layout_marginTop="64dp"
    android:text="@string/exercisetitle_one"
    android:textAppearance="?android:attr/textAppearanceMedium" />

谢谢

编辑:错过了带有“myText1”的 XML 部分

 <TextView
    android:id="@+id/myText1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/exercise1title"
    android:layout_alignBottom="@+id/exercise1title"
    android:layout_alignRight="@+id/title"
    android:layout_marginRight="24dp"
    android:textAppearance="?android:attr/textAppearanceSmall" />

编辑:感谢您的所有帮助,代码现在按预期工作。我还必须用自定义的 onClick 侦听器替换 XML onclick 方法。

4

4 回答 4

1

我猜你需要在将文本添加到 TextView 之前将其设置为 Contentview。您尝试将文本添加到尚未创建的 TextView 中。

只需在向其添加文本之前尝试设置 contentView。如果我知道正确,您不需要将 TextViews 添加到 lView,因为您实际上是在 XML 文件中完成的。您实际上确实在 XML 中定义了布局,因此您不需要再次在代码中创建它。只需在 XML 中创建布局并像现在一样填充它。

public void generateExercises() {


Exercise e1 = new Exercise();
Exercise e2 = new Exercise();
Exercise e3 = new Exercise();

e1.generateExercise();
e2.generateExercise();
e3.generateExercise();

setContentView(R.layout.*****); //putyour layoutname here
myText1 = (TextView)findViewById(R.id.myText1);
myText1.setText(e1.getName());

myText2 = (TextView)findViewById(R.id.myText2);
myText2.setText(e2.getName());

myText3 = (TextView)findViewById(R.id.myText3);
myText3.setText(e3.getName());
}

这应该做你想做的事

于 2013-01-17T23:00:57.937 回答
0
public void generateExercises() {
   setContentView(R.layout.xml_file_name);

    Exercise e1 = new Exercise();
    Exercise e2 = new Exercise();
    Exercise e3 = new Exercise();

    e1.generateExercise();
    e2.generateExercise();
    e3.generateExercise();

    myText1 = (TextView)findViewById(R.id.myText1);
    myText1.setText(e1.getName());

    myText2 = (TextView)findViewById(R.id.myText2);
    myText2.setText(e2.getName());

    myText3 = (TextView)findViewById(R.id.myText3);
    myText3.setText(e3.getName());

 }
于 2013-01-17T23:06:11.417 回答
0

从您的 onCreate 方法调用 setContentView(lView)。

之后,您可以获取/设置您的 textViews:

myText1 = (TextView)findViewById(R.id.myText1);
myText1.setText(e1.getName());

您不需要使用 addView,因为视图已经存在于 lView 中(您已经在 xml 中设置了它们)。

所以基本上,

将 contentView 设置为 lView 将采用您的 xml 布局并使用所有视图创建它。之后,您找到 textview ,myText1 = (TextView)findViewById(R.id.myText1);然后设置文本myText1.setText(e1.getName());

查看 logcat 输出以了解发生了什么问题,并尝试 eclipse 的“调试”功能,在“nullPointerException”上设置断点也很有用。在此处发布 logcat 输出可以使我们找出问题所在的速度提高 100 倍!

于 2013-01-17T23:06:29.873 回答
0

XML 中的 myText1 在哪里?

myText1 = (TextView)findViewById(R.id.myText1);
myText1.setText(e1.getName()); //NPE here?
于 2013-01-17T23:11:51.067 回答