Композитный компонент Android, созданный во время выполнения - PullRequest
0 голосов
/ 27 мая 2011

Greets. Я работаю над проектом и думал, что сверну составной компонент. Я выложил их в xml и написал новый класс, расширяющий LinearLayout. В основном мне понадобится пять или шесть из них в Деятельности. Я хочу создать их внутри Activity, программно, потому что я не знаю, сколько мне понадобится до выполнения. Кроме того, я создал XML-файл для их настройки, который я не включил ниже. У меня проблема с каждым из методов, которые я нашел для этого.

Вот сегменты метода внутри класса, который я создал, который расширяет LinearLayout:

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

@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    ((Activity)getContext()).getLayoutInflater().inflate(R.layout.extended_linear_layout, this);
    ...
}

А внутри Задания эти два решения кажутся наиболее близкими к тому, что я ищу.

Не знаю, где можно получить атрибуты с помощью этого метода:

ExtendedLinearLayout customViewClass = new ExtendedLinearLayout(this, attrs);
layout.addView(customViewClass)

Не знаю, как указать, что инфлятор должен использовать ExtendedLinearLayout с этим методом:

LayoutInflater inflater = LayoutInflater.from(this);
inflater.inflate(R.layout.extended_linear_layout, parent_layout);

Я, вероятно, соглашусь на использование ListView - но это кажется немного излишним для пяти-шести пунктов. Кроме того, если раньше вы работали с Flex, то по крайней мере кажется разумным решением проблемы.

Спасибо, Randall

---------------- UPDATE -------------------

Я попробовал метод, как описано ниже. После того, как я все настроил, я получаю исключение InflationException: бинарный XML-файл # 8: Ошибка надувания класса. Я чувствую , как XML выглядит просто отлично. Одна вещь, в которой я могу быть смущена, - это где вызвать инфлятор. Прямо сейчас я вызываю inflater в onFinishInflate () пользовательского класса, а также в Activity следующим образом:

public class ExtendedLinearLayout extends LinearLayout {
    ...
public ExtendedLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.extended_linear_layout, null);
        ...
    }
}

А в деятельности:

public class TestActivity extends Activity {
    LinearLayout list;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        list = (LinearLayout) findViewById(R.id.simple_list);
        runTestCode();
    }
    private void runTestCode() {
        LayoutInflater inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        ExtendedLinearLayout layoutOne = 
                (ExtendedLinearLayout) inflater.inflate(R.layout.extended_linear_layout, list);
    }
}

Спасибо и надеюсь, у вас есть время взглянуть. Мне нравится разбираться во всем, копаясь в Интернете, но со вчерашнего утра я готовил это несколько часов. Я в двух дюймах от простого рефакторинга в ListAdapter.

---------------- UPDATE -------------------

Вот XML-файл

<?xml version="1.0" encoding="utf-8"?>
<com.anotherandroidblog.ExtendedLinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    >
    <TextView
        android:id="@+id/text_one"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text=""
        ></TextView>
    <TextView
        android:id="@+id/text_two"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text=""
        ></TextView>
    <TextView
        android:id="@+id/text_three"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        ></TextView>
</com.anotherandroidblog.ExtendedLinearLayout>

1 Ответ

0 голосов
/ 27 мая 2011

Вам необходимо использовать полное имя класса в файле XML: вместо создания корневого элемента LinearLayout сделайте его полным именем класса для ExtendedLinearLayout (включая имя пакета). Тогда LayoutInflater будет знать, что делать.

РЕДАКТИРОВАТЬ: также, опция attrs на самом деле не работает (или, по крайней мере, я так не думаю). Я не нашел способа сгенерировать во время выполнения фактически экземпляр объекта attrs: нет открытых конструкторов, и я ожидаю, что это еще одна из вещей, которую фреймворк делает под капотом, который просто недоступен.

...