Android:在for循环中的每个新视图中设置文本

时间:2013-06-26 17:07:31

标签: android android-layout layout-inflater

所以我有一个XML layout1,它只是一个带有三个文本视图的LinearLayout。我还有另一个带有ScrollView的XML layout2和一个LinearLayout。我正在使用这个for循环来创建ScrollView的LinearLayout中的几个layout2。它工作正常,但我希望能够在for循环中设置每个TextView的文本。我不确定如何访问这些TextView,因为我只能在XML文件中设置一个id,如果我试图在for循环中访问它们的id,这不会导致问题吗?

private void setUpResults() {
        for (int i = 1; i < totalQuestions; i++) {
            parent.addView(LayoutInflater.from(getBaseContext()).inflate(
                    R.layout.result_block, null));

        }
    }

这是result_block xml文件(layout1):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/layoutSelectedAnswer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/border"
        android:orientation="horizontal"
        android:paddingBottom="@dimen/option_padding_bottom"
        android:paddingTop="@dimen/option_padding_top" >

        <TextView
            android:id="@+id/tvOptionALabel2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="4dp"
            android:text="@string/option_a"
            android:textColor="@color/white"
            android:textSize="@dimen/option_text_size" />

        <TextView
            android:id="@+id/tvSelectedAnswer"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="4dp"
            android:text="@string/option"
            android:textColor="@color/white"
            android:textSize="@dimen/option_text_size" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/layoutCorrectAnswer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/border"
        android:orientation="horizontal"
        android:paddingBottom="@dimen/option_padding_bottom"
        android:paddingTop="@dimen/option_padding_top" >

        <TextView
            android:id="@+id/tvOptionBLabel2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="4dp"
            android:text="@string/option_b"
            android:textColor="@color/white"
            android:textSize="@dimen/option_text_size" />

        <TextView
            android:id="@+id/tvCorrectAnswer"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="4dp"
            android:text="@string/option"
            android:textColor="@color/white"
            android:textSize="@dimen/option_text_size" />
    </LinearLayout>

</LinearLayout>

假设我想在每个循环中将带有id为tvCorrectAnswer的TextView设置为不同的String值,我该如何访问它?

2 个答案:

答案 0 :(得分:3)

当然,你可以这样做:

private void setUpResults () {
    LayoutInflater i = LayoutInflater.from(getBaseContext());

    for (int i = 1 /* should be zero? */; i < totalQuestions; i++) {
        View view = i.inflate(R.layout.result_block, parent, false);
        TextView correctAnswer = (TextView) view.findViewById(R.id.tvSelectedAnswer);
        correctAnswer.setText("My Answer Text");
        parent.addView(view);
    }
}

关键是,使用父级作为容器进行扩充,但不要附加它(false参数)。然后,您将获得对膨胀视图的引用,然后您可以直接引用它来执行findViewById()调用(这将限制搜索到特定的ViewGroup)。然后将其添加到父项并继续下一项。

答案 1 :(得分:0)

在ViewGroup中添加了所有视图后,您可以使用ViewGroup.getChildAt(int)获取已插入的视图之一。获得其中一个视图后,您可以访问其任何内部视图。这样的事情。

for(int i = 0; i < parentView.getChildCount();++i) {
  View v = parentView.getChildAt(i);
  Textview tv = (TextView) v.findViewById(R.id.tvOptionALabel2);
  //And so on...
}