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

Posted

技术标签:

【中文标题】如何动态添加多个TextView到main.xml中定义的LinearLayout【英文标题】:How to add multiple TextView dynamically to the define LinearLayout in main.xml 【发布时间】:2011-11-12 04:20:38 【问题描述】:

我知道可以将ButtonTextView 等一些布局添加到LinearLayout。我想根据 for 循环的条件创建多个 TextView

我用自己的方式尝试过,但我无法创建它。有人知道怎么制作吗?

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

我已经设置了布局

setContentView(R.layout.result_page);

我正在使用 Function 将该视图添加到我现有的视图中:

功能是:

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 ComponentInfocom.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 的代码得到了这样的结果:

但我想在标签word下设置Word,在标签answer下设置Answer。但怎么可能呢? 我想我必须为此设置另一个 LinearLayout。我如何为这种类型的外观设置另一个 LinearLayout?

【问题讨论】:

请添加一些示例代码来展示您已经尝试过的内容。这将帮助我们了解什么是不工作的。 @Jack:请看我更新的问题。 @elevine:请查看更新后的问题。 【参考方案1】:

如果您以后需要更改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);

【讨论】:

好的,您的代码有效。但我希望所有文本视图都进入垂直方向。并且整个布局的背景是透明的,因此我可以显示 myMainLayout 设计或背景。那怎么可能呢? 你好 DeeV,我已经实现了你的代码。它有效,但我想做一些改变。请参阅我编辑的问题。并指导我。谢谢。 将 LinearLayout 视为堆栈。你想要一个垂直方向,所以你所要做的就是添加 TextViews 以获得垂直堆栈。这就是 LinearLayout 的美妙之处,因为它非常简单。我将编辑一个我认为可行的示例。 好的。我得到了它。你知道如何设置重力吗?因为我无法设置 ImageView 的重力。我可以设置 textView 的 Gravity 但不能设置 Image View。 我能想到的最简单的方法是 LinearLayout.LayoutParams。将您想要的重力添加到 LayoutParams,然后通过 setLayoutParams() 将其传递给 TextView。有更复杂但更好的方法,但我认为这对于这个例子来说是最简单的。 developer.android.com/reference/android/widget/…【参考方案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 完全相同。

【讨论】:

以上是关于如何动态添加多个TextView到main.xml中定义的LinearLayout的主要内容,如果未能解决你的问题,请参考以下文章

如何动态地使这个子 Fragment 的 TextView 可见/不可见?

如何动态更改多个TextView中的文本? [重复]

安卓如何使用WebView组件加载HTML代码

将 TextView 动态水平添加到等权线性布局

android 动态设置TextView值,例:金额添加

在代码中将widget/TextView动态添加到RelativeLayout