206

ActionBarアクティビティが作成されるたびに(Sherlockを使用して)高さを取得しようとしています(特に、ActionBarの高さが変更される可能性がある回転時の構成変更を処理するため)。

このために、が表示されActionBar.getHeight()ている場合にのみ機能する方法を使用しActionBarます。

最初のアクティビティが初めて作成されたときgetHeight()に、onCreateOptionsMenuコールバックを呼び出すことができます。ただし、このメソッドは後で呼び出されません。

だから私の質問は、いつgetHeight()を呼び出して、0を返さないことを保証できるかということです。または、それが不可能な場合、ActionBarの高さを設定するにはどうすればよいですか?

4

21 に答える 21

443

ActionBarのサイズを明示的に制御したい場合、@birdyの答えはオプションですが、サポートドキュメントで見つけたサイズをロックせずに引き上げる方法があります。少し厄介ですが、私にとってはうまくいきました。コンテキストが必要です。この例はアクティビティで有効です。

// Calculate ActionBar height
TypedValue tv = new TypedValue();
if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
{
    int actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}

コトリン

val tv = TypedValue()
if (requireActivity().theme.resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
    val actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, resources.displayMetrics)
}
于 2012-11-04T07:14:26.607 に答える
156

XML では、次の属性を使用する必要があります。

android:paddingTop="?android:attr/actionBarSize"
于 2014-02-17T19:54:37.063 に答える
18

OK、グーグルで何度かこの投稿にたどり着いたので、Sherlock だけでなく appcompat についても説明するといいと思います。

appCompat を使用したアクション バーの高さ

@Anthony の説明にかなり似ていますが、次のコードで見つけることができます (リソース ID を変更したところです)。

TypedValue tv = new TypedValue();

if (getActivity().getTheme().resolveAttribute(R.attr.actionBarSize, tv, true))
{
    int actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}

サンドウィッチ前問題

ICE_CREAM_SANDWITCH 以前のデバイスではビューがアクション バーに重なっていたため、アクション バーの高さが必要でした。android:layout_marginTop="?android:attr/actionBarSize", android:layout_marginTop="?attr/actionBarSize" を設定し、オーバーラップをビュー/アクションバーに設定し、アクションバーの高さをカスタムテーマで固定しようとしましたが、何も機能しませんでした。それがどのように見えたかです:

重複問題

残念ながら、上記の方法では高さの半分しか得られないことがわかりました(オプションバーが配置されていないと仮定します)ので、問題を完全に修正するには、アクションバーの高さを2倍にする必要があり、すべて問題ないようです:

オーバーラップ固定

誰かが(actionBarHeightを2倍にするよりも)より良い解決策を知っていれば、私はiOS開発から来て、Androidビューのもののほとんどがかなり混乱していることを発見したので、喜んでお知らせします:)

よろしく、

hris.to

于 2014-01-05T13:18:40.173 に答える
16

@Anthony の回答は、次の方法をサポートするデバイスと、次の方法ActionBarのみをサポートするデバイスで機能します。Sherlock Action Bar

    TypedValue tv = new TypedValue();
    if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
        actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());

    if(actionBarHeight ==0 && getTheme().resolveAttribute(com.actionbarsherlock.R.attr.actionBarSize, tv, true)){
            actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
    }

   //OR as stated by @Marina.Eariel
   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 if(getTheme().resolveAttribute(com.actionbarsherlock.R.attr.actionBarSize, tv, true){
        actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
   }
于 2013-03-18T12:23:48.210 に答える
13

最も安全な方法は次のとおりだと思います:

private int getActionBarHeight() {
    int actionBarHeight = getSupportActionBar().getHeight();
    if (actionBarHeight != 0)
        return actionBarHeight;
    final 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 if (getTheme().resolveAttribute(com.actionbarsherlock.R.attr.actionBarSize, tv, true))
        actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
    return actionBarHeight;
}
于 2013-08-25T09:59:12.287 に答える
6

高さを設定するには、次のような新しいものActionBarを作成できます。Theme

<?xml version="1.0" encoding="utf-8"?>
<resources>   
    <style name="Theme.FixedSize" parent="Theme.Sherlock.Light.DarkActionBar">
        <item name="actionBarSize">48dip</item>
        <item name="android:actionBarSize">48dip</item> 
    </style> 
 </resources>

これThemeをあなたのActivity:に設定します

android:theme="@style/Theme.FixedSize"
于 2012-09-06T16:01:22.740 に答える
3

この関数を使用して、アクションバーの高さを取得できます。

public int getActionBarHeight() {
    final TypedArray ta = getContext().getTheme().obtainStyledAttributes(
            new int[] {android.R.attr.actionBarSize});
    int actionBarHeight = (int) ta.getDimension(0, 0);
    return actionBarHeight;
}
于 2016-01-18T06:59:43.317 に答える
3

Xamarin/C# を使用している場合、探しているコードは次のとおりです。

var styledAttributes = Context.Theme.ObtainStyledAttributes(new[] { Android.Resource.Attribute.ActionBarSize });
var actionBarSize = (int)styledAttributes.GetDimension(0, 0);
styledAttributes.Recycle();
于 2015-04-16T07:08:11.813 に答える
3

電話がハニカムより高いと仮定して使用したKotlinの更新バージョンを次に示します。

val actionBarHeight = with(TypedValue().also {context.theme.resolveAttribute(android.R.attr.actionBarSize, it, true)}) {
            TypedValue.complexToDimensionPixelSize(this.data, resources.displayMetrics)
        }
于 2019-08-26T17:00:28.717 に答える
2

xml では ?attr/actionBarSize を使用できますが、Java でその値にアクセスする必要がある場合は、以下のコードを使用する必要があります。

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;
    }
于 2018-02-20T10:50:39.530 に答える
2

アクションバーの高さは、適用されるテーマによって異なります。AppCompatActivityを使用している場合、ほとんどの場合、高さは通常のアクティビティとは異なります。

AppCompatActivityを使用している場合は、android.R.attr.actionBarSize の代わりに R.attr.actionBarSize を使用する必要があります。

public static int getActionBarHeight(Activity activity) {
        TypedValue typedValue = new TypedValue();

        int attributeResourceId = android.R.attr.actionBarSize;
        if (activity instanceof AppCompatActivity) {
            attributeResourceId = R.attr.actionBarSize;
        }

        if (activity.getTheme().resolveAttribute(attributeResourceId, typedValue, true)) {
            return TypedValue.complexToDimensionPixelSize(typedValue.data, activity.getResources().getDisplayMetrics());
        }

        return (int) Math.floor(activity.getResources()
                .getDimension(R.dimen.my_default_value));
    }
于 2016-10-06T09:30:06.407 に答える
1
The action bar now enhanced to app bar.So you have to add conditional check for getting height of action bar.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
   height = getActivity().getActionBar().getHeight();
 } else {
  height = ((ActionBarActivity) getActivity()).getSupportActionBar().getHeight();
}
于 2016-07-04T04:35:11.470 に答える
0

アクションバーの高さを見つける簡単な方法は、ActivityonPrepareOptionMenuメソッドからです。

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
           ....
           int actionBarHeight = getActionBar().getHeight());
           .....
    }
于 2013-10-26T11:59:59.037 に答える