Представления Android - Как настроить элемент Loose View с помощью XML? - PullRequest
2 голосов
/ 01 февраля 2010

Вот чего я пытаюсь достичь:

  1. Использование TextView в TabWidget (то есть вызов TabHost.TabSpec.setIndicator(View) вместо TabHost.TabSpec.setIndicator(String)).

  2. И я хочу настроить этот TextView в XML, а не строить его программно.

Итак, изначально в моем макете XML у меня было:

<TabHost
    android:id="@+id/mainTabHost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="30px"/>
    <FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:paddingTop="30px">
    </FrameLayout>
</TabHost>

Теперь я хочу добавить куда-нибудь конфигурацию TextView. На самом деле он не «принадлежит» нигде в иерархии макета. Но поскольку XML-макет должен быть допустимым XML, он не может иметь более одного корневого элемента. Так что я вынужден где-то вкладывать TextView. Поэтому я просто поместил его на один уровень ниже корня (TabHost):

<TabHost
    android:id="@+id/mainTabHost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="30px"/>
    <TextView
        android:id="@+id/tvTabIndicatorPreferences"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:text="@string/tab_name_preferences"/>
    <FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:paddingTop="30px">
    </FrameLayout>
</TabHost>

И в моем коде я делаю:

final TabHost mainTabHost = (TabHost) this.findViewById(R.id.mainTabHost);
mainTabHost.setup();
final TextView tvTabIndicatorPreferences = (TextView) this.findViewById(R.id.tvTabIndicatorPreferences);
final TabHost.TabSpec tabSpecPreferences = mainTabHost.newTabSpec("tabPreferences");
tabSpecPreferences.setIndicator(tvTabIndicatorPreferences);
tabSpecPreferences.setContent(R.id.scrlTblPreferences);
mainTabHost.addTab(tabSpecPreferences);

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

Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

что логично и разумно. TextView уже является дочерним элементом TabHost. я не могу просто установить его как дочерний элемент другого элемента. (Примечание. Помещение TextView во вкладку TabWidget дает то же самое.)

, поэтому я вынужден позвонить mainTabHost.removeView(tvTabIndicatorPreferences), прежде чем позвонить на setIndicator.

На самом деле это работает, но этот способ работы кажется мне очень неправильным. Во-первых, я должен поместить TextView в XML там, где он не принадлежит, затем в коде удалить его из того места, где он не принадлежал, прежде чем использовать его.

В таком случае, как правильно достичь этого?

1 Ответ

5 голосов
/ 01 февраля 2010

Шаг # 1: вытяните TextView в отдельный файл макета (например, res/layout/indicator.xml).

Шаг № 2: Звоните tabSpecPreferences.setIndicator(getLayoutInflater().inflate(R.layout.indicator, null));

Шаг № 3: Нет шага № 3.

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