Вот чего я пытаюсь достичь:
Использование TextView в TabWidget (то есть вызов TabHost.TabSpec.setIndicator(View)
вместо TabHost.TabSpec.setIndicator(String)
).
И я хочу настроить этот 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 там, где он не принадлежит, затем в коде удалить его из того места, где он не принадлежал, прежде чем использовать его.
В таком случае, как правильно достичь этого?