如何在main.xml中定义的LinearLayout中动态添加多个TextView

9

我知道可以在LinearLayout中添加一些布局,例如ButtonTextView。根据for循环的条件,我想创建多个TextView

我已经尝试了自己的方法,但是无法创建它。有人知道如何创建吗?

根据条件,for循环将不同。请帮助我解决这个问题。是否可以创建TextView数组?

我已经设置了布局。

setContentView(R.layout.result_page);

我使用函数将那个视图添加到我的现有视图中:

该函数为:

public void addAll()
{
     LinearLayout layout = (LinearLayout)findViewById(R.id.myLayout);     
     layout.setOrientation(1);       
     TextView name[] = null;     
     TextView website[] = null;     
     TextView category[] = null;        
     for (int i = 0; i < 5; i++) 
     {         
         name[i] = new TextView(this);         
         name[i].setText("Name = Shreyash");         
         website[i] = new TextView(this);         
         website[i].setText("Website = shreyah.co.cc");         
         category[i] = new TextView(this);         
         category[i].setText("Website Category = OWN");         
         layout.addView(name[i]);         
         layout.addView(website[i]);         
         layout.addView(category[i]);     
    } 
}

但在此之后,如果我运行应用程序,则会显示以下错误信息:
09-08 11:03:28.755: ERROR/AndroidRuntime(318): FATAL EXCEPTION: main
09-08 11:03:28.755: ERROR/AndroidRuntime(318): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.quiz.spellingquiz/com.quiz.spellingquiz.ResultDisplayPage}: java.lang.NullPointerException
09-08 11:03:28.755: ERROR/AndroidRuntime(318):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
09-08 11:03:28.755: ERROR/AndroidRuntime(318):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
09-08 11:03:28.755: ERROR/AndroidRuntime(318):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
09-08 11:03:28.755: ERROR/AndroidRuntime(318):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
09-08 11:03:28.755: ERROR/AndroidRuntime(318):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-08 11:03:28.755: ERROR/AndroidRuntime(318):     at android.os.Looper.loop(Looper.java:123)
09-08 11:03:28.755: ERROR/AndroidRuntime(318):     at android.app.ActivityThread.main(ActivityThread.java:4627)
09-08 11:03:28.755: ERROR/AndroidRuntime(318):     at java.lang.reflect.Method.invokeNative(Native Method)
09-08 11:03:28.755: ERROR/AndroidRuntime(318):     at java.lang.reflect.Method.invoke(Method.java:521)
09-08 11:03:28.755: ERROR/AndroidRuntime(318):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-08 11:03:28.755: ERROR/AndroidRuntime(318):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-08 11:03:28.755: ERROR/AndroidRuntime(318):     at dalvik.system.NativeStart.main(Native Method)
09-08 11:03:28.755: ERROR/AndroidRuntime(318): Caused by: java.lang.NullPointerException
09-08 11:03:28.755: ERROR/AndroidRuntime(318):     at com.quiz.spellingquiz.ResultDisplayPage.addAll(ResultDisplayPage.java:59)
09-08 11:03:28.755: ERROR/AndroidRuntime(318):     at com.quiz.spellingquiz.ResultDisplayPage.onCreate(ResultDisplayPage.java:34)
09-08 11:03:28.755: ERROR/AndroidRuntime(318):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
09-08 11:03:28.755: ERROR/AndroidRuntime(318):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
09-08 11:03:28.755: ERROR/AndroidRuntime(318):     ... 11 more

关于这个问题,我哪里做错了?

我使用DeeV的代码得到了如下结果:
enter image description here

但是我想要将单词设置在word标签下,答案设置在answer标签下。但是这可能吗? 我认为我需要再设置一个LinearLayout。我该如何为这种外观设置另一个LinearLayout?


请添加一些示例代码以展示您已经尝试过的内容。这将帮助我们看到哪些部分不起作用。 - Eric Levine
2个回答

12

只有在需要后续更改 TextViews 的情况下,才需要创建一个数组。但是,如果确实需要创建数组,则可以使用以下代码:

List<TextView> textList = new ArrayList<TextView>(NUM_OF_TEXTS);
for(int i = 0; i < NUM_OF_TEXTS; i++)
{
   TextView newTV = new TextView(context);
   newTV.setText("New message.");
   newTV.setTextColor(0xFFFF0000);
   /**** Any other text view setup code ****/
   myLinearLayout.addView(newTV);
   textList.add(newTV);
}
如果文本创建后是静态的,那么您可以简单地从代码中删除对列表的任何引用,它仍将添加到 LinearLayout 中。 编辑: 假设我正确理解了您的问题,您希望布局类似于此:
Word:
Big
Answer:
42

Word:
Small
Answer:
Tough

Word:
Example
Answer:
Another Answer

在这种情况下,你真的不需要做太多事情。 LinearLayout 会按照 addView 放置视图的顺序进行排列。为了更新我之前的代码,这应该可以工作:

List<TextView> wordList = new ArrayList<TextView>(NUM_OF_WORDS);
List<TextView> answerList = new ArrayList<TextView>(NUM_OF_ANSWERS);

for(int i = 0; i < NUM_OF_WORDS; i++){
   TextView blankText = new TextView(context);
   TextView wordText = new TextView(context);
   TextView answerText = new TextView(context);
   blankText.setText(" ");
   wordText.setText("Word:");
   answerText.setText("Answer:");

   TextView newWord = new TextView(context);
   newWord.setText(**** some method of getting the word ****);
   TextView newAnswer = new TextView(context);
   newAnswer.setText(**** some method of getting the answer ****);
   /**** Any other text view setup code ****/

   myLinearLayout.addView(wordText);
   myLinearLayout.addView(newWord);
   myLinearLayout.addView(answerText);
   myLinearLayout.addView(newAnswer);
   myLinearLayout.addView(blankText);

   wordList.add(newWord);
   answerList.add(newAnswer);
}

好的,您的代码可以工作。但我希望所有的TextView都是垂直方向排列的。整个布局的背景是透明的,这样我就可以展示我的主要布局设计或背景。那该怎么实现呢? - Shreyash Mahajan
你好DeeV,我已经实现了你的代码。它可以工作,但是我想要做一些更改。请查看我的编辑后的问题,并指导我。谢谢。 - Shreyash Mahajan
我能想到最简单的方法是使用LinearLayout.LayoutParams。将所需的gravity添加到LayoutParams中,然后通过“setLayoutParams()”将其传递给TextView。还有更复杂但更好的方法,但我认为这对于本示例来说是最简单的。http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html - DeeV
我无法让这段代码工作。我尝试通过new(context)获取myLinearLayout实例,并注释掉setContentView(R.layout.activity_display_textViews);,但是当我的布局渲染时,它完全为空。 - Alejandro Lozdziejski
你需要调用 setContentView(mLinearLayout) 方法,这样你的 Activity 才有一个视图可以显示。 - DeeV
显示剩余2条评论

2
        LinearLayout lila = new LinearLayout(this);
        ArrayList<Button> alb = new ArrayList<Button>();
        int nButton = 10;
        for (int i = 0; i < nButton; i++)
        {
            alb.add(new Button(this));
            lila.addView(alb.get(i));
        }
        //works the same way with TextView
        alb.get(5).setText("myButton");

也许这可以帮助你。
编辑:抱歉,严格与DeeV相同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接