Как управлять шириной вкладок навигации ActionBar?

Я использую ActionBarSherlock и имею панель действий с вкладками навигации. Я хочу, чтобы вкладки автоматически изменялись в зависимости от размера текста в них, но, похоже, где-то есть стиль или настройка, которые заставляют их использовать минимальный размер. Так, например, на снимке экрана вкладка «Очень длинная вкладка» не имеет отступов (в соответствии с примененным стилем), но вкладки с пометкой «T» имеют много отступов, несмотря на то, что я установил отступ на 0dp.

введите здесь описание изображения

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

Как управлять отступом/шириной на вкладках панели действий?

<style
    name="CustomActivity"
    parent="@style/Theme.Sherlock"
    >
    <item name="actionBarTabStyle">@style/customActionBarTabStyle</item>
    <item name="actionBarTabBarStyle">@style/customActionBarTabBarStyle</item>
    <item name="actionBarTabTextStyle">@style/customActionBarTabTextStyle</item>
</style>

<style name="customActionBarTabStyle" parent="style/Widget.Sherlock.ActionBar.TabView">
    <item name="android:background">@drawable/tab_indicator</item>
    <item name="android:paddingLeft">0dp</item>
    <item name="android:paddingRight">0dp</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:minWidth">0dp</item>
</style>

<style name="customActionBarTabBarStyle" parent="style/Widget.Sherlock.ActionBar.TabBar">
    <item name="android:paddingLeft">0dp</item>
    <item name="android:paddingRight">0dp</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:minWidth">0dp</item>
</style>

<style name="customActionBarTabTextStyle" parent="style/Widget.Sherlock.ActionBar.TabText">
    <item name="android:paddingLeft">0dp</item>
    <item name="android:paddingRight">0dp</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:minWidth">0dp</item>
</style>

person Ollie C    schedule 16.03.2012    source источник
comment
checkout: [Как сделать LinearLayout Andorid ActionBar/TabWidget для переноса его дочерних элементов][1] [1]: stackoverflow.com/questions/28024127/   -  person Lewapq    schedule 30.01.2015


Ответы (3)


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

По сути, панель действий будет пытаться расширить вкладки, чтобы занять равное количество места, если для этого достаточно места, чтобы обеспечить более чистый вид, когда есть только несколько вкладок.

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

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

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

Если возможно, попробуйте создать метки вкладок, которые имеют более унифицированную ширину, что, вероятно, вызовет второе состояние, упомянутое выше. Продолжайте тестирование с ICS, чтобы убедиться, что поведение, которое вы видите, связано с платформой, а затем при работе на предварительной версии ICS вы должны получить такое же поведение из библиотеки.

person Jake Wharton    schedule 16.03.2012
comment
Спасибо, Джейк. К сожалению, даже я вырвал все свои стили, вкладки с коротким текстом по-прежнему имеют много отступов, и в моем сценарии это отступы вызывают горизонтальную прокрутку вкладок. На скриншоте справа есть еще одна вкладка, которую не видно. На самом деле это проблема, чтобы остановить прокрутку вкладок, уменьшив отступы на вкладках с короткими текстовыми заголовками. Я не видел переноса текста, хотя я хочу уменьшить отступ, чтобы он не переносился. вы правы, что это ICS на Galaxy Nexus, поэтому я полагаю, что это родная проблема, а не проблема ABS. - person Ollie C; 16.03.2012
comment
Не знаю, что вам сказать, к сожалению. Я не помню большую часть кода табуляции и ее стилей. Я только знаю, что он модифицирует дочерние элементы на основе нескольких условий, чтобы разместить их особым образом. Извините, я не мог больше помочь. - person Jake Wharton; 17.03.2012

Кажется, вы просто используете тему для Android-режима ActionBarSherlock до версии 4.0?

Из http://actionbarsherlock.com/theming.html:

Зеркальные атрибуты

Из-за ограничений в системе тем Android любые настройки темы должны быть объявлены в двух атрибутах. Обычные атрибуты с префиксом Android применяют тему к собственной панели действий, а атрибуты без префикса предназначены для пользовательской реализации. Поскольку оба тематических API совершенно одинаковы, вам нужно всего лишь дважды ссылаться на свои настройки, а не реализовывать их дважды.

Самый простой способ передать, что именно это влечет за собой, — это пример. Ниже приведена полная тема из упомянутого выше примера «Styled»:

<style name="Theme.Styled" parent="Theme.Sherlock.Light.DarkActionBar">
    <item name="actionBarStyle">@style/Widget.Styled.ActionBar</item>
    <item name="android:actionBarStyle">@style/Widget.Styled.ActionBar</item>
</style>

<style name="Widget.Styled.ActionBar" parent="Widget.Sherlock.Light.ActionBar.Solid.Inverse">
    <item name="background">@drawable/bg_striped</item>
    <item name="android:background">@drawable/bg_striped</item>

    <item name="backgroundSplit">@drawable/bg_striped_split</item>
    <item name="android:backgroundSplit">@drawable/bg_striped_split</item>
</style>
person gaah    schedule 05.07.2012

Переопределить этот класс в проекте ActionBarSherlock ./ActionbarSherlock/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java

 @Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
     Re-measure if we went beyond our maximum size.
    if (mParent.mMaxTabWidth > 0 && getMeasuredWidth() > mParent.mMaxTabWidth) {

      //do nothing , override by me for ActionBarTabs not rezize never

    }
}

Оригинальный код от

@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    // Re-measure if we went beyond our maximum size.
    if (mParent.mMaxTabWidth > 0 && getMeasuredWidth() > mParent.mMaxTabWidth) {
        super.onMeasure(MeasureSpec.makeMeasureSpec(mParent.mMaxTabWidth, MeasureSpec.EXACTLY),
                heightMeasureSpec);
    }
}

При запуске этот код в Android 2.3.3 отлично работает, когда мои вкладки не ломаются, но в Android 4.4 не работает.

person luizfelipetx    schedule 21.05.2014