更改 Android JellyBean 上的操作栏高度 [英] Change Actionbar height on Android JellyBean

查看:15
本文介绍了更改 Android JellyBean 上的操作栏高度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最近一直在开发一个 Android 应用程序,我需要在其中为标签栏设置自定义布局和尺寸.到目前为止,我的做法是使用 Jake Wharton 的 ActionBarSherlock 库来支持 HoneyComb 之前的 Android 版本,并将样式应用于我编辑 actionBarSize 样式项的应用程序.

I've been recently developing an Android app, in which i need to have a custom layout and dimension for the tab bar. The way that i did it until now is by using Jake Wharton's ActionBarSherlock library to support pre-HoneyComb Android versions, and by applying a style to the app in which i edit the actionBarSize style item.

现在,我一直在 Galaxy S3 上测试应用程序(上面有 Jellybean),标签栏高度不再根据 actionBarSize 值改变.

Now, I've been testing the app on the Galaxy S3 (with Jellybean on it), and the tab bar height doesn't change anymore according to the actionBarSize value.

于是开始翻看JellyBean的代码,在ActionBarPolicy类中找到了这个方法:

So I've started looking through JellyBean's code, and I found this method in the ActionBarPolicy class:

    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"尺寸值(在 4.1 中为 48dp的 /values/dimen.xml 文件),即使我在 actionBarSize 中设置了操作栏高度.

From what i gather in this method, it seems that JellyBean limits the height of the TabBar, when the app is in portrait mode, by setting the tab bar height to the "action_bar_stacked_max_height" dimension value (which is 48dp, in 4.1's /values/dimen.xml file), even though I've set the action bar height in actionBarSize.

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

I've tried overriding this dimension value, by setting it to my own value in my own dimen.xml file, but i had no luck. It didn't work.

我的问题:

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

Do you guys know of a way in which i can override the"action_bar_stacked_max_height" dimen value?

提前谢谢你!

推荐答案

在我看来这是故意的,我不知道为什么.bools.xml

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>

ActionBarPolicy.java,正如你已经提到的.这就是为什么这种行为只能在 Android JellyBean 或更高版本中看到.我找不到比进行一些 java 反射更好的解决方案.所以这里是代码

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;
}

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

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.

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

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.

这篇关于更改 Android JellyBean 上的操作栏高度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆