在安卓JellyBean上更改Actionbar高度

23
我最近正在开发一个Android应用程序,其中需要自定义选项卡栏的布局和尺寸。到目前为止,我使用Jake Wharton的ActionBarSherlock库来支持早期的Android版本,并在应用程序中应用样式,在其中编辑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通过将选项卡栏高度设置为“action_bar_stacked_max_height”维度值(在4.1的/values/dimen.xml文件中为48dp),限制了应用程序在纵向模式下的选项卡栏高度,即使我已经在actionBarSize中设置了操作栏高度。
我尝试通过在自己的dimen.xml文件中将其设置为自己的值来覆盖此维度值,但没有成功。它没有起作用。
我的问题:
你们知道我可以覆盖“action_bar_stacked_max_height”维度值的方法吗?
提前感谢您!

我也遇到了同样的问题。你找到解决方案了吗? - user936414
3个回答

26
尝试将android:actionBarSizeactionBarSize放在您正在使用的主题下面,像这样:
<style name="Theme.white_style" parent="@android:style/Theme.Holo.Light.DarkActionBar">
        <item name="android:actionBarSize">55dp</item>
        <item name="actionBarSize">55dp</item>
</style> 

4
它会改变主操作栏的高度,但不会影响选项卡栏的高度(在 Android 4.2.2 上绝对不会)。 - Tomik
1
看起来一样。似乎不会改变选项卡栏的高度。 - secureboot
对我来说运行得很好,像魔法一样。 - Adam Varhegyi
我在模拟器上的最旧版本的果冻豆上让它运作。 - Daniel Handojo

9
尝试使用以下方式使用 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>

1
适用于拆分动作栏,但不适用于第二行/堆叠栏(选项卡)。 - jfcartier

1
似乎有意而为之,我不知道原因。bools.xml 中有一些变量。
<bool name="action_bar_embed_tabs">true</bool>
<bool name="action_bar_embed_tabs_pre_jb">false</bool>

嵌入式选项卡的高度在ActionBarPolicy.java中被限制为48dip,正如您已经提到的那样。这就是为什么只有在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;
}

在您的onCreate中使用hackJBPolicy()方法。请注意,我使用了来自appcompat库的ActionBar。这是使用此解决方案的示例项目链接

总之,如果您的UI设计与指南有所不同,似乎将来创建与屏幕顶部对齐的自定义视图而不是在选项卡模式下使用ActionBar会更容易。


请问您能否解释一下如何使用标准的 Action Bar 实现,而不是使用支持库?我找不到名为 R.id.action_bar_container 的资源。 - user1071762
我知道这是一个非常晚的评论,但我将接受st_的答案,尽管它使用了反射(理论上会使应用程序变慢一点)。但他提供了足够的信息,让人们能够绕过“JB政策”。最终,我像st_建议的那样开发了自己的自定义选项卡栏。 - edy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接