Androidのステータスバーの高さは? いつも同じですか?
私の測定では 25 dp のようですが、すべてのプラットフォームで同じ高さかどうかはわかりません。
(ステータスバーを持たないアクティビティからステータスバーを持つアクティビティへのフェードトランジションを適切に実装するためにこれを知りたいです)
この質問は以前に回答済みです... ステータスバーの高さは?
更新::
ステータス バーの高さは画面サイズによって異なります。 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);
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;
}
onCreate
ステータスバーの高さを取得するために使用したすべてのコードサンプルのうち、anのメソッドで実際に機能しているように見えるのActivity
は次のとおりです。
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/にあります
MDPIデバイスでは、ステータスバーは25pxです。これをベースとして使用し、密度(切り上げ)を掛けて、任意のデバイスのステータスバーの高さを取得できます。
int statusBarHeight = Math.ceil(25 * context.getResources().getDisplayMetrics().density);
参考:ldpi = .75、mdpi = 1、hdpi = 1.5、xhdpi = 2
いくつかのソリューションをまとめました:
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
これは参照リンクでも機能します
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
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.html http://developer.android.com/guide/practices/ui_guidelines/icon_design.html
はい、ビューで試してみると、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);
}
}
}
}
240x320 - 20 ピクセル
320x480 - 25 ピクセル
480x800+ - 38px
これを試して:
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の測定値を与えたときに機能しました
Android 6.0 では、ステータス バーの高さは 24 dp です。
<!-- 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
これを解決するために、組み合わせアプローチを使用しました。タブレットでは、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;
}
一部の人々にとって一番の答えがうまくいかない理由は、レンダリングの準備が整うまでビューの寸法を取得できないためです。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
}
}
}
これが最も信頼できる方法です。
サイズと身長が正確にわかっている場合
お気に入り
たとえば、画面サイズが 320 X 480 のデバイスの場合、ステータス バーの高さは 25 ピクセルです。480 X 800 のデバイスの場合、ステータス バーの高さは 38 ピクセルにする必要があります。
次に、ビューの幅/画面サイズを取得するだけで、if elseステートメントを使用してステータスバーの高さを取得できます