एंड्रॉइड में स्टेटस बार की ऊंचाई


332

एंड्रॉइड में स्टेटस बार की ऊंचाई कितनी है? क्या हमेशा ऐसा ही होता है?

मेरे माप से ऐसा लगता है कि यह 25dp है, लेकिन मुझे यकीन नहीं है कि सभी प्लेटफार्मों पर इसकी ऊंचाई समान है।

(मैं यह जानना चाहता हूं कि यह एक गतिविधि से फीका संक्रमण को ठीक से लागू कर सकता है जिसमें स्थिति पट्टी नहीं है जो ऐसा करता है)


यदि आप एक क्रॉस फीका करते हैं तो आपको स्टेटस बार की ऊंचाई जानने की आवश्यकता नहीं होगी।
स्टील्कोप्टर

2
मुझे इसकी आवश्यकता है क्योंकि कुछ तत्व लेआउट में केंद्रित हैं, और मुझे उन्हें एक दूसरे में फीका करना होगा।
hpique 16

जवाबों:


363

इस सवाल का जवाब दिया गया था ... स्थिति की ऊँचाई?

अद्यतन ::

वर्तमान विधि:

ठीक है, स्थिति बार की ऊंचाई स्क्रीन के आकार पर निर्भर करती है, उदाहरण के लिए 240 X 320 स्क्रीन आकार के साथ एक डिवाइस में स्थिति पट्टी की ऊंचाई 20px है, 320 X 480 स्क्रीन आकार वाले डिवाइस के लिए स्थिति बार की ऊँचाई 25px है, एक के लिए 480 x 800 के साथ डिवाइस की स्थिति पट्टी की ऊंचाई 38px होनी चाहिए

तो मैं स्थिति पट्टी ऊंचाई पाने के लिए इस स्क्रिप्ट का उपयोग करने की सलाह देता हूं

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

बिल्कुल नहीं। मैं यह भी पूछ रहा हूं कि क्या मैं मान सकता हूं कि सभी उपकरणों में स्थिति पट्टी की ऊंचाई समान है।
hpique

16
या डुबकी का उपयोग करें? यदि इसमें हमेशा 25dip है तो कोड की आवश्यकता नहीं है।
12

8
आप यह हमेशा नहीं मान सकते हैं कि यह 25dp है (किंडल फायर पर उदाहरण के लिए ऊंचाई देखें)।
डैलिनडायर

1
देखने में पास होने योग्य काम नहीं करता। onstreate में post () () - वापसी 0
Ixx

4
window.getDecorView().getWindowVisibleDisplayFrame(rectangle)यदि आप मल्टी-विंडो मोड + पोर्ट्रेट रोटेशन + सेकंड विंडो में हैं, तो स्टेटस बार हाइट पाने का एक सही तरीका नहीं है। आपको एक बड़ा मूल्य मिलेगा (पहली ऊंचाई शामिल करें)।
तुआन चौ

211

स्टेटस बार की ऊँचाई प्राप्त करने के लिए मैंने उपयोग किए गए सभी कोड नमूनों में से, केवल वही है जो वास्तव में इस onCreateपद्धति की विधि में काम करता 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/ पर मिला


इसे हार्ड कोडिंग के बजाय, गतिशील रूप से गणना करने के लिए बेहतर है। उपरोक्त विधि मेरे लिए काम करती है!
कीमियागर

क्या आपको इसके बजाय getDimension (...) का उपयोग नहीं करना चाहिए?
Android डेवलपर

6
सावधानी का एक शब्द - यह सभी उपकरणों पर काम नहीं करता है। ट्रांसफार्मर TF201 पर (साथ ही TF101, TF300 और कुछ अन्य उपकरणों पर) ऊंचाई 25 के रूप में रिपोर्ट की जाती है जहां कोई स्थिति पट्टी नहीं है।
बलोएज कजप्प

4
उपरोक्त टिप्पणियों के आधार पर, यह मुझे लगता है कि कोड आपको बता रहा है कि किसी विशेष डिवाइस पर स्थिति पट्टी की ऊंचाई क्या है - यह नहीं कि यह किसी विशेष गतिविधि पर क्या है (जो वास्तव में स्थिति पट्टी नहीं हो सकती है)।
स्तब्ध

XML में डिमेन रिसोर्स "@android: dimen / status_bar_height" का उपयोग किया जा सकता है। <! - एंड्रॉइड सिस्टम सोर्स फाइल में परिभाषित स्टेटस बार की ऊँचाई -> <dimen name = "status_bar_height"> 24dp </ dimen>। लेकिन आप इसे अपने ऐप प्रोजेक्ट में रेफरेंस नहीं दे सकते। इसलिए आपको कोड का उपयोग करना चाहिए।
तशलीह

48

एमडीपीआई उपकरणों पर, स्थिति बार 25px है। हम इसका उपयोग आधार के रूप में कर सकते हैं और किसी भी डिवाइस पर स्टेटस बार की ऊंचाई प्राप्त करने के लिए इसे घनत्व (गोल करके) से गुणा कर सकते हैं:

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

संदर्भ के लिए: ldpi = .75, mdpi = 1, hdpi = 1.5, xhdpi = 2


6
यह उन उपकरणों के लिए सही है जिनके पास एक स्थिति पट्टी है। ध्यान दें कि ऊपर लिखा गया था, यह सच हो गया कि सभी उपकरणों में एक नहीं होगा। विशेष रूप से, आईसीएस चलाने वाले उपकरणों के तल में एक संयुक्त स्थिति / नौसेना पट्टी हो सकती है और शीर्ष पर कुछ भी नहीं हो सकता है। तो उस स्थिति के लिए, अधिकांश प्रोग्रामिंग उद्देश्यों के लिए, आप स्थिति पट्टी पर शून्य की ऊँचाई असाइन करना चाहते हैं, लेकिन उपरोक्त सूत्रीकरण आपको एक शून्य-शून्य आकार देगा।
कार्ल

1
साथ ही सभी mdpi उपकरणों के लिए 25px मान सही नहीं है। यह एपीआई स्तर के आधार पर भिन्न हो सकता है। उदाहरण के लिए, 10.1 WXGA टैबलेट एमुलेटर डिवाइस एपीआई 16 और 19 पर 25px रिपोर्ट करता है, लेकिन एपीआई 24 पर जीपीएक्स।
जेके 7

48

आकार को हार्डकोड करना या मान प्राप्त करने के लिए प्रतिबिंब का उपयोग status_bar_heightकरना बुरा अभ्यास माना जाता है। Droidcon न्यूयॉर्क में क्रिस बैन्स ने इस बारे में बात की । स्थिति बार आकार प्राप्त करने का अनुशंसित तरीका OnApplyWindowInsetsListener के माध्यम से है :

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

यह एपीआई 20 में जोड़ा गया था और ViewAppCompat के माध्यम से भी इसका निर्यात किया जाता है


यह आज का सबसे सटीक उत्तर है
कीथ

मेरे लिए यह केवल एक बार फायर करता है, अगर मेरे पास नीचे की नौसेना के टुकड़े हैं। अगर मैं फिर से टुकड़े को बदल दूं, तो इस श्रोता को फोन नहीं किया जाता है, क्या कोई हमउम्र है?
यूरसस

74
और फिर भी यह एपीआई भयानक है, क्योंकि पर्दे के पीछे डब्ल्यूटीएफ / गोचैकों की संख्या बहुत बड़ी है। आपको लगता है कि आप इसे किसी भी दृश्य के साथ कर सकते हैं, लेकिन नहीं, आपको कुछ चीजों को ओवरराइड करने और यह सुनिश्चित करने की आवश्यकता है कि आप अपने बच्चों को इनसेट पास करें (??) क्योंकि कुछ ViewGroups (सामग्री डिजाइन) और सभी OTHERS नहीं करेंगे ( रैखिक लेआउट? ConstraintLayout? हैलो?)। Window.getStatusBarSize () ... के सिस्टम के बजाय ... हमें एक फ्रीस्टाइल लिस्टेंर को SUBSCRIBE करना है ... घर पर जाएं Android, आप नशे में हैं। जब तक गूगल जागता है, तब तक आकार को हार्डकोड करें, हम 2018 में हैं। मुझे उम्मीद है कि क्रिस
बैन्स

मेरे मामले में इसे निकाल नहीं दिया जा रहा है। मैंने इसे गतिविधि # चालू किया। क्या मैंने कुछ गलत किया? इसके अतिरिक्त हम mView.getRootWindowInsets () का उपयोग क्यों नहीं करते हैं?
आदिल अलीयेव

34

मैंने कुछ समाधानों को एक साथ मिला दिया है:

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


।।। getResources () getDisplayMetrics () heightPixels -getActivity () findViewById (android.R.id.content) .getMeasuredHeight () एंड्रॉयड lolipop में काम नहीं
abbasalim

@ ArMo372 अपडेटेड उत्तर। यह सिर्फ इतना है कि दृश्य को पहले माप पारित करने की आवश्यकता है। यदि आपने इसे पहले ही पास कर लिया है तो आपको runJustBeforeBeingDrawn का उपयोग करने की आवश्यकता नहीं है। आप इसका उपयोग केवल शुरुआती मामलों में ही करेंगे।
Android डेवलपर

28

Google डिज़ाइन दिशानिर्देशों के अनुसार ; स्टेटस बार की ऊंचाई 24 डीपी है।

यदि आप पिक्सेल में स्थिति बार ऊँचाई प्राप्त करना चाहते हैं, तो आप नीचे दी गई विधि का उपयोग कर सकते हैं:

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

जिसे गतिविधि से बुलाया जा सकता है:

statusBarHeight(getResources());

18
मार्शमैलो तक यह 25dp था। मार्शमैलो के बाद से यह 24dp है।
यूजेन पिसेंक सेप

1
यह अनिवार्य रूप से मूल्य को हार्डकोड करना है - जो डिजाइन में बदलाव के लिए अनुमति नहीं देता है
सिलिकॉन

1
और इस तथ्य पर ध्यान नहीं देता है कि स्टेटस बार एक ही मामलों में प्रदर्शित नहीं किया जाएगा
jk7

19

डिफ़ॉल्ट ऊंचाई 25dp हुआ करती थी। एंड्रॉइड मार्शमैलो (एपीआई 23) के साथ ऊंचाई 24dp तक कम हो गई थी।

अपडेट: कृपया ध्यान रखें कि जब से नोट और पंच-पूरे-कैमरे की उम्र शुरू हुई, स्टेटस बार के लिए स्थैतिक ऊंचाई का उपयोग करना अब काम नहीं करता है। कृपया इसके स्थान पर विंडो इनसेट का उपयोग करें!


1
मिठाई! मैं सिर्फ एक dimens.xml बना दिया विशेष रूप से एपीआई स्तर 23+ के लिए जहां मैंने 24dp के रूप में ऊंचाई को हार्डकोड किया है।
किसी ने

18

यह रिफ्रेंस लिंक के साथ भी काम करता है

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

मैं एक 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


3
मुझे घनत्व-चालित मूल्यों का उपयोग करने का आपका विचार पसंद है। यदि आप कई स्थानों में कोड का उपयोग करने जा रहे हैं (या अन्य घनत्व-संबंधित मूल्यों का उपयोग करते हैं) तो मैं काम को सिस्टम में लोड करना पसंद करता हूं, और एक डिमेन संसाधन में मानों को संग्रहीत करता हूं, जो स्विच को अनावश्यक बनाता है। आपको प्रत्येक घनत्व के लिए एक आयाम-विशिष्ट फ़ोल्डर और संसाधन फ़ाइल बनाने की आवश्यकता है। अंतिम संसाधन Res = संदर्भ.getResources (); int statusbarHeight = 0; {{statusbarHeight = res.getDimensionPixelSize (R.dimen.android_statusbar_height) आज़माएं; } पकड़ (NotFoundException e) {}
ProjectJourneyman

5
इन मूल्यों को हार्डकोड करना खतरनाक है, क्या होगा यदि वे बाद के प्लेटफॉर्म संस्करण में बदलते हैं?
डेविड स्नेबेल-कॉंट

मुझे लगता है कि हार्डकोडेड पिक्सेल आकार (प्रत्येक घनत्व के लिए एक) का उपयोग करने के बजाय, "25dp" का उपयोग करना बेहतर है।
Android डेवलपर


12

हाँ जब मैं इसे 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);
            }
        }
    }
}

उपरोक्त कोड मेरे लिए तब काम कर रहा है जब मैं एक नया रैखिक लेआउट बनाता हूं जैसा कि आपने ऊपर किया है, लेकिन जब मैं एक्सएमएल से लाइस्पिन के लिए फाइंडबायिड करता हूं। तब यह अशक्त हो जाता है। समझ में नहीं आ रहा है तो यह व्यवहार कर रहा है।
शाइस्ता नाज़

क्योंकि लेआउट अभी तक ऑनक्रिएट में अपने आकार को नहीं जानता है क्योंकि यह तैयार नहीं है। मैं आमतौर पर क्या करता है onnreate से UI थ्रेड पर एक रननेबल पोस्ट करता हूं जो यूआई को खुद को आकर्षित करने का समय देता है।
जेसन रॉबिन्सन

8

240x320 - 20 पीएक्स

320x480 - 25 पीएक्स

480x800 + - 38px


3
यह अब सटीक नहीं है। स्थिति पट्टी को मापने की एक विधि का उपयोग करें।
माइकल

7

इसे इस्तेमाल करे:

    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 का माप दिया


मुझे संदेह है कि जिस बिंदु पर उन्होंने onCreate () में परीक्षण किया था, अभी तक स्टेटस बार नहीं बनाया गया था। इसके विपरीत, जब वह अपने onClickListener () कोड को सक्रिय करने के लिए मैन्युअल रूप से क्लिक करता था, तो बार के पास प्रदर्शन के लिए पहले से ही बहुत सोचने-समझने का समय होता था, और वह इसके आकार को पुनः प्राप्त करने में सक्षम था।
कार्ल

6

एंड्रॉइड 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>

आप स्रोत कोड में उत्तर पा सकते हैं: चौखटे \ आधार \ कोर \ Res \ res \ मान \ dimens.xml


क्या हमारे XML में इस संसाधन को प्राप्त करने का कोई तरीका है? @android:dimen/status_bar_heightमेरे लिए काम नहीं करता है
पैट्रिक

4

इसे हल करने के लिए, मैंने एक संयोजन दृष्टिकोण का उपयोग किया। यह आवश्यक है क्योंकि टैबलेट पर सिस्टम बार पहले से ही पिक्सल को घटाता है जब डिस्प्ले.गेट () कहा जाता है। इसलिए मैं पहली बार जांचता हूं कि क्या एक सिस्टम बार मौजूद है, और फिर बेन क्लेटन दृष्टिकोण, जो फोन पर ठीक काम करता है।

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 के लिए धन्यवाद यह करने का सही तरीका है।

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

कृपया मुझे माफ़ करें यदि कोड 100% सही नहीं है, तो इसे Xamarin C # से परिवर्तित कर दिया है, लेकिन यह इसका एकमात्र तरीका है। Notches के साथ काम करता है, आदि।


2

टॉगल फ़ुलस्क्रीन समाधान:

यह समाधान एक वर्कअराउंड की तरह लग सकता है, लेकिन यह वास्तव में इस बात के लिए जिम्मेदार है कि क्या आपका ऐप फुलस्क्रीन है (उर्फ स्टेटस बार को छुपाना उर्फ) या:

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

इस तरह, यदि आपका ऐप वर्तमान में फुलस्क्रीन है, barheightतो 0 के बराबर होगा।

व्यक्तिगत रूप से मुझे इसका उपयोग पूर्ण बार टच टचवेंट के निर्देशांक को सही करने के लिए करना था ताकि स्टेटस बार के लिए खाता हो:

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

और इससे संपूर्ण वाई-कोऑर्डिनेट मिलेगा कि ऐप फुलस्क्रीन है या नहीं।

का आनंद लें


धन्यवाद, यह एकमात्र समाधान था जो मेरे लिए काम करता था जब एंड्रॉइड कीबोर्ड भी दिखा रहा है।
थियागो मूरा

2

एंड्रॉइड 4.1 और उच्चतर पर, आप अपने एप्लिकेशन के कंटेंट को स्टेटस बार के पीछे प्रदर्शित करने के लिए सेट कर सकते हैं, ताकि कंटेंट स्टेटस बार छुपाने और शो के रूप में रिसाइज न हो। ऐसा करने के लिए, SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN का उपयोग करें। अपने ऐप को एक स्थिर लेआउट बनाए रखने में मदद करने के लिए आपको SYSTEM_UI_FLAG_LAYOUT_STABLE का उपयोग करने की आवश्यकता हो सकती है।

जब आप इस दृष्टिकोण का उपयोग करते हैं, तो यह सुनिश्चित करना आपकी ज़िम्मेदारी बन जाता है कि आपके ऐप के UI के महत्वपूर्ण हिस्से (उदाहरण के लिए, मैप्स एप्लिकेशन में अंतर्निहित नियंत्रण) सिस्टम बार द्वारा कवर किए जा रहे हैं। यह आपके ऐप को अनुपयोगी बना सकता है। ज्यादातर मामलों में आप Android को जोड़कर इसे संभाल सकते हैं: आपकी XML लेआउट फ़ाइल में fitSystemWindows विशेषता, सच में सेट हो जाती है। यह सिस्टम विंडो के लिए स्पेस छोड़ने के लिए पैरेंट व्यूग्रुप की पैडिंग को समायोजित करता है। यह अधिकांश अनुप्रयोगों के लिए पर्याप्त है।

हालांकि, कुछ मामलों में, आपको अपने ऐप के लिए वांछित लेआउट प्राप्त करने के लिए डिफ़ॉल्ट पैडिंग को संशोधित करने की आवश्यकता हो सकती है। सीधे हेरफेर करने के लिए कि आपकी सामग्री सिस्टम बार (जो खिड़की के "सामग्री इनसेट" के रूप में जानी जाने वाली जगह पर कब्जा कर लेती है) के सापेक्ष कैसे लेट जाती है, फिटसिस्टवेयर विंडोज (रेक्ट इनसेट) को ओवरराइड करता है। FitSystemWindows () पद्धति को दृश्य पदानुक्रम द्वारा कहा जाता है जब खिड़की के लिए सामग्री के इन्सटेट बदल गए हैं, जिससे खिड़की को अपनी सामग्री को तदनुसार समायोजित करने की अनुमति मिलती है। इस पद्धति को ओवरराइड करके आप इनसेट्स (और इसलिए आपके ऐप का लेआउट) को संभाल सकते हैं।

फॉर्म: https://developer.android.com/training/system-ui/status.html#behind


1

यदि आप वास्तव में आकार वी.एस. ऊंचाई जानते हैं

पसंद

320 X 480 स्क्रीन आकार वाले डिवाइस में उदाहरण के लिए स्टेटस बार की ऊँचाई 25px है, 480 x 800 वाले डिवाइस के लिए स्टेटस बार की ऊँचाई 38px होनी चाहिए

तब आप केवल अपने विचार की चौड़ाई / स्क्रीन आकार प्राप्त कर सकते हैं, यदि आप स्टेटस बार की ऊंचाई प्राप्त करने के लिए एक और स्टेटमेंट का उपयोग कर सकते हैं


मेरे अनुभव में, ऊँचाई स्क्रीन के आकार के बजाय घनत्व पर आधारित प्रतीत होती है। बेशक, घनत्व स्वयं आमतौर पर स्क्रीन के आकार से संबंधित है, इसलिए एक अप्रत्यक्ष संबंध है। उदाहरण के लिए, मेरे पुराने Moto Droid में 480x854 (480x800 के बजाय) डिस्प्ले है, और स्टेटस बार भी उच्च पिक्सेल उच्च है।
कार्ल

उन्होंने इसके लिए dp का आविष्कार किया (घनत्व स्वतंत्र पिक्सेल)
Roel

1

कुछ लोगों के लिए शीर्ष जवाब काम नहीं करता है, इसका कारण यह है कि जब तक यह रेंडर करने के लिए तैयार नहीं हो जाता, तब तक आपको एक दृश्य के आयाम नहीं मिल सकते हैं। 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
@androiddeveloper OnGlobal! = GlobalOn
marijnz0r

@ marijnz0r कितना अजीब है। इससे क्या हुआ?
एंड्रॉयड डेवलपर

@androiddeveloper मुझे पता नहीं है, लेकिन मैं वही हुआ जो आपने कुछ दिन पहले किया था। देखें: stackoverflow.com/a/19216041/4587214
marijnz0r

@ marijnz0r तो दोनों एक ही करते हैं। अन्य मामलों की याद दिलाता है कि उन्होंने एक सामान के लिए एक नया नाम दिया जो पहले से मौजूद था, और पिछले एक को हटा दिया। उदाहरण "fill_parent" बनाम "match_parent": developer.android.com/reference/android/view/…
Android डेवलपर

1

चूंकि मल्टी-विंडो मोड अब उपलब्ध है, इसलिए आपके ऐप में शीर्ष पर स्थित स्थिति नहीं हो सकती है।

निम्नलिखित समाधान आपके लिए सभी मामलों को स्वचालित रूप से संभालते हैं।

android:fitsSystemWindows="true"

या प्रोग्रामिक रूप से

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

आप भी मूल दृश्य प्राप्त कर सकते हैं

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

रूट-व्यू संदर्भ प्राप्त करने के बारे में अधिक जानकारी के लिए - https://stackoverflow.com/a/4488149/9640177


0

यह मुद्दा हाल ही में मेरे पिक्सेल 3XL में पायदान के कारण मेरे लिए प्रासंगिक हो गया। मुझे एंड्रॉइड डेवलपर का समाधान वास्तव में पसंद आया , लेकिन मैं इच्छाशक्ति पर स्थिति बार ऊंचाई प्राप्त करने में सक्षम होना चाहता था, क्योंकि यह एक पूर्ण स्क्रीन एनीमेशन के लिए विशेष रूप से आवश्यक था जिसे मुझे खेलना चाहिए। नीचे दिए गए फ़ंक्शन ने एक विश्वसनीय क्वेरी सक्षम की:

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

आप निश्चित रूप से स्थिर हेल्पर वर्ग विधि पैरामीटर के लिए गतिविधि का एक कमजोर संदर्भ पारित करना चाहते हैं, लेकिन संक्षिप्तता के लिए मैं इस उदाहरण में refrained होगा। blurBitmapऔर errorHudFrameLayout, इसी कारण से छोड़े गए हैं, क्योंकि वे सीधे स्थिति पट्टी की ऊंचाई प्राप्त करने से संबंधित नहीं है।


यदि यह एंड्रॉइड पी और इसके बाद के संस्करण के लिए है, तो एंड्रॉइड एम के साथ क्यों जांचें? इसके अलावा, यदि आपके पास व्यू इंस्टेंस नहीं है तो आप क्या करेंगे? उदाहरण के लिए यदि आपके पास वर्तमान में कोई गतिविधि नहीं है ...
Android डेवलपर 10

M जल्द से जल्द है कि आप staticInsetTop की जांच कर सकता है, और भले ही केवल P समर्थित सूचनाएं हैं जो मुझे नहीं मिलेंगे क्योंकि मैं डिफ़ॉल्ट पर वापस गिरने के बजाय संभव था जहां मैं कर सकता था। यदि आपके पास कोई गतिविधि नहीं है तो यह समाधान काम नहीं करता है।
जेम्स जॉर्डन टेलर

समझा। धन्यवाद। क्या आप कृपया अधिक "पूर्ण" उदाहरण दिखा सकते हैं?
एंड्रॉइड डेवलपर

मैंने एक उदाहरण में विधि का उपयोग करने के लिए अपना उत्तर बदल दिया।
जेम्स जॉर्डन टेलर

0

कोटलिन संस्करण जो दो सर्वश्रेष्ठ समाधानों को जोड़ता है

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. status_bar_heightयदि मौजूद है तो मान लेता है
  2. यदि status_bar_heightमौजूद नहीं है, तो विंडो सजावट से स्थिति बार की ऊंचाई की गणना करता है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.