在Android JellyBean上更改Actionbar高度

edy*_*edy 23 tabs android actionbarsherlock android-actionbar android-4.2-jelly-bean

我最近一直在开发一个Android应用程序,我需要为标签栏设置自定义布局和尺寸.我到目前为止的方式是使用Jake Wharton的ActionBarSherlock库来支持pre-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;
    }
Run Code Online (Sandbox Code Playgroud)

从我在这个方法中收集的内容来看,当应用程序处于纵向模式时,似乎JellyBean通过将标签栏高度设置为"action_bar_stacked_max_height"维度值(在4.1的/values/dimen.xml文件中为48dp)来限制TabBar的高度),即使我已设置动作栏高度actionBarSize.

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

我的问题:

你们知道我可以覆盖"action_bar_stacked_max_height"维度值的方法吗?

先感谢您!

Ant*_*ton 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> 
Run Code Online (Sandbox Code Playgroud)

  • 好吧,它改变了主操作栏的高度,但它不会影响标签栏的高度(绝对不在Android 4.2.2上). (4认同)

Jon*_*Lin 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>
Run Code Online (Sandbox Code Playgroud)


st_*_*st_ 1

it seems to me that it was done on purpose and I don't know why. There are some variables in bools.xml

<bool name="action_bar_embed_tabs">true</bool>
<bool name="action_bar_embed_tabs_pre_jb">false</bool>
Run Code Online (Sandbox Code Playgroud)

The height of embed tabs is limited to 48dip in ActionBarPolicy.java, as you have already mentioned. That's why such behaviour can be seen only in Android JellyBean or higher. I can't find a better solution than to make some java reflection. So here is the code

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;
}
Run Code Online (Sandbox Code Playgroud)

Use the method hackJBPolicy() in your onCreate. Notice that I used ActionBar from appcompat library. Here is the link to the sample project with the use of this workaround.

After all, it seems to me that it would be easier in future to create custom view aligned to the top of the screen instead of using ActionBar in tabs mode if your ui design is a bit far from guidlines.