Подтвердить что ты не робот

Параметры макета загруженного представления игнорируются

Я пытаюсь написать свой собственный View, и у меня проблема с LayoutParams.

Идея состоит в том, чтобы расширить ViewGroup (LinearLayout)

public class MyView extends LinearLayout{
    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public MyView(Context context) {
        super(context);
    }
    public void putContent(){
        setOrientation(HORIZONTAL);
        LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        for (int i = 0; i < 5; i++){
            View view = inflater.inflate(R.layout.item, null);
            TextView tv = (TextView)view.findViewById(R.id.item_text);
            tv.setText("Item " + i);
            addView(view);
        }
    }
}

Как вы можете видеть, метод putContent раздувает элементы и добавляет к моему представлению. Вот макет элемента

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#FFFFFF">
    <TextView android:text="TextView"
    android:id="@+id/item_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="#000000"/>
</LinearLayout>

И макет главного экрана

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" android:orientation="vertical">
<TextView  
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"
    android_layout_weight="1" 
    android:text="@string/hello"
    />
    <my.test.MyView
    android:id="@+id/my_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android_layout_weight="1"
    />
</LinearLayout>

И код операции

public class Start extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        MyView myView = (MyView)findViewById(R.id.my_view);
        myView.putContent();
    }
}

Вот скриншот о том, что я получаю

enter image description here

Итак, проблема: атрибуты элемента элемента item игнорируются

android:layout_width="match_parent"
android:layout_height="match_parent"

Но в результате я хочу получить что-то вроде этого (я получаю этот результат при замене addView(view); на эту строку)

addView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1F));

enter image description here

Итак, вопрос: как я могу добиться этого результата без жестко закодированных LayoutParams? Спасибо за любую помощь!

Обновление

Я также смотрю переменные поля View в режиме отладки - mLayoutParams - null и стал недействительным, когда я добавляю надутый View в родительский с addView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1F));. enter image description here

Но mLayoutParams дочернего элемента только что загруженного представления не является нулевым. Почему LayoutParams только корневого элемента в макете xml игнорируются при просмотре представления?

4b9b3361

Ответ 1

Используйте следующую инструкцию для раздувания:

View view = inflater.inflate( R.layout.item /* resource id */,
                                         MyView.this /* parent */,
                                         false /*attachToRoot*/);

Ответ 2

Хорошо, если я правильно понимаю, у вас есть XML, упомянутый выше в ll, и вы добавляете к нему что-то (R.layout.item_layout).

Я вижу следующие проблемы:

  • Ваш базовый макет (xml, который был указан, загружен в ll) имеет match_parent, но мы не знаем, имеет ли он даже родителя. Поэтому поведение трудно догадаться.
  • Вы не указали, какие параметры макета для элемента, который вы добавляете (по-прежнему предполагается, что R.layout.item_layout - это не тот xml, который вы указали). Поэтому можно ожидать поведения или даже undefined (поэтому ожидается, что это неожиданно).

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

Кроме того, помните, что не все поля поддержки поиска.

Даже если представление может заполнение, оно не предоставляет никаких поддержка маржи. Однако просмотр группы оказывают такую ​​поддержку. обращаться для ViewGroup и ViewGroup.MarginLayoutParams для Дополнительная информация.

Ответ 3

В параметрах Android "layout_" ссылаются на способ отображения текущего представления в его родительском макете. В этом случае его родительский элемент равен ll, но мы не можем видеть, что это такое.

Что касается компоновки TextView внутри LinearLayout, так как LinearLayout является вертикальным, все его дочерние элементы автоматически имеют свой layout_height, переопределенный "wrap_content", так что они могут быть выложены одним из них под другим.

Итак, теперь вопрос: что вы на самом деле видите и что вы хотите видеть?