Как динамически добавить несколько TextView в определение LinearLayout в main.xml - PullRequest
8 голосов
/ 07 сентября 2011

Я знаю, что можно добавить некоторые макеты, такие как Button и TextView к LinearLayout. Я хочу создать более одного TextView на основе условия цикла for.

Я попробовал это по-своему, но не могу его создать. Кто-нибудь знает, как его создать?

Цикл 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 для этого типа внешнего вида?

Ответы [ 2 ]

12 голосов
/ 07 сентября 2011

Вам нужно создать массив, только если вам нужно изменить 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.

EDIT:

Если я правильно понимаю ваш вопрос, вы хотите, чтобы макет был примерно таким:

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);
}
2 голосов
/ 07 сентября 2011
        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.

...