Могу ли я использовать стиль вкладок по умолчанию в своем пользовательском представлении вкладки?

Моя основная деятельность – TabActivity , но мои вкладки не требуют значков. Я знаю, что я могу опустить значок, используя перегруженный TabHost.TabSpec.setIndicator(CharSequence label) , как ответили в этом вопросе .

Но пространство, куда будет идти значок, по-прежнему остается запертым, поэтому много места тратится впустую. Это уже было отмечено в этом вопросе . Кажется, я не могу просто уменьшить высоту вкладки. Мне нужно будет предоставить собственный View с TabHost.TabSpec.setIndicator(View view) .

Отлично, но я хочу убедиться, что остальная часть стиля (фон / раскраска) остается неизменной «андроид» на всех устройствах, как если бы я использовал индикатор вкладки по умолчанию. Поэтому я не хочу поставлять свои собственные цвета.

Я нашел @android:color/tab_indicator_text и его использование для текстового цвета TextView выглядит, как ожидается. Но я не знаю, где получить значения по умолчанию tab-background-colors. Я также обнаружил @android:style/Widget.TabWidget , но применение его ни к TextView ни к окружающему LinearLayout похоже, не помогает.

Это мой XML-файл с отображением индикатора вкладки, взятый из некоторого учебника:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tabLayout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:padding="12dip" > <TextView android:id="@+id/tabText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@android:color/tab_indicator_text" /> </LinearLayout> 

Как мне настроить стиль вкладки «android default»?


Изменить: Затем я попытался добавить вкладку по умолчанию с помощью setIndicator(CharSequence) , извлечь getBackground из его индикатора, очистить все вкладки, добавить мои пользовательские представления (см. Выше), а затем поместить извлеченный я, полученный в setBackground для нового показатели.

Результат выглядит правильно и не так. Во-первых, они слишком высокие, поэтому я ничего не получил. С другой стороны, фоновые состояния всех вкладок теперь связаны каким-то образом (активным, выделенным, выбранным и т. Д.). Использование mutate() на drawable (s) не помогло вообще. Следующий трюк: я добавил три вкладки по умолчанию, взял все их фоны, очистил их и дал три моих вкладки по одному фону.

Ну, это решает вторую проблему. Их состояния больше не связаны. Но они все еще слишком высоки. Поэтому я уменьшил высоту TabWidget используя updateViewLayout . Это работает, но оставляет выцветший бар в верхней части индикаторов вкладки.

Фактически, я просто получаю ту же ситуацию, что и при использовании TabHost.TabSpec.setIndicator(CharSequence label) . И вообще, все эти хаки заставляют меня чувствовать себя грязным. Разве нет элегантного способа получить стиль андроида по умолчанию на пользовательском представлении?

Solutions Collecting From Web of "Могу ли я использовать стиль вкладок по умолчанию в своем пользовательском представлении вкладки?"

Этот код был взят из источников android. Tab_indicator.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="0dip" android:layout_height="64dip" android:layout_weight="1" android:layout_marginLeft="-3dip" android:layout_marginRight="-3dip" android:orientation="vertical" android:background="@android:drawable/tab_indicator"> <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" /> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" style="?android:attr/tabWidgetStyle" /> </RelativeLayout> 

Вы можете попытаться просто взять этот код, удалить ImageView , изменить layout_centerHorizontal в TextView на layout_center , уменьшить высоту RelativeLayout и предоставить это представление в TabHost.TabSpec.setIndicator(View view) . Имеются ссылки только на ресурсы @android , поэтому вам не нужно создавать стили рисования или текста.

РЕДАКТИРОВАТЬ

Стандартный фоновый рисунок для Android-индикатора не отображается в приложении, но можно сделать это следующим образом:

 TabSpec tc = getTabHost().newTabSpec("tag"); tc.setIndicator("indicator1"); tc.setContent(content); getTabHost().addTab(tc); getTabHost().findViewById(android.R.id.icon).setVisibility(View.GONE); TextView tv = (TextView) getTabHost().findViewById(android.R.id.title); RelativeLayout.LayoutParams rllp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); rllp.addRule(RelativeLayout.CENTER_IN_PARENT); tv.setLayoutParams(rllp); 

Затем можно уменьшить высоту вкладок:

 RelativeLayout parent = ((RelativeLayout) tv.getParent()); ViewGroup.LayoutParams vglp = parent.getLayoutParams(); vglp.height = android.view.ViewGroup.LayoutParams.WRAP_CONTENT; parent.setLayoutParams(vglp); 

Результатом будет: это

Я думаю, что лучшим вариантом было бы настроить аспект Tabs с помощью xml-файлов, называемых селекторами (которые вы поместите в свою «выталкиваемую» папку), пользовательский tab_indicator.xml в вашей папке «layout», стиль для текста и темы Используя такой стиль.

Это tab_indicator_selector.xml, который находится в папке «drawable» и требуется tab_indicator.xml:

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Non focused states ... --> <!-- Focused states ... --> <!-- Pressed --> <item android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/tab_pressed" /> <item android:state_pressed="true" android:drawable="@drawable/tab_pressed" /> </selector> 

И это селектор состояний tab_pressed.xml:

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:top="53dp"> <shape android:shape="rectangle"> <solid android:color="@color/white" /> </shape> </item> <item android:top="53dp" android:bottom="1dp"> <shape android:shape="rectangle"> <solid android:color="@color/white" /> </shape> </item> <item android:left="2dp" android:right="2dp"> <shape android:shape="rectangle"> <gradient android:angle="90" android:startColor="@color/black" android:endColor="@color/white" /> <stroke android:width="2dp" android:color="@color/red" /> </shape> </item> </layer-list> 

Другие состояния могут быть достигнуты путем создания tab_focused.xml, tab_selected.xml и tab_unseleceted.xml и установки правильных комбинаций android: state_XXX.

Tab_indicator выглядит следующим образом:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="0dip" android:layout_height="52dip" <!-- Control the height of the Tab here! --> android:layout_weight="1" android:orientation="vertical" android:background="@drawable/tab_indicator_selector" android:layout_marginTop="2dp" android:padding="2dp"> <!-- Generally here goes an ImageView, but you said you don't want it. --> <TextView android:id="@+id/tab_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="11dp" android:textStyle="bold" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" style="?android:attr/tabWidgetStyle" /> </RelativeLayout> 

На стороне реализации должно выглядеть так:

 private void setTabs(){ tabHost = getTabHost(); addTab(R.string.tab_title_something, R.drawable.tab_something_selector, new Intent().setClass(this, PlacesNearbyTab.class)); } private void addTab(int labelId, int drawableId, Intent intent) { TabHost.TabSpec spec = tabHost.newTabSpec("tab" + labelId); View tabIndicator = LayoutInflater.from(this).inflate(R.layout.tab_indicator, getTabWidget(), false); TextView title = (TextView) tabIndicator.findViewById(R.id.tab_title); title.setText(labelId); spec.setIndicator(tabIndicator); spec.setContent(intent); tabHost.addTab(spec); } 

Я надеюсь, что это помогает. Это долгое решение, но использование тем и стилей очень удобно, когда приложение выросло, или когда вы хотите изменить его внешний вид на версии 2.

Наконец, я предлагаю вам ознакомиться с новой версией SDK версии 14 и темы Holo. Вкладки на Holo предназначены для планшетов и телефонов, и вы можете создавать их с помощью и без значков.

Я не уверен, будет ли это центрировать текст, но вы можете изменить высоту вкладки без изменения фона Android по умолчанию.

Попробуй это:

 TabHost tabs = //initialize your TabHost here tabs.setup(); TabSpec tspec1 = tabs.newTabSpec("First Tab"); tspec1.setIndicator("Actions"); tabs.addTab(tspec1); tabs.getTabWidget.getChildAt(0).getLayoutParams().height = (int) (35 * 1.5); 

Где 35 – высота в пикселях, а умножение на 1,5 делает высоту 35dp.

Удачи.

Вы могли бы попробовать следующий пример кода, который берется из default tab_indicator.xml и делает небольшую модификацию, соответствующую описанному вами запросу. Благодаря!

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="0dip" android:layout_height="64dip" android:layout_weight="1" android:layout_marginLeft="-3dip" android:layout_marginRight="-3dip" android:gravity="center" android:background="@android:drawable/tab_indicator"> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" style="?android:attr/tabWidgetStyle"> </TextView> </LinearLayout> 

Вы можете найти файлы цвета res для каждой платформы под / path-to-android-sdk / platform /, и вы можете использовать @android: style / или @android: color / для доступа к ресурсам по умолчанию из XMLs …

Но, как вы уже упоминали, вы знаете, что цвета и стили TabWidgets и других Android UI Views меняются от версии к версии и между брендами устройств.

Даже если вы можете делать то, что хотите, ваши вкладки будут отличаться от версий и брендов устройств … что не так.

Я бы реализовал свои собственные стили Tab с одним из данных решений. Удачи тебе!