Android'de durum çubuğunun yüksekliği


332

Android'deki durum çubuğunun yüksekliği nedir? Hep aynı mı?

Ölçümlerimden 25dp gibi görünüyor, ancak tüm platformlarda aynı yüksekliğe sahip olup olmadığından emin değilim.

(Durum çubuğu olmayan bir etkinlikten etkin olmayan bir etkinliğe yavaşça geçiş uygulamak için bunu bilmek istiyorum)


Bir çapraz solma yaparsanız, durum çubuğunun yüksekliğini bilmeniz gerekmez.
stealthcopter

2
İhtiyacım var, çünkü bazı öğeler mizanpajda ortalanmış ve onları birbirlerinin içine soldurmak istiyorum.
hpique

Yanıtlar:


363

bu soru daha önce cevaplandı ... Durum çubuğunun yüksekliği?

Güncelleme ::

Mevcut yöntem:

tamam, durum çubuğunun yüksekliği ekran boyutuna bağlıdır, örneğin 240 X 320 ekran boyutuna sahip bir cihazda durum çubuğu yüksekliği 20 pikseldir, 320 X 480 ekran boyutuna sahip bir cihaz için durum çubuğu yüksekliği 25 pikseldir, durum çubuğu yüksekliği 480 x 800 olan cihaz 38 piksel olmalıdır

bu yüzden durum çubuğu yüksekliğini almak için bu komut dosyasını kullanmanızı öneririz

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

(eski Yöntem) onCreate()Etkinliğinizin yöntemindeki durum çubuğunun Yüksekliğini almak için şu yöntemi kullanın:

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

Tam olarak değil. Ayrıca durum çubuğunun tüm cihazlarda aynı yüksekliğe sahip olduğunu varsayabilir miyim diye soruyorum.
hpique

16
Veya daldırma kullanın? Her zaman 25 dip varsa kod gerekli değildir.
hpique

8
her zaman 25 dp olduğunu varsayamazsınız (örneğin ateş yakarken yüksekliğini kontrol edin).
DallinDyer

1
OnCreate () içinde view.post () öğesine iletilen runnable'da çalışmıyor - 0 döndürür
Ixx

4
window.getDecorView().getWindowVisibleDisplayFrame(rectangle)çoklu pencere modunda + dikey döndürme + ikinci pencerede iseniz durum çubuğu yüksekliğini almanın doğru bir yolu değildir. Büyük bir değer elde edersiniz (1. yüksekliği dahil).
Tuan Chau

211

Durum çubuğunun yüksekliğini elde etmek için kullandığım tüm kod örneklerinden, aslında onCreatebir yöntemde çalışıyor gibi görünen tek şey Activityşudur:

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

Görünüşe göre durum çubuğunun gerçek yüksekliği bir Android kaynağı olarak tutuluyor. Yukarıdaki kod bir ContextWrappersınıfa eklenebilir (örn. Bir Activity).

Http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/ adresinde bulundu


Sert kodlamak yerine, dinamik olarak hesaplamak daha iyidir. Yukarıdaki yöntem benim için çalıştı!
simyacı

Bunun yerine getDimension (...) kullanmamalısınız?
android geliştirici

6
Dikkatli bir kelime - bu tüm cihazlarda çalışmaz. Örneğin Transformatör TF201'de (TF101, TF300 ve diğer bazı cihazlarda), durum çubuğunun olmadığı yerlerde yükseklik 25 olarak bildirilir.
Błażej Czapp

4
Yukarıdaki yorumlara dayanarak, kodun size durum çubuğunun yüksekliğinin belirli bir cihazda ne olduğunu (aslında bir durum çubuğuna sahip olmayabilir) ne olduğunu söylediği anlaşılıyor.
sersemlemiş

XML'de "@android: dimen / status_bar_height" dimen kaynağı kullanılabilir. <! - Android sistem kaynak dosyasında tanımlanan durum çubuğunun yüksekliği -> <dimen name = "status_bar_height"> 24dp </dimen>. Ancak, uygulama projenizde doğrudan referans veremezsiniz. Bu yüzden kodu kullanmalısınız.
Tshunglee

48

MDPI cihazlarda durum çubuğu 25 pikseldir. Herhangi bir cihazda durum çubuğu yüksekliğini elde etmek için bunu taban olarak kullanabilir ve yoğunlukla (yuvarlanmış) çarpabiliriz:

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

Referans için: ldpi = .75, mdpi = 1, hdpi = 1.5, xhdpi = 2


6
Bu cihazlar için doğrudur sahip bir durum çubuğu. Yukarıdakilerin yazılmasından bu yana, tüm cihazların bir tane olmayacağı doğrulandı. Özellikle, ICS çalıştıran cihazların alt kısmında birleşik durum / gezinme çubuğu olabilir ve üst kısımda hiçbir şey olmayabilir. Bu durumda, çoğu programlama amacıyla, durum çubuğuna sıfır yüksekliği atamak istersiniz, ancak yukarıdaki formülasyon size sıfır olmayan bir boyut verir.
Carl

1
Ayrıca 25px değeri tüm mdpi aygıtları için doğru değildir. API düzeyine göre değişiklik gösterebilir. Örneğin, 10.1 WXGA tablet emülatör cihazı API 16 ve 19'da 25 piksel, API 24'te 24 piksel rapor eder.
jk7

48

Değerini elde etmek için boyutu kodlamak veya yansıma kullanmak status_bar_heightkötü uygulama olarak kabul edilir. Chris Banes bu konuyu Droidcon New York'ta anlattı . Durum çubuğu boyutunu almanın önerilen yolu OnApplyWindowInsetsListener'dır :

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

Bu, API 20'ye eklenmiştir ve ayrıca ViewAppCompat aracılığıyla da desteklenmektedir .


Bu bugünün en doğru cevabı
keith

benim için bu sadece bir kez ateş, alt nav yoluyla parçaları varsa. Parçayı tekrar değiştirirsem, bu dinleyici çağrılmaz, uygun bir alıcı da var mı?
urSus

74
Yine de bu API korkunç, çünkü sahne arkasındaki WTF / Gotchas sayısı çok büyük. Bunu herhangi bir görünümle yapabileceğinizi düşünürsünüz, ancak hayır, bazı şeyleri geçersiz kılmanız ve iç metinleri çocuklarınıza geçirdiğinizden emin olmanız gerekir (??) çünkü BAZI ViewGroups (malzeme tasarımı) ve TÜM DİĞERLERİ ( doğrusal düzen? ConstraintLayout? merhaba?). Bir Window.getStatusBarSize () sistemine sahip olmak yerine… HAYAL EDİCİ BİR LİSTENE ABONE OLMALI… Android'e git, sarhoşsun. Google uyanana kadar sadece boyutu
kodlayın, 2018'deyiz.

Benim durumumda kovulmuyor. Etkinlik # onCreated üzerine koydum. Ben yanlış bir şey mi yaptım? Ayrıca neden mView.getRootWindowInsets () kullanmıyoruz?
Adil Aliyev

34

Bazı çözümleri bir araya getirdim:

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

başka bir alternatif:

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

DÜZENLEME: runJustBeforeBeingDrawn için Alternatif: https://stackoverflow.com/a/28136027/878126


getResources (). getDisplayMetrics (). heightPixels -getActivity (). findViewById (android.R.id.content) .getMeasuredHeight () android
lolipopta

@ ArMo372 Güncellenmiş yanıt. Sadece görünümün önce ölçümü geçmesi gerekiyor. Zaten geçtiyseniz runJustBeforeBeingDrawn'ı kullanmanıza gerek yoktur. Sadece çok erken durumlarda kullanacaksınız.
android geliştirici

28

Göre Google tasarım yönergelerine ; durum çubuğunun yüksekliği 24 dp'dir.

Durum çubuğu yüksekliğini piksel olarak almak istiyorsanız aşağıdaki yöntemi kullanabilirsiniz:

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

aşağıdakilerle etkinlikten çağrılabilir:

statusBarHeight(getResources());

18
Marshmallow'a kadar 25dp idi. Marshmallow'tan beri 24dp.
Eugen Pechanec

1
bu aslında tasarım değişikliklerine izin vermeyen değeri zor
siliconeagle

1
ve durum çubuğunun aynı durumlarda gösterilmeyeceğini
açıklamıyor

19

Varsayılan yükseklik 25dp idi. Android Marshmallow (API 23) ile yükseklik 24dp'ye düşürüldü.

Güncelleme: Çentiklerin ve zımba tüm kameraların yaşı başladığından beri, durum çubuğu için statik bir yükseklik kullanmanın artık çalışmadığını unutmayın. Lütfen bunun yerine pencere iç metinlerini kullanın!


1
tatlı! Sadece yüksekliği 24dp olarak kodladığım API seviyesi 23+ için bir dimens.xml yaptım.
Birisi

18

bu aynı zamanda referans bağlantısı ile de çalışır

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

13

Bir onCreate durum çubuğu yüksekliği almak zorunda aynı sorun var. Bu benim için çalışıyor.

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;

İçinde

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

Görmek:

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


3
Yoğunluk odaklı değerleri kullanma fikrinizi seviyorum. Kodu birden fazla yerde kullanacaksanız (veya yoğunlukla ilgili diğer değerleri kullanacaksanız) çalışmayı sisteme boşaltmayı ve değerleri bir düğmeyi gereksiz kılan bir azaltılmış kaynakta depolamayı tercih ederim. Her yoğunluk için boyuta özgü bir klasör ve kaynak dosyası oluşturmanız gerekir. nihai Kaynaklar res = context.getResources (); int statusbarHeight = 0; {statusbarHeight = res.getDimensionPixelSize (R.dimen.android_statusbar_height); } catch (NotFoundException e) {}
ProjectJourneyman

5
Bu değerleri kodlamak tehlikelidir, ya daha sonraki bir platform sürümünde değişirse?
David Snabel-Caunt

Ben sabit kodlu piksel boyutları (her yoğunluk için bir tane) kullanmak yerine, "25dp" kullanmak daha iyi olduğunu düşünüyorum.
android geliştirici


12

Evet, View ile denediğimde 25px sonucunu verir. İşte tüm kod:

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

Yukarıdaki kod, yukarıda yaptığınız gibi yeni bir lineer düzen oluşturduğunuzda, ancak xml'den lySpin için findviewbyid yaptığımda benim için çalışıyor. sonra null değerini döndürür. anlamadım, öyle davranıyor.
Shaista Naaz

Düzen, henüz onCreate'de boyutunu bilmiyor çünkü çizilmeyi bitirmedi. Ne genellikle yapmak UC iş parçacığı kendini çizmek için zaman veren onCreate UI iş parçacığında bir Runnable sonrası.
Jason Robinson

8

240x320 - 20 piksel

320x480 - 25 piksel

480x800 + - 38 piksel


3
Bu artık doğru değil. Durum çubuğunu ölçmek için bir yöntem kullanın.
Michael

7

Bunu dene:

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

etkinlik için onCreate yönteminde benim için çalışmadı, ancak bir onClickListener'a koyduğumda ve bana 25 ölçüm verdiğinde işe yaradı


OnCreate () 'de test ettiği noktada durum çubuğunun henüz oluşturulmadığından şüpheleniyorum. Buna karşılık, onClickListener () kodunu etkinleştirmek için manuel olarak tıkladığında, çubuğun görüntülenmesi için zaten çok sayıda düşünme türü vardı ve boyutunu alabildi.
Carl

6

Android 6.0'da durum çubuğunun yüksekliği 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>

cevabı kaynak kodda bulabilirsiniz: frameworks \ base \ core \ res \ res \ değerleri \ dimens.xml


XML'lerimizde bu kaynağı almanın bir yolu var mı? @android:dimen/status_bar_heightbenim için çalışmıyor
Patrick

4

Bunu çözmek için bir kombinasyon yaklaşımı kullandım. Bu, tabletlerde, display.getHeight () çağrıldığında sistem çubuğunun piksellerini zaten çıkardığı için gereklidir. Bu yüzden önce bir sistem çubuğunun olup olmadığını kontrol ediyorum ve sonra telefonlarda iyi çalışan Ben Claytons yaklaşımı.

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

3

@Niklas +1 sayesinde bunu yapmanın doğru yolu budur.

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

Kod% 100 doğru değilse, lütfen özür dilerim, Xamarin C # 'dan dönüştürdüm, ancak bu sadece. Çentikler vb. İle çalışır.


2

Geçişli Tam Ekran Çözümü:

Bu çözüm bir geçici çözüm gibi görünebilir, ancak aslında uygulamanızın tam ekran olup olmadığını (durum çubuğunu gizleme olarak da bilinir) açıklar:

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

Bu şekilde, uygulamanız şu anda tam ekran barheightise 0'a eşit olur.

Şahsen bunu durum çubuğunu şu şekilde açıklamak için mutlak TouchEvent koordinatlarını düzeltmek için kullanmak zorunda kaldım:

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

Bu, uygulamanın tam ekran olup olmadığına dair mutlak y koordinatını alır.

Zevk almak


Teşekkürler, bu android klavye de gösterdiğinde benim için çalışan tek çözüm oldu.
Thiago Moura

2

Android 4.1 ve sonraki sürümlerde, uygulamanızın içeriğini durum çubuğunun arkasında görünecek şekilde ayarlayabilirsiniz, böylece durum çubuğu gizlendikçe ve gösterildikçe içerik yeniden boyutlandırılmaz. Bunu yapmak için SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN kullanın. Uygulamanızın kararlı bir düzen sağlamasına yardımcı olmak için SYSTEM_UI_FLAG_LAYOUT_STABLE'ı da kullanmanız gerekebilir.

Bu yaklaşımı kullandığınızda, uygulamanızın kullanıcı arayüzünün kritik bölümlerinin (örneğin, bir Haritalar uygulamasındaki yerleşik denetimler) sistem çubukları tarafından kapsanmamasını sağlamak sizin sorumluluğunuzdadır. Bu, uygulamanızı kullanılamaz hale getirebilir. Çoğu durumda bunu XML düzen dosyanıza true olarak ayarlanmış android: fitsSystemWindows özniteliğini ekleyerek halledebilirsiniz. Bu, sistem pencereleri için boşluk bırakacak şekilde üst ViewGroup'un dolgusunu ayarlar. Bu, çoğu uygulama için yeterlidir.

Bununla birlikte, bazı durumlarda, uygulamanız için istenen düzeni elde etmek için varsayılan dolguyu değiştirmeniz gerekebilir. İçeriğinizin sistem pencerelerine (pencerenin "içerik iç metinleri" olarak bilinen bir alanı kaplayan) göre nasıl düzenlendiğini doğrudan değiştirmek için fitSystemWindows'u (Rect metinleri) geçersiz kılın. Bir pencerenin içerik iç metinleri değiştiğinde, pencerenin içeriğini buna göre ayarlamasına izin vermek için fitSystemWindows () yöntemi görünüm hiyerarşisi tarafından çağrılır. Bu yöntemi geçersiz kılarak ekleri (ve böylece uygulamanızın düzenini) istediğiniz gibi işleyebilirsiniz.

form: https://developer.android.com/training/system-ui/status.html#behind


1

Tam olarak VS yüksekliğini biliyorsanız

sevmek

örneğin 320 X 480 ekran boyutuna sahip bir cihazda durum çubuğu yüksekliği 25 pikseldir, 480 x 800 değerine sahip bir cihaz için durum çubuğu yüksekliği 38 piksel olmalıdır

durum çubuğunuzun yüksekliğini elde etmek için yalnızca bir if ifadesi kullanarak görünümünüzün genişliğini / ekran boyutunu elde edebilirsiniz.


Deneyimlerime göre, yükseklik ekran boyutundan ziyade yoğunluğa dayanıyor gibi görünüyor. Tabii ki, yoğunluğun kendisi tipik olarak ekran boyutu ile ilgilidir, bu nedenle dolaylı bir ilişki vardır. Örneğin, eski Moto Droid cihazım 480x854 (480x800 yerine) ekrana sahip ve durum çubuğu da 38 piksel yüksekliğinde.
Carl

Bunun için dp icat ettiler (yoğunluk bağımsız pikseller)
Roel

1

En iyi yanıtın bazı insanlar için işe yaramamasının nedeni, bir görünümün görüntülenmeye hazır olana kadar boyutlarını alamamanızdır. OnGlobalLayoutListenerGerçekte şunları yapabildiğinizde, belirtilen boyutları almak için a kullanın :

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

Bu en güvenilir yöntemdir.


1
@androiddeveloper OnGlobal! = GlobalOn
marijnz0r

@ marijnz0r Ne kadar garip. Bununla olan anlaşma nedir?
android geliştirici

@androiddeveloper Bilmiyorum, ama birkaç gün önce yaptığınız gibi düşünmüştüm. Bakınız: stackoverflow.com/a/19216041/4587214
marijnz0r

@ marijnz0r Yani ikisi de aynısını yapıyor. Daha önce var olan bir şey için yeni bir isim verdiklerini ve bir öncekini reddettiklerini hatırlatıyor. Örnek "fill_parent" vs "match_parent": geliştirici.android.com/
android/

1

Çoklu pencere modu artık kullanılabilir olduğundan, uygulamanızın üst kısmında durum çubuğu olmayabilir.

Aşağıdaki çözüm sizin için tüm durumları otomatik olarak ele alır.

android:fitsSystemWindows="true"

veya programlı olarak

findViewById(R.id.your_root_view).setFitsSystemWindows(true);

tarafından kök görünümü de alabilirsiniz

findViewById(android.R.id.content).getRootView();
or
getWindow().getDecorView().findViewById(android.R.id.content)

Kök görünüm alma hakkında daha fazla bilgi için bkz. - https://stackoverflow.com/a/4488149/9640177


0

Bu sorun, Pixel 3XL'imdeki çentik nedeniyle son zamanlarda benim için alakalı oldu. Android geliştiricisinin çözümünü gerçekten çok sevdim , ancak oynamak istediğim tam ekran animasyon için özellikle gerekli olduğundan, durum çubuğu yüksekliğini istediğiniz zaman elde etmek istedim. Aşağıdaki işlev güvenilir bir sorgu etkinleştirdi:

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

Ve sonra aktivite sınıfında:

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

Elbette etkinliğin statik Helper sınıfı yöntem parametresine zayıf bir referansını iletmek isteyeceksiniz, ancak kısalık uğruna bu örnekte reddedildim. blurBitmapVe errorHudFrameLayoutdoğrudan durum çubuğunun yüksekliğini elde ilgilendirmeyen vermediği için, aynı nedenle atlanmıştır.


Android P ve üstü içinse, neden Android M ile kontrol etmelisiniz? Ayrıca, bir View örneğiniz yoksa ne yapardınız? Örneğin, şu anda bir Etkinliğiniz yoksa ...
android geliştirici

M, stabilInsetTop'u kontrol edebileceğiniz en erken yöntemdir ve yalnızca P destekli çentikler olsa bile, asıl içgörü elde etmeyi tercih ederim. Bir etkinliğiniz yoksa bu çözüm çalışmaz.
James Jordan Taylor

Anlıyorum. Teşekkür ederim. Lütfen daha "tam" bir örnek gösterebilir misiniz?
android geliştirici

Yukarıdaki cevabı bir örnekte kullanmak için değiştirdim.
James Jordan Taylor

0

En iyi iki çözümü birleştiren Kotlin versiyonu

fun getStatusBarHeight(): Int {
    val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android")
    return if (resourceId > 0) resources.getDimensionPixelSize(resourceId)
    else Rect().apply { window.decorView.getWindowVisibleDisplayFrame(this) }.top
}
  1. Alır status_bar_height eğer varsa değer
  2. status_bar_heightMevcut değilse , Pencere dekorundan durum çubuğu yüksekliğini hesaplar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.