回答:
XMLでActionBarの高さを取得するには、次のコードを使用します。
?android:attr/actionBarSize
または、ActionBarSherlockまたはAppCompatユーザーの場合は、これを使用します
?attr/actionBarSize
実行時にこの値が必要な場合は、これを使用します
final TypedArray styledAttributes = getContext().getTheme().obtainStyledAttributes(
new int[] { android.R.attr.actionBarSize });
mActionBarSize = (int) styledAttributes.getDimension(0, 0);
styledAttributes.recycle();
これが定義されている場所を理解する必要がある場合:
@dimen/abc_action_bar_default_height
直接(ActionBarComapt)を使用しようとしましたが、(mdpiデバイスで)機能しました。しかし、Samsung Galaxy SIIIでこの値を取得しようとすると、間違った値が返されました。これは、values-xlarge
(なんとかして)values-land
横向きモードよりも好ましいからです。代わりに属性を参照すると、魅力のように機能します。
android.R.attr.actionBarSize
3.0より前のデバイスで0サイズに解決されるように追加したいと思います。したがって、ActionBarCompat
1つを使用すると、android.support.v7.appcompat.R.attr.actionBarSize
代わりに固執します。
Android 3.2の逆コンパイルされたソースからframework-res.apk
、以下をres/values/styles.xml
含みます:
<style name="Theme.Holo">
<!-- ... -->
<item name="actionBarSize">56.0dip</item>
<!-- ... -->
</style>
3.0と3.1は同じようです(少なくともAOSPから)...
Honeycombサンプルの1つは、 ?android:attr/actionBarSize
?attr/actionBarSize
、すべてのAPIレベルで機能する(android名前空間がないことに注意)。
これらの高さをICS以前の互換性アプリで適切に複製し、フレームワークのコアソースを掘り下げる必要がありました。上記の両方の答えは、ある程度正しいです。
基本的には、修飾子を使用することになります。高さは、ディメンション "action_bar_default_height"によって定義されます
デフォルトでは48dipに定義されています。ただし、-landの場合は40dip、sw600dpの場合は56dipです。
最近のv7 appcompatサポートパッケージの互換性ActionBarを使用している場合は、次を使用して高さを取得できます
@dimen/abc_action_bar_default_height
新しいv7サポートライブラリ(21.0.0)では、名前が@ dimen / abc_action_bar_default_height_ materialにR.dimen
変更されました。
以前のバージョンのサポートライブラリからアップグレードする場合は、アクションバーの高さとしてその値を使用する必要があります
?attr/actionBarSize
は、通常のものと一致するように見ている場合は確かに勝りActionBar
ます。
ActionBarSherlockを使用している場合、高さを取得できます
@dimen/abs__action_bar_default_height
abs__
-prefixedリソースを直接使用しないでください。
@ AZ13の答えは適切ですが、Androidの設計ガイドラインに従って、ActionBarは少なくとも48 dpの高さにする必要があります。
public int getActionBarHeight() {
int actionBarHeight = 0;
TypedValue tv = new TypedValue();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv,
true))
actionBarHeight = TypedValue.complexToDimensionPixelSize(
tv.data, getResources().getDisplayMetrics());
} else {
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,
getResources().getDisplayMetrics());
}
return actionBarHeight;
}
私はこの方法で自分のために行いました。このヘルパーメソッドは誰かに役立つはずです。
private static final int[] RES_IDS_ACTION_BAR_SIZE = {R.attr.actionBarSize};
/**
* Calculates the Action Bar height in pixels.
*/
public static int calculateActionBarSize(Context context) {
if (context == null) {
return 0;
}
Resources.Theme curTheme = context.getTheme();
if (curTheme == null) {
return 0;
}
TypedArray att = curTheme.obtainStyledAttributes(RES_IDS_ACTION_BAR_SIZE);
if (att == null) {
return 0;
}
float size = att.getDimension(0, 0);
att.recycle();
return (int) size;
}