Android: один и тот же xml действует по-разному в зависимости от того, где я его раздуваю, и я не знаю, почему - PullRequest
0 голосов
/ 11 сентября 2011

Почему некоторые представления в линейном макете в представлении прокрутки заполняют родительский элемент, если для параметра fill_parent задано значение, когда оно надувается непосредственно из xml, а не при добавлении через пользовательский компонент, который надувает тот же xml?

Результат раздувания одного и того же xml в двух разных местах:

http://imgur.com/DF6kl

Верхний элемент этих двух элементов является результатом надувания xml в классе, расширяющем linearLayout, и последующего добавления этого класса к linearLayout в представлении прокрутки. Это представление не заполняет родителя, и я не могу понять, почему.

Нижний элемент - это результат раздувания xml непосредственно в действии, в котором все это содержится. Похоже, как я ожидал.

Это код, который добавляет два вида в упражнении:

scrollList.addView(new CommunityTaskListItem(this, null));
scrollList.addView(View.inflate(getBaseContext(), R.layout.communitytask, null));

Это код, который раздувает активность в классе пользовательского компонента "CommunityTaskListItem":

View communityTask = View.inflate(context, R.layout.communitytask, null);
addView(communityTask);

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

Для примера, здесь раздувается xml: РЕДАКТИРОВАТЬ: Я дал вам неправильный один раньше !!! Вот правильный:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent" android:layout_height="wrap_content">
    <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/linearLayout1" android:background="@drawable/plainbutton" android:layout_marginBottom="5px" android:layout_marginTop="5px" android:layout_weight="1">
        <TextView android:layout_height="wrap_content" style="@style/CommunityTaskText" android:layout_width="fill_parent" android:layout_weight="1" android:id="@+id/textViewCommunityTaskTimes" android:text="xx:xx - xx:xx"></TextView>
        <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" style="@style/CommunityTaskText" android:id="@+id/textViewCommunityTaskDescription" android:text="Task"></TextView>
    </LinearLayout>

</LinearLayout>

Я бы хотел сохранить пользовательский компонент и не раздувать xml в своей деятельности, если бы мог.

РЕДАКТИРОВАТЬ: Код, где накачан CommunityTaskListItem:

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

public class CommunityTaskListItem extends LinearLayout {

    TextView textViewCommunityTaskTimes;
    TextView textViewCommunityTaskDescription;

    public CommunityTaskListItem(Context context, AttributeSet attrs) {
        super(context, attrs);

        View communityTask = View.inflate(context, R.layout.communitytask, null);
        addView(communityTask);

        textViewCommunityTaskTimes = (TextView)findViewById(R.id.textViewCommunityTaskTimes);
        textViewCommunityTaskDescription = (TextView)findViewById(R.id.textViewCommunityTaskDescription);

    }
...

РЕДАКТИРОВАТЬ: Все работает сейчас! Вот окончательный код для всех остальных, если у них есть похожая проблема: Конструктор для пользовательского объекта:

    public CommunityTaskListItem(Context context, AttributeSet attrs) {
        super(context, attrs);

        setOrientation(VERTICAL);
        addView(inflate(context, R.layout.communitytask, null));

        textViewCommunityTaskTimes = (TextView)findViewById(R.id.textViewCommunityTaskTimes);
        textViewCommunityTaskDescription =     (TextView)findViewById(R.id.textViewCommunityTaskDescription);
    }

Пользовательский объект xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/linearLayout1" android:background="@drawable/plainbutton" android:layout_marginBottom="5px" android:layout_marginTop="5px" android:layout_weight="1">
        <TextView android:layout_height="wrap_content" style="@style/CommunityTaskText" android:layout_width="fill_parent" android:layout_weight="1" android:id="@+id/textViewCommunityTaskTimes" android:text="xx:xx - xx:xx"></TextView>
        <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" style="@style/CommunityTaskText" android:id="@+id/textViewCommunityTaskDescription" android:text="Task"></TextView>
    </LinearLayout>

</LinearLayout>

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

1 Ответ

2 голосов
/ 11 сентября 2011

Первая строка должна быть:

scrollList.addView(new CommunityTaskListItem(this, null)
    new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

Вы вызываете inflate() внутри CommunityTaskListItem класса, и раздутое представление становится дочерним представлением представления CommunityTaskListItem. Но вы не устанавливаете ширину и высоту для этого представления, чтобы оно не совпадало с шириной его родителя.

РЕДАКТИРОВАТЬ : Я думаю, ваш XML должен выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<packagename.CommunityTaskListItem
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent" android:layout_height="wrap_content">
    <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/linearLayout1" android:background="@drawable/plainbutton" android:layout_marginBottom="5px" android:layout_marginTop="5px" android:layout_weight="1">
        <TextView android:layout_height="wrap_content" style="@style/CommunityTaskText" android:layout_width="fill_parent" android:layout_weight="1" android:id="@+id/textViewCommunityTaskTimes" android:text="xx:xx - xx:xx"></TextView>
        <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" style="@style/CommunityTaskText" android:id="@+id/textViewCommunityTaskDescription" android:text="Task"></TextView>
    </LinearLayout>

</packagename.CommunityTaskListItem>

где packagename - имя пакета класса CommunityTaskListItem.

В этом случае вам следует изменить CommunityTaskListItem:

public class CommunityTaskListItem extends LinearLayout {

    TextView textViewCommunityTaskTimes;
    TextView textViewCommunityTaskDescription;

    public CommunityTaskListItem(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onFinishInflate() {
        textViewCommunityTaskTimes = (TextView)findViewById(R.id.textViewCommunityTaskTimes);
        textViewCommunityTaskDescription = (TextView)findViewById(R.id.textViewCommunityTaskDescription);
    }

    // ....
}

Этот класс не может быть создан с использованием его конструктора. Можно только надуть.

Второй способ - накачать детей в конструкторе, как вы. Но XML должен отличаться:

<?xml version="1.0" encoding="utf-8"?>
<merge
  xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/linearLayout1" android:background="@drawable/plainbutton" android:layout_marginBottom="5px" android:layout_marginTop="5px" android:layout_weight="1">
        <TextView android:layout_height="wrap_content" style="@style/CommunityTaskText" android:layout_width="fill_parent" android:layout_weight="1" android:id="@+id/textViewCommunityTaskTimes" android:text="xx:xx - xx:xx"></TextView>
        <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" style="@style/CommunityTaskText" android:id="@+id/textViewCommunityTaskDescription" android:text="Task"></TextView>
    </LinearLayout>

</merge>

CommunityTaskListItem будет: Открытый класс CommunityTaskListItem расширяет LinearLayout {

    TextView textViewCommunityTaskTimes;
    TextView textViewCommunityTaskDescription;

    public CommunityTaskListItem(Context context) {
        this(context, null);
    }

    public CommunityTaskListItem(Context context, AttributeSet attrs) {
        super(context, attrs);

        setOrientation(VERTICAL);
        inflate(context, R.layout.communitytask);

        textViewCommunityTaskTimes = (TextView)findViewById(R.id.textViewCommunityTaskTimes);
        textViewCommunityTaskDescription = (TextView)findViewById(R.id.textViewCommunityTaskDescription);
    }

    // ....
}

Этот класс может быть создан с использованием его конструктора и накачан из XML. Но если вы хотите его раздуть, вы должны создать отдельный XML-файл. Давайте назовем это task.xml.

<?xml version="1.0" encoding="utf-8"?>
<packagename.CommunityTaskListItem
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent" android:layout_height="wrap_content"/>

И вот как вы можете его использовать:

scrollList.addView(new CommunityTaskListItem(this),
    new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
scrollList.addView(View.inflate(getBaseContext(), R.layout.task, null));
...