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

Изменение высоты панели действий на Android JellyBean

Недавно я разработал приложение для Android, в котором мне нужно иметь собственный макет и размер для панели вкладок. Способ, которым я это делал до сих пор, заключается в использовании библиотеки Jake Wharton ActionBarSherlock для поддержки версий Android до HoneyComb и применения стиля к приложению, в котором я редактирую элемент стиля actionBarSize.

Теперь я тестировал приложение на Galaxy S3 (с Jellybean на нем), а высота панели вкладок больше не изменяется в соответствии со значением actionBarSize.

Итак, я начал просматривать код JellyBean, и нашел этот метод в классе ActionBarPolicy:

    public int getTabContainerHeight() {
            TypedArray a = mContext.obtainStyledAttributes(null, R.styleable.ActionBar,
               com.android.internal.R.attr.actionBarStyle, 0);
            int height = a.getLayoutDimension(R.styleable.ActionBar_height, 0);
            Resources r = mContext.getResources();
            if (!hasEmbeddedTabs()) {
                // Stacked tabs; limit the height
                height = Math.min(height,
                        r.getDimensionPixelSize(R.dimen.action_bar_stacked_max_height));
            }
            a.recycle();
            return height;
    }

Из того, что я собираю в этом методе, кажется, что JellyBean ограничивает высоту TabBar, когда приложение находится в портретном режиме, установив высоту панели вкладок в значение измерения action_bar_stacked_max_height (которое равно 48dp, в 4.1 /values/dimen.xml), хотя я установил высоту панели действий в actionBarSize.

Я попытался переопределить это значение измерения, установив его в свое собственное значение в моем собственном файле dimen.xml, но мне не повезло. Это не сработало.

Мой вопрос:

Вы знаете, как я могу переопределить значение размера action_bar_stacked_max_height?

Заранее благодарю вас!

4b9b3361

Ответ 1

мне кажется, что это было сделано специально, и я не знаю, почему. В bools.xml

<bool name="action_bar_embed_tabs">true</bool>
<bool name="action_bar_embed_tabs_pre_jb">false</bool>

Высота вкладок вставки ограничена 48dip в ActionBarPolicy.java, как вы уже упоминали. Вот почему такое поведение можно увидеть только в Android JellyBean или выше. Я не могу найти лучшего решения, чем сделать некоторое отражение в java. Итак, вот код

private void hackJBPolicy() {
    View container = findScrollingTabContainer();
    if (container == null) return;

    try {
        int height = getResources().getDimensionPixelSize(R.dimen.action_bar_height);
        Method method = container.getClass()
                .getDeclaredMethod("setContentHeight", Integer.TYPE);
        method.invoke(container, height);
    } catch (NoSuchMethodException e) {
        Log.e(LOG_TAG, e.getLocalizedMessage(), e);
    } catch (IllegalArgumentException e) {
        Log.e(LOG_TAG, e.getLocalizedMessage(), e);
    } catch (IllegalAccessException e) {
        Log.e(LOG_TAG, e.getLocalizedMessage(), e);
    } catch (InvocationTargetException e) {
        Log.e(LOG_TAG, e.getLocalizedMessage(), e);
    }
}

private View findScrollingTabContainer() {
    View decor = getWindow().getDecorView();
    int containerId = getResources().getIdentifier("action_bar_container", "id", "android");

    // check if appcompat library is used
    if (containerId == 0) {
        containerId = R.id.action_bar_container;
    }

    FrameLayout container = (FrameLayout) decor.findViewById(containerId);

    for (int i = 0; i < container.getChildCount(); i++) {
        View scrolling = container.getChildAt(container.getChildCount() - 1);
        String simpleName = scrolling.getClass().getSimpleName(); 
        if (simpleName.equals("ScrollingTabContainerView")) return scrolling;
    }

    return null;
}

Используйте метод hackJBPolicy() в onCreate. Обратите внимание, что я использовал ActionBar из библиотеки appcompat. Вот ссылка в примерный проект с использованием этого обходного пути.

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

Ответ 2

Попробуйте добавить android:actionBarSize и actionBarSize под тему, которую вы используете, например:

<style name="Theme.white_style" parent="@android:style/Theme.Holo.Light.DarkActionBar">
        <item name="android:actionBarSize">55dp</item>
        <item name="actionBarSize">55dp</item>
</style> 

Ответ 3

Попробуйте использовать android:height следующим образом:

<style name="AppActionBar">
    <item name="android:height">50dp</item>
</style>

<style name="MainActivityStyle" parent="@android:style/Theme.Holo">
    <item name="android:actionBarStyle">@style/AppActionBar</item>
</style>