私は最近、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」の寸法値を上書きできる方法をご存知ですか?
前もって感謝します!
それは故意に行われたように思われ、その理由はわかりません。 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を使用する代わりに、画面の上部に配置されたカスタムビューを作成する方が将来的に簡単になるようです。
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>
次のように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>