23

我最近一直在开发一个 Android 应用程序,我需要在其中为标签栏设置自定义布局和尺寸。到目前为止,我这样做的方式是使用 Jake Wharton 的 ActionBarSherlock 库来支持预HoneyComb 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)来限制 TabBar 的高度),即使我已将操作栏高度设置为actionBarSize.

我已经尝试通过在我自己的文件中将它设置为我自己的值来覆盖这个维度值dimen.xml,但我没有运气。它没有用。

我的问题:

你们知道我可以覆盖“action_bar_stacked_max_height”尺寸值的方法吗?

先感谢您!

4

3 回答 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> 
于 2013-02-27T17:29:29.957 回答
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>
于 2013-12-10T10:41:27.603 回答
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;
}

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

毕竟,在我看来,如果您的 ui 设计与指导线有点远,那么将来创建与屏幕顶部对齐的自定义视图而不是在选项卡模式下使用 ActionBar 会更容易。

于 2014-06-04T17:52:09.107 回答