Содержимое LinearLayout не видно

Я попытался программно добавить некоторые элементы графического интерфейса, такие как ImageView или TextView, в LinearLayout. Но элементы не отображаются.

Чтобы увидеть, нарисован элемент или нет, я устанавливаю для каждого элемента свой цвет фона. В результате я вижу только цвет фона LinearLayout. Но почему?

public class MyLinearLayout extends LinearLayout {
  public MyLinearLayout(Context context) {
    super(context);

    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    setLayoutParams(params);
    setBackgroundColor(Color.RED);


    imageView = new ImageView(context);
    params = new LinearLayout.LayoutParams(100, 100);
    imageView.setLayoutParams(params);
    imageView.setBackgroundColor(Color.BLUE);

    addView(imageView);
  }
}

Странно то, что я вижу красный цвет фона LinearLayout, но в размере ImageView. Если я добавлю некоторые другие элементы графического интерфейса, такие как TextView, я увижу, как растет LinearLayout. Но я не вижу TextView.

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


Это фрагмент файла layout.xml:

<LinearLayout android:layout_width="match_parent"
                  android:layout_height="45dp"
                  android:id="@+id/bottom_bar"
                  android:layout_alignParentBottom="true"
                  android:gravity="bottom">

        <FrameLayout android:id="@+id/block_edit_delete_layout"
                     android:layout_height="match_parent"
                     android:layout_width="wrap_content"
                     android:background="@drawable/block_edit_delete_selector">

            <ImageView android:layout_height="match_parent"
                       android:layout_width="wrap_content"
                       android:src="@drawable/block_edit_delete"
                       android:scaleType="fitXY"
                       android:contentDescription="@string/delete"/>
        </FrameLayout>

        <LinearLayout
                android:id="@+id/block_edit_progress"
                android:layout_height="match_parent"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:gravity="center"
                android:orientation="horizontal"/>

        <FrameLayout android:id="@+id/block_edit_random_layout"
                     android:layout_height="match_parent"
                     android:layout_width="wrap_content"
                     android:background="@drawable/block_edit_delete_selector">

            <ImageView android:layout_height="match_parent"
                       android:layout_width="wrap_content"
                       android:src="@drawable/block_edit_random"
                       android:scaleType="fitXY"
                       android:contentDescription="@string/random_numbers"/>

        </FrameLayout>
    </LinearLayout>

LinearLayout с идентификатором block_edit_progress — это макет контейнера нескольких экземпляров класса MyLinearLayout. Экземпляры добавляются в код:

    for(int i = 0; i < numberOfMyLinearLayouts; i++) {
        MyLinearLayout v = new MyLinearLayout(getContext());
        addView(v);
    }

Надеюсь, это поможет.


person Benny    schedule 19.04.2013    source источник
comment
ваша высота и ширина LinearLayout установлены на wrap_content. Вы не добавили текстовое представление для просмотра   -  person Sankar V    schedule 19.04.2013


Ответы (3)


Если я конвертирую ваш код в xml, это будет что-то вроде:

    <LinearLayout layout_width=wrap_content, layout_height = wrap_content>
    <LinearLayout id= MyLinearLayout>//just an idea, syntax may be wrong
    <LinearLayout layout_width= 100, layout_width=100>
    <ImageView color=BLUE>
    </ImageView>
    </LinearLayout>
    </LinearLayout>
    </LinearLayout>

Всякий раз, когда вы вызываете setLayoutParams для представления, параметр params, который вы указываете, должен быть родительским элементом.

Попробуйте что-то вроде, если вы хотите, чтобы linearlayout был родителем вашего linearlayout, используйте MATCH_PARENT для ширины, высоты, если вы хотите, чтобы ваше представление охватывало ширину, высоту родителя представления.

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
             ViewGroup.LayoutParams.MATCH_PARENT,
             ViewGroup.LayoutParams.MATCH_PARENT);
setLayoutParams(lp);//lp is parent view

Также попробуйте это, на всякий случай, если представления добавляются справа от ваших представлений, и вы не можете видеть их на экране.

yourview.setOrientation(LinearLayout.VERTICAL);
person Sunny    schedule 19.04.2013

Измените ширину и высоту линейного макета на match_parent и посмотрите, как они изменятся. wrap_content будет показывать только содержимое линейного макета, что, по-видимому, является вашей проблемой.

person mco    schedule 19.04.2013

Я решил проблему. (Или нашел обходной путь)

Я переместил все элементы инициализации из конструктора MyLinearLayout. Если я затем добавлю представление после того, как макет был полностью сгенерирован, все будет работать.

Как это:

MyLinearLayout ll = new MyLinearLayout(getContext());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(100, 100);
ll.setLayoutParams(params);
ll.setBackgroundColor(Color.RED);

ImageView v = new ImageView(getContext());
params = new LinearLayout.LayoutParams(50, 50);
v.setLayoutParams(params);
v.setBackgroundColor(Color.GREEN);

ll.addView(v);
addView(ll);

Я не знаю, почему другой способ не работает. Спасибо за быстрые ответы!

person Benny    schedule 22.04.2013