Заполнитель макета Android для динамически добавленного вида - PullRequest
22 голосов
/ 02 апреля 2012

В моей активности Android мне нужно добавить один вид динамически (во время выполнения) в определенную позицию макета. Представление, которое будет добавлено, определяется во время выполнения. Например, может макет может выглядеть примерно так:

<LinearLayout ...>
    <TextView ... />
    <!-- Dynamic item to be added here -->
    <TextView ... />
</LinearLayout>

Каков наилучший способ достичь этого?

Одним из решений является использование layout.addView(view, index), но я бы предпочел не указывать индекс жестко.

Другое решение заключается в использовании FrameLayout в качестве заполнителя, и место может динамически отображаться внутри FrameLayout, например:

<LinearLayout ...>
    <TextView ... />
    <FrameLayout android:id="@+id/placeholder" />
    <TextView ... />
</LinearLayout>

Тогда:

findViewById(R.id.placeholder).addView(view);

Однако это добавляет ненужное представление в иерархию.

Каков рекомендуемый способ сделать это?

Ответы [ 3 ]

13 голосов
/ 02 апреля 2012

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

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

8 голосов
/ 13 августа 2012

Вы также можете добиться этого поведения «отложенного включения», используя ViewStub, как описано в этой (довольно старой) статье от разработчиков Android.

1 голос
/ 18 сентября 2015

Вы можете использовать addView (View child, int index) без жесткого кодирования точного индекса.

Если один из соседей представления может быть исправлен (например, есть определенная метка непосредственно перед местом, куда вы хотите вставить элемент), вы можете получить индекс этого представления и вставить динамическое представление после этого:

View previousView = findViewById(ID_OF_PREVIOUS_VIEW);
ViewGroup parent = (ViewGroup)previousView.getParent();
int previousIndex = parent.indexOfChild(previousView);
parent.addView(theDynamicallyCreatedView, previousIndex + 1);

Или вы можете использовать ViewStub, но вместо того, чтобы надувать макет, просто удалите его:

View placeholder = findViewById(ID_OF_STUB);
ViewGroup parent = (ViewGroup)previousView.getParent();
int index = parent.indexOfChild (placeholder);
parent.removeViewAt(index);
parent.addView(theDynamicallyCreatedView, index);

Таким образом, вы не получите огромную иерархию представлений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...