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ファイルでは 48 dp) に設定することで、アプリがポートレート モードのときに TabBar の高さを制限しているようです。 )、アクション バーの高さを に設定したにもかかわらずactionBarSize

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

私の質問:

「action_bar_stacked_max_height」の次元値をオーバーライドできる方法を知っていますか?

前もって感謝します!

4

3 に答える 3

26

次のように、使用しているテーマの下に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> 
于 2013-02-27T17:29:29.957 に答える
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 に答える