Подтвердить что ты не робот

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

Я использую 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>
4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

Из-за ограничений в системе Android для Android любая тема настройки должны быть объявлены двумя атрибутами. Нормальный Андроид-префиксные атрибуты применяют тему к собственной панели действий а атрибуты unprefixed - для пользовательской реализации. поскольку оба тематических 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>

Ответ 3

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