ActionBarの高さを取得する方法は?


190

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

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

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

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

回答:


417

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

// 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)
}

13
大きな助け!! しかし、あなたはそのようなものすべてを見つける場所から!!
vikky 2013

5
一般的には、開発者向けハンドブックを使って、グーグルで徹底的に調べたり、ドラッジしたりします。この場合は後者だと思いますが、久しぶりです。
アンソニー

1
特定のアクティビティについてのみアクションバーのサイズを変更できますか?
Sudarshan Bhat 2013年

これは、どちらの場合でも機能しました:(i)onCreateViewおよび(ii)onConfigurationChanged。ありがとう!
Marcelo Noguti 2014年

5
「android.R.attr.actionBarSize」はAndroidバージョン2.3では機能しませんが、「R.attr.actionBarSize」はすべてのバージョンのAndroidで機能します。「android.R.attr.actionBarSize」、「android.support.v7.appcompat.R.attr.actionBarSize」などの代わりに「R.attr.actionBarSize」を使用するだけ
Nathaniel Jobs

147

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

android:paddingTop="?android:attr/actionBarSize"

20
ActionBarCompat "@ dimen / abc_action_bar_default_height"を使用している場合
Ali AlNoaimi

10
アリ・アルノアイミ、ありがとう!AppCompat v21では、名前が次のように変更されました: "@ dimen / abc_action_bar_default_height_material"
Tony Ceralva

5
@muzikantが後述するように、appcompatの場合、コードで使用する場合、正しい属性はandroid.support.v7.appcompat.R.attr.actionBarSizeです。あなたはレイアウトXMLでそれを使用したい場合は、android:paddingTop="?attr/actionBarSize"。どこでも問題なく動作します。
rpattabi

1
このソリューションは、カスタムXMLフレームレイアウトを使用している場合に最適です。
tryp 2016年

2
この属性を使用したいが、負のパディングでそれを使用したい場合は、負です。どうやってやるの?
Tiger開発者

17

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


タブを使用するときにも同じことを経験しました。一部のデバイスでは、状況によってはタブを基本のActionBarに視覚的に折りたたむため、タブを検出するのが難しい場合があります。だから私のために働いたのはただActionBar.getHeight()です。状況によっては、それもあなたのために働くかもしれません。
TalkLittle 2014年

アクションバーの高さのみを考慮していた問題に直面していたので、「通知バー」の高さも追加しました。それは私にはうまくいきました。
ダルパン2015年

FrameLayoutを使用していlayout_gravity="center_vertical"ますか?に変更し"bottom"ます。Android 2.3は、FrameLaoyutのマージンを新しいAndroidとは異なる方法で処理します。
Oliv

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());
   }

最初のifを "if(Build.VERSION.SDK_INT> = Build.VERSION_CODES.HONEYCOMB){}"でラップして、古いAndroidバージョンでのランタイムエラーを回避できます。
Marina.Eariel 2013年

com.actionbarsherlock.R.attr.actionBarSizeはAndroid 2.3と4.0の両方に対応していたため、Androidのバージョンに関係なく使用できるようです。
フェリックス

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;
}

9
あなたがAPPCOMPAT使用している場合には、次の行を追加しますelse if (true == getTheme().resolveAttribute( android.support.v7.appcompat.R.attr.actionBarSize, tv, true)) { actionBarHeight = TypedValue.complexToDimensionPixelSize( tv.data,getResources().getDisplayMetrics()); }
Muzikant

3
"if(true =="?私はあなたが "true"を削除できると思います... :)
android developer

ええ、あなたは正しいです...それは単に明確にするために追加されました
ムジカント2014

コードから見ると、ABSを使用しているかどうかは問題ではないようです。HONEYCOMBより上のすべてのバージョンでは、android.R.attr.actionBarSizeからアクションバーの高さを取得します。これは正しいです ?
AsafK 2014年

とにかく、画面上部を非表示にするハーフアクションバーを指定するのですか?stackoverflow.com/questions/27163374/...
スティーブ・

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"

1
横長モードでは、アクションバーの高さが小さくなることに注意してください。
マークブイケマ2014

actionBarSherlockはアクションバーの高さを決定するときに多くのことを考慮に入れるので、これはお勧めしません。これを行うと、actionBarの高さがデバイスの仕様に基づいていないため、特定のデバイスの標準の高さのように見えません。
Chris Sprague、2014年

5

Java:

    int actionBarHeight;
    int[] abSzAttr;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        abSzAttr = new int[] { android.R.attr.actionBarSize };
    } else {
        abSzAttr = new int[] { R.attr.actionBarSize };
    }
    TypedArray a = obtainStyledAttributes(abSzAttr);
    actionBarHeight = a.getDimensionPixelSize(0, -1);

xml:

    ?attr/actionBarSize

5

ツールバーをアクションバーとして使用している場合、

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

次に、ツールバーのlayout_heightを使用します。

int actionBarHeight = toolbar.getLayoutParams().height;

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;
}

2

このヘルパーメソッドは、誰かに役立つはずです。例:int actionBarSize = getThemeAttributeDimensionSize(this, android.R.attr.actionBarSize);

public static int getThemeAttributeDimensionSize(Context context, int attr)
{
    TypedArray a = null;
    try{
        a = context.getTheme().obtainStyledAttributes(new int[] { attr });
        return a.getDimensionPixelSize(0, 0);
    }finally{
        if(a != null){
            a.recycle();
        }
    }
}

2

これを追加するだけです。

public int getActionBarHeight() {
        int height;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            height = getActivity().getActionBar().getHeight();
        } else {
            height = ((ActionBarActivity) getActivity()).getSupportActionBar().getHeight();

        }
        return height;
    }

2

私はそれを発見するより一般的な方法を見つけました:

  int[] location = new int[2];
  mainView.getLocationOnScreen(location);
  int toolbarHeight = location[1];

ここで ' mainView 'はレイアウトのルートビューです。

アイデアは基本的にmainViewの Y位置を取得することです。これは、ActionView(またはToolbar)のすぐ下に設定されているためです。


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));
    }

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;
    }

2

最も人気のある答えを満たすための準備ができた方法:

public static int getActionBarHeight(
  Activity activity) {

  int actionBarHeight = 0;
  TypedValue typedValue = new TypedValue();

  try {

    if (activity
      .getTheme()
      .resolveAttribute(
        android.R.attr.actionBarSize,
        typedValue,
        true)) {

      actionBarHeight =
        TypedValue.complexToDimensionPixelSize(
          typedValue.data,
          activity
            .getResources()
            .getDisplayMetrics());
    }

  } catch (Exception ignore) {
  }

  return actionBarHeight;
}

2

これは、電話がHoneycombより高いと仮定して使用したKotlinの更新バージョンです。

val actionBarHeight = with(TypedValue().also {context.theme.resolveAttribute(android.R.attr.actionBarSize, it, true)}) {
            TypedValue.complexToDimensionPixelSize(this.data, resources.displayMetrics)
        }

1

Xamarin / C#を使用している場合、これはあなたが探しているコードです:

var styledAttributes = Context.Theme.ObtainStyledAttributes(new[] { Android.Resource.Attribute.ActionBarSize });
var actionBarSize = (int)styledAttributes.GetDimension(0, 0);
styledAttributes.Recycle();

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();
}

0

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

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
           ....
           int actionBarHeight = getActionBar().getHeight());
           .....
    }

0

javafx(Gluonを使用)では、高さは実行時に設定されます。通常通りの幅を確保しながら...

double width = appBar.getWidth();

リスナーを作成する必要があります:

GluonApplication application = this;

application.getAppBar().heightProperty().addListener(new ChangeListener(){
    @Override
    public void changed(ObservableValue observable, Object oldValue, Object newValue) {
        // Take most recent value given here
        application.getAppBar.heightProperty.get()
    }
});

...変更された最新の値を使用します。高さを取得します。


0

うまくいかなかったすべてのものを試した後、偶然にも、アクションバーのデフォルトの高さを取得するための機能的で非常に簡単な方法を見つけました。

API 25および24でのみテスト済み

C#

Resources.GetDimensionPixelSize(Resource.Dimension.abc_action_bar_default_height_material); 

ジャワ

getResources().getDimensionPixelSize(R.dimen.abc_action_bar_default_height_material);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.