Это то, чего я пытаюсь достичь:
Используйте 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, где он не принадлежал, а затем в коде удалить его из того места, где он не принадлежал, прежде чем использовать его.
В таком сценарии, каков правильный способ добиться этого?