Как использовать addView для добавления представления в макет?

Я прочитал, вероятно, все сообщения и документацию, но я все еще не могу решить эту проблему.

Я хочу использовать метод addView(), чтобы добавить вид к существующему (работающему) макету, но по какой-то причине я не могу. Я знаю, что это должно быть легко и просто, но все же я не могу этого сделать. Пожалуйста, помогите мне.

Вот код:

LinearLayout layout = (LinearLayout)findViewById(R.id.mainLayout);
TextView text       = new TextView(this);
text.setText("test");
layout.addView(text);

Это код, и в результате я отобразил только те представления, которые определены в файле XML. Нет этого нового представления, которое я добавил. Когда я отлаживаю, я вижу это добавленное представление как дочернее для родителя, к которому я его добавил, но оно не отображается.

вот main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
                android:id="@+id/mainLayout"
              android:layout_width="fill_parent" 
              android:layout_height="fill_parent"
              android:orientation="vertical"
              android:background="@drawable/main1" >
    <TextView android:id="@+id/app_title"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:textColor="#FFF"
              android:text="@string/app_title"
              android:textSize="25dp" 
              android:gravity="center_horizontal"/>
    <TextView android:layout_width="fill_parent" 
              android:layout_height="wrap_content"
              android:layout_marginTop="5dp"
              android:text="@string/main_screen_counter_title"
              android:textSize="15dp" 
              android:textColor="#FFF"
              android:gravity="center_horizontal"/>
   <TextView android:id="@+id/frontScreenCounter"
              android:layout_width="fill_parent" 
              android:layout_height="wrap_content"
              android:textColor="#FFF"
              android:text="@string/reading"
              android:textSize="33dp"
              android:gravity="center_horizontal" />   
    <GridView android:id="@+id/gridview"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:columnWidth="90dp"
    android:numColumns="3"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="10dp"
    android:stretchMode="columnWidth"
    android:gravity="center"
    android:textColor="#888"
/>
</LinearLayout>

Пожалуйста помоги. Это сведет меня с ума!


person Majstor    schedule 09.07.2012    source источник
comment
Не могли бы вы добавить макет, где вы хотите добавить TextView?   -  person user    schedule 09.07.2012
comment
Привет, Luksprog, это произошло потому, что android:layout_height=fill_parent в атрибутах LinearLayout. Теперь я отобразил текст, но в нижней части экрана. Как поставить наверх? Вы помогли мне. Косвенно, но все же. Tnx много.   -  person Majstor    schedule 09.07.2012
comment
Если вы хотите поместить этот TextView в определенную позицию, вы должны использовать другой вариант метода addView, который принимает int, позицию, в которую нужно поместить новый View, что-то вроде этого: addView(text, 0);   -  person user    schedule 09.07.2012
comment
Сделанный! Вот и все! Tnx много еще раз. Отличная скорость. Заботиться.   -  person Majstor    schedule 09.07.2012


Ответы (4)


Вы забыли указать LayoutParameters для недавно добавленного представления.

LinearLayout layout = (LinearLayout)findViewById(R.id.mainLayout);
    TextView text=new TextView(this);
    text.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    text.setText("test");
    layout.addView(text);

ИЗМЕНИТЬ

GridView с идентификатором @+id/gridview определяется с высотой макета fill_parent, поэтому у вас нет места для добавления нового представления. Изменение его высоты на wrap_content может решить вашу проблему.

Добавление моего комментария к этому сообщению, чтобы помочь другим легко проверить решение.

person Arun George    schedule 09.07.2012
comment
Какие параметры я должен назначить? Я пытался добавить поля, ширину, высоту, но все равно ничего. - person Majstor; 09.07.2012
comment
Можете ли вы опубликовать свой mainlayout.xml? Потому что код Аруна работает и для меня. - person firefistace; 09.07.2012
comment
Я попробовал ваш код и все равно ничего. Он есть как дочерний элемент этого родителя, но не отображается. Есть еще идеи? Спасибо за ваши усилия. - person Majstor; 09.07.2012
comment
С предоставленным вами кодом это единственное решение, которое я могу придумать. Возможно, если вы разместите больше кода, ошибку можно будет определить. - person Arun George; 09.07.2012
comment
GridView с идентификатором @+id/gridview определяется с высотой макета fill_parent, поэтому у вас нет места для добавления нового представления. Изменение его высоты на wrap_content может решить вашу проблему. - person Arun George; 09.07.2012
comment
Tnx Анун. Я изменил атрибут LinearLayout высоты на содержимое обертки, и теперь я отобразил текст внизу. Большое спасибо за ваше время. Вы действительно очаровываете меня этим живым чатом. Удивительно! - person Majstor; 09.07.2012
comment
Да, очень нужный совет! Спасибо! - person PavelGP; 27.07.2016

Я не помню, но, возможно, есть какой-то метод «обновления», чтобы снова загрузить макет.

Попробуйте layout.invalidate();

person Fustigador    schedule 09.07.2012
comment
Пробовал, все равно ничего. Есть еще идеи? - person Majstor; 09.07.2012
comment
@Majstor Invalidate(); должен вызываться на макете верхнего уровня, вы вызывали его из этого объекта? - person ForceMagic; 13.02.2014

У меня была такая же проблема, и я потратил несколько времени на поиск причины.

Моя ошибка заключалась в том, что я добавлял CustomView, у которого в качестве высоты было установлено match_parent.

Я надеюсь сэкономить драгоценное время всем, кто сделал эту глупую досадную ошибку :)

TextView tv = new TextView(this);
lytMarks.addView(tv);


CustomView cv = new CustomView(this, someObject);
lytMarks.addView(cv); // <-- This one had height = match_parent!!


EditText et = new EditText(this);
lytMarks.addView(et);
person voghDev    schedule 12.12.2016

Ваш контент linearLayout находится над представлением родителя. поэтому вам нужно использовать ScrollView. как это:

<?xml version="1.0" encoding="utf-8"?>

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<LinearLayout
    android:id="@+id/mainLayout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/main1"
    android:orientation="vertical">

    <TextView
        android:id="@+id/app_title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="@string/app_title"
        android:textColor="#FFF"
        android:textSize="25dp" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:gravity="center_horizontal"
        android:text="@string/main_screen_counter_title"
        android:textColor="#FFF"
        android:textSize="15dp" />

    <TextView
        android:id="@+id/frontScreenCounter"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="@string/reading"
        android:textColor="#FFF"
        android:textSize="33dp" />

    <GridView
        android:id="@+id/gridview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:columnWidth="90dp"
        android:gravity="center"
        android:horizontalSpacing="10dp"
        android:numColumns="3"
        android:stretchMode="columnWidth"
        android:textColor="#888"
        android:verticalSpacing="10dp" />
</LinearLayout>
</ScrollView>
person peter zhang    schedule 12.12.2016