web-dev-qa-db-ja.com

Androidのステータスバーの高さ

Androidのステータスバーの高さは?いつも同じですか?

私の測定では25dpだそうですが、全プラットフォームで同じ高さかどうかはわかりません。

(ステータスバーを持たないアクティビティから行うアクティビティへのフェードトランジションを適切に実装するためにこれを知りたい)

298
hpique

この質問は以前に回答されました... ステータスバーの高さは?

更新::

現在の方法:

たとえば、画面サイズに応じてステータスバーの高さは異なります。たとえば、画面サイズが240 x 320のデバイスではステータスバーの高さは20ピクセル、画面サイズが320 x 480のデバイスの場合はステータスバーの高さは25ピクセルです。ステータスバーの高さが480 x 800のデバイスは38ピクセルでなければなりません

だから私はステータスバーの高さを取得するためにこのスクリプトを使用することをお勧めします

Rect rectangle = new Rect();
Window window = getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rectangle);
int statusBarHeight = rectangle.top;
int contentViewTop = 
    window.findViewById(Window.ID_Android_CONTENT).getTop();
int titleBarHeight= contentViewTop - statusBarHeight;

   Log.i("*** Elenasys :: ", "StatusBar Height= " + statusBarHeight + " , TitleBar Height = " + titleBarHeight); 

(old Method)アクティビティのonCreate()メソッドのステータスバーの高さを取得するには、このメソッドを使います。

public int getStatusBarHeight() { 
      int result = 0;
      int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "Android");
      if (resourceId > 0) {
          result = getResources().getDimensionPixelSize(resourceId);
      } 
      return result;
} 
341
Elenasys

ステータスバーの高さを取得するために使用したすべてのコードサンプルのうち、実際にはonCreateActivityメソッドで機能するように見えるのはこれだけです。

public int getStatusBarHeight() {
    int result = 0;
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "Android");
    if (resourceId > 0) {
        result = getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

どうやらステータスバーの実際の高さは、Androidリソースとして保持されています。上記のコードはContextWrapperクラス(例えばActivity)に追加することができます。

http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-Android/ にあります

198
Ben Clayton

MDPIデバイスでは、ステータスバーは25pxです。これを基数として使用し、それに密度(切り上げ)を掛けて、任意のデバイスのステータスバーの高さを取得できます。

int statusBarHeight = Math.ceil(25 * context.getResources().getDisplayMetrics().density);

参考のために:ldpi = .75、mdpi = 1、hdpi = 1.5、xhdpi = 2

48
Grantland Chew

サイズをハードコーディングする、またはstatus_bar_heightの値を取得するためにリフレクションを使用することは悪い習慣と考えられています。 Chris Banes がDroidcon New Yorkでこれについて話しました 。ステータスバーのサイズを取得するための推奨される方法は OnApplyWindowInsetsListener です。

myView.setOnApplyWindowInsetsListener { view, insets -> {
  val statusBarSize = insets.systemWindowInsetTop
  return insets
}

これはAPI 20で追加され、 ViewAppCompat を介してバックポートされています。

33
Niklas

いくつかの解決策をまとめました。

public static int getStatusBarHeight(final Context context) {
    final Resources resources = context.getResources();
    final int resourceId = resources.getIdentifier("status_bar_height", "dimen", "Android");
    if (resourceId > 0)
        return resources.getDimensionPixelSize(resourceId);
    else
        return (int) Math.ceil((VERSION.SDK_INT >= VERSION_CODES.M ? 24 : 25) * resources.getDisplayMetrics().density);
    }

もう一つの選択肢:

    final View view = findViewById(Android.R.id.content);
    runJustBeforeBeingDrawn(view, new Runnable() {
        @Override
        public void run() {
            int statusBarHeight = getResources().getDisplayMetrics().heightPixels - view.getMeasuredHeight();
        }
    });

編集:runJustBeforeBeingDrawnの代替: https://stackoverflow.com/a/28136027/878126

30

Googleのデザインガイドライン によると。ステータスバーの高さは24 dpです。

ステータスバーの高さをピクセル単位で取得したい場合は、以下の方法を使用できます。

private static int statusBarHeight(Android.content.res.Resources res) {
    return (int) (24 * res.getDisplayMetrics().density);
}

これはactivityから呼び出すことができます。

statusBarHeight(getResources());
25
Rashid

これは参照 リンク でも機能します。

public int getStatusBarHeight() {
  int result = 0;
  int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "Android");
  if (resourceId > 0) {
      result = getResources().getDimensionPixelSize(resourceId);
  }
  return result;
}
18
Parag Chauhan

私はonCreateでステータスバーの高さを取得しなければならないという同じ問題を抱えています。これは私のために働きます。

private static final int LOW_DPI_STATUS_BAR_HEIGHT = 19;

private static final int MEDIUM_DPI_STATUS_BAR_HEIGHT = 25;

private static final int HIGH_DPI_STATUS_BAR_HEIGHT = 38;

OnCreate内:

DisplayMetrics displayMetrics = new DisplayMetrics();
((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(displayMetrics);

int statusBarHeight;

switch (displayMetrics.densityDpi) {
    case DisplayMetrics.DENSITY_HIGH:
        statusBarHeight = HIGH_DPI_STATUS_BAR_HEIGHT;
        break;
    case DisplayMetrics.DENSITY_MEDIUM:
        statusBarHeight = MEDIUM_DPI_STATUS_BAR_HEIGHT;
        break;
    case DisplayMetrics.DENSITY_LOW:
        statusBarHeight = LOW_DPI_STATUS_BAR_HEIGHT;
        break;
    default:
        statusBarHeight = MEDIUM_DPI_STATUS_BAR_HEIGHT;
}

見る:

http://developer.Android.com/reference/Android/util/DisplayMetrics.htmlhttp:// developer.Android.com/guide/practices/ui_guidelines/icon_design.html

13
benhylau

公式の身長は、Googleの Android Design Webページ で公式に述べられているように、24dpです。

13
Joaquin Iurchuk

デフォルトの高さは25dpでした。 Androidマシュマロ(API 23)では、高さは24dpに減少しました。

更新:ノッチとパンチカメラの時代が始まって以来、ステータスバーに静的な高さを使用することはもはや機能しないことに注意してください。代わりにウィンドウインセットを使用してください。

12
crysxd

はい、Viewで試すと25pxの結果が得られます。これが全体のコードです。

public class SpinActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout lySpin = new LinearLayout(this);
        lySpin.setOrientation(LinearLayout.VERTICAL);       
        lySpin.post(new Runnable()
        {
            public void run()
            {
                Rect rect = new Rect();
                Window window = getWindow();
                window.getDecorView().getWindowVisibleDisplayFrame(rect);
                int statusBarHeight = rect.top;
                int contentViewTop = 
                    window.findViewById(Window.ID_Android_CONTENT).getTop();
                int titleBarHeight = contentViewTop - statusBarHeight;
                System.out.println("TitleBarHeight: " + titleBarHeight 
                    + ", StatusBarHeight: " + statusBarHeight);
            }
        }
    }
}
12
Braj

240 x 320 - 20 px

320x480 - 25px

480x800 + - 38px

9
Denis

これを試して:

    Rect rect = new Rect();
    Window win = this.getWindow();
    win.getDecorView().getWindowVisibleDisplayFrame(rect);
    int statusBarHeight = rect.top;
    int contentViewTop = win.findViewById(Window.ID_Android_CONTENT).getTop();
    int titleBarHeight = contentViewTop - statusBarHeight;
    Log.d("ID-Android-CONTENT", "titleBarHeight = " + titleBarHeight );

アクティビティのonCreateメソッドではうまくいきませんでしたが、onClickListenerに入れて25の測定値を得たときにはうまくいきました。

6
Martyn

android 6.0ではステータスバーの高さは24dpです。

 <!-- Height of the status bar -->
 <dimen name="status_bar_height">24dp</dimen>
 <!-- Height of the bottom navigation / system bar. -->
 <dimen name="navigation_bar_height">48dp</dimen>

答えはソースコードにあります。frameworks\base\core\res\res\values\dimens.xml

5
xiaoyuan hu

これを解決するために、私は組み合わせアプローチを使用しました。これはタブレットではdisplay.getHeight()が呼ばれたときにシステムバーが既にそのピクセルを差し引くために必要です。それで私は最初にシステムバーが存在するかどうかをチェックし、そしてBen Claytonsがアプローチします、それは電話でうまく働きます。

public int getStatusBarHeight() {
    int statusBarHeight = 0;

    if (!hasOnScreenSystemBar()) {
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "Android");
        if (resourceId > 0) {
            statusBarHeight = getResources().getDimensionPixelSize(resourceId);
        }
    }

    return statusBarHeight;
}

private boolean hasOnScreenSystemBar() {
    Display display = getWindowManager().getDefaultDisplay();
    int rawDisplayHeight = 0;
    try {
        Method getRawHeight = Display.class.getMethod("getRawHeight");
        rawDisplayHeight = (Integer) getRawHeight.invoke(display);
    } catch (Exception ex) {
    }

    int UIRequestedHeight = display.getHeight();

    return rawDisplayHeight - UIRequestedHeight > 0;
}
4
Rutger

切り替えフルスクリーンソリューション:

この解決策は回避策のように見えるかもしれませんが、それは実際にあなたのアプリがフルスクリーン(別名ステータスバーを隠す)かどうかを説明します:

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point(); display.getSize(size);
int barheight = size.y - findViewById(R.id.rootView).getHeight();

このようにして、アプリが現在フルスクリーンである場合、barheightは0になります。

個人的には、ステータスバーを考慮するために絶対的なTouchEvent座標を修正するためにこれを使用しなければなりませんでした:

@Override
public boolean onTouch(View view,MotionEvent event) {
    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point(); display.getSize(size);
    int YCoord = (int)event.getRawY() - size.y + rootView.getHeight());
}

そしてそれは、アプリがフルスクリーンかどうかに関わらず、絶対的なy座標を取得します。

楽しい

2
Aaron Gillion

Android 4.1以降では、ステータスバーが隠れて表示されてもコンテンツのサイズが変更されないように、アプリケーションのコンテンツをステータスバーの後ろに表示するように設定できます。これを行うには、SYSTEM_UI_FLAG_LAYOUT_FULLSCREENを使用してください。アプリが安定したレイアウトを維持するためにSYSTEM_UI_FLAG_LAYOUT_STABLEを使用する必要があるかもしれません。

この方法を使用するときは、アプリのUIの重要な部分(たとえば、Mapsアプリケーションの組み込みコントロール)がシステムバーで覆われないようにする必要があります。これにより、アプリが使用できなくなる可能性があります。ほとんどの場合、これを処理するには、trueに設定したAndroid:fitsSystemWindows属性をXMLレイアウトファイルに追加します。これにより、親ViewGroupの余白が調整され、システムウィンドウ用のスペースが確保されます。ほとんどのアプリケーションではこれで十分です。

ただし、場合によっては、アプリに適したレイアウトにするためにデフォルトの余白を変更する必要があります。システムバー(ウィンドウの「コンテンツインセット」として知られているスペースを占める)に対するコンテンツのレイアウト方法を直接操作するには、fitSystemWindows(Rectインセット)をオーバーライドします。 fitSystemWindows()メソッドは、ウィンドウの内容インセットが変更されたときにビュー階層によって呼び出され、それに応じてウィンドウがその内容を調整できるようにします。このメソッドをオーバーライドすることで、あなたが望むインセット(そしてあなたのアプリのレイアウト)を扱うことができます。

フォーム: https://developer.Android.com/training/system-ui/status.html#behind

2
xiaoyuan hu

@ Niklas +1のおかげで、これが正しい方法です。

public class MyActivity extends Activity implements Android.support.v4.View.OnApplyWindowInsetsListener {

    Rect windowInsets;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.my_activity);

        View rootview = findViewById(Android.R.id.content);

        Android.support.v4.View.ViewCompat.setOnApplyWindowInsetsListener(rootview, this);
    }

    Android.support.v4.View.WindowInsetsCompat Android.support.v4.View.OnApplyWindowInsetsListener.OnApplyWindowInsets(View v, Android.support.v4.View.WindowInsetsCompat insets)
    {
        windowInsets = new Rect();
        windowInsets.set(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom());
        //StatusBarHeight = insets.getSystemWindowInsetTop();

        //Refresh/Adjust view accordingly

        return insets;
    }
}

Xamarin C#から変換したコードが100%正しくない場合は申し訳ありませんが、これだけです。ノッチなどで動作します.

1
Pierre

あなたが正確にサイズ対高さを知っていれば

好き

たとえば、320 x 480の画面サイズのデバイスではステータスバーの高さは25ピクセル、480 x 800のデバイスではステータスバーの高さは38ピクセルです。

ステータスバーの高さを取得するには、if else文を使用するだけでビューの幅/画面サイズを取得できます。

1
Steven Shih

一部の人にとって一番の答えがうまくいかないのは、レンダリングの準備ができるまでビューの寸法を取得できないためです。実際に次のことができる場合は、OnGlobalLayoutListenerを使用して上記の寸法を取得します。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final ViewGroup decorView = (ViewGroup) this.getWindow().getDecorView();
    decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (Build.VERSION.SDK_INT >= 16) {
                decorView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            } else {
                // Nice one, Google
                decorView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            }
            Rect rect = new Rect();
            decorView.getWindowVisibleDisplayFrame(rect);
            rect.top; // This is the height of the status bar
        }
    }
}

これが最も信頼できる方法です。

1
user1112789

私のPixel 3 XLのノッチのために、この問題は最近私にとって重要になりました。私は本当に Android開発者の解決策 が好きでしたが、フルスクリーンアニメーションには特に必要だったので、ステータスバーの高さを自由に取得できるようにしたいと思いました私がプレーする必要がありました。以下の機能は信頼できる問い合わせを可能にしました:

private val DEFAULT_INSET = 96
fun getInsets(view: View?): Int {
     var inset = DEFAULT_INSET
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//Safe because only P supports notches
          inset = view?.rootWindowInsets?.stableInsetTop ?: DEFAULT_INSET
     }
     return inset
}

fun blurView(rootView: View?, a: SpacesActivity?) {
    val screenBitmap = getBitmapFromView(rootView!!)
    val heightDifference = getInsets(rootView)
    val croppedMap = Bitmap.createBitmap(
                    screenBitmap, 0, heightDifference,
                    screenBitmap.width,
                    screenBitmap.height - heightDifference)
    val blurredScreen = blurBitmap(croppedMap)
    if (blurredScreen != null) {
         val myDrawable = BitmapDrawable(a!!.resources, blurredScreen)
         a.errorHudFrameLayout?.background = myDrawable
         a.appBarLayout?.visibility = View.INVISIBLE
   }
}

そして活動クラスでは:

fun blurView() {
    this.runOnUiThread {
        Helper.blurView(this)
    }
}

もちろん、アクティビティの弱い参照を静的なHelperクラスメソッドのパラメータに渡したいと思うでしょうが、簡潔にするためにこの例では控えています。 blurBitmaperrorHudFrameLayoutは、ステータスバーの高さの取得に直接関係しないため、同じ理由で省略されています。

0