Как управлять шириной вкладок ActionBar? - PullRequest
17 голосов
/ 16 марта 2012

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

enter image description here

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

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

<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>

Ответы [ 3 ]

11 голосов
/ 16 марта 2012

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

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

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

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

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

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

1 голос
/ 22 мая 2014

Переопределить этот класс в проекте 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 не работает.

1 голос
/ 05 июля 2012

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

От http://actionbarsherlock.com/theming.html:

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

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

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

<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>
...