web-dev-qa-db-ja.com

Android JellyBeanでアクションバーの高さを変更する

私は最近、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;
    }

この方法で収集したものから、JellyBeanは、アプリが縦向きモードのとき、タブバーの高さを「action_bar_stacked_max_height」ディメンション値(4.1の/values/dimen.xmlでは48dp)に設定することにより、TabBarの高さを制限しているようですファイル)、アクションバーの高さをactionBarSizeに設定しましたが、.

このディメンション値を自分のdimen.xmlファイルで自分の値に設定してオーバーライドしようとしましたが、うまくいきませんでした。うまくいきませんでした。

私の質問:

「action_bar_stacked_max_height」の寸法値を上書きできる方法をご存知ですか?

前もって感謝します!

23
edy

それは故意に行われたように思われ、その理由はわかりません。 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を使用したことに注意してください。これは、この回避策を使用したサンプルプロジェクトの link です。

結局のところ、UIデザインがガイドラインから少し離れている場合は、タブモードでActionBarを使用する代わりに、画面の上部に配置されたカスタムビューを作成する方が将来的に簡単になるようです。

1
st_

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> 
26
Anton

次のように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>
9
Jonathan Lin