software - android system download




स्टेटसबार की ऊंचाई? (7)

अपने ऑनक्रेट विधि में अपने विचारों में से किसी एक को चलाने योग्य बनाएं, और उपरोक्त कोड को वहां रखें। यह एप्लिकेशन को स्क्रीन बार से जुड़े होने पर स्टेटस बार + टाइटलस्क्रीन ऊंचाई की गणना करने का कारण बनता है।

नीचे दिए गए कोड पर एक नज़र डालें:

myView.post(new Runnable() {

        @Override
        public void run() {
            Rect rectgle= new Rect();
            Window window= getWindow();
            window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
            int StatusBarHeight= rectgle.top;
            int contentViewTop= window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
            int TitleBarHeight= contentViewTop - StatusBarHeight;

        }

    });

यदि यह अभी भी चाल नहीं करता है, तो पोस्ट के बजाय दृश्य की पोस्टडेड विधि का आह्वान करने और दूसरे तर्क के रूप में मिलीसेकंड मान जोड़ने का प्रयास करें।

क्या स्टेटसबार + टाइटलबार की ऊंचाई प्राप्त करने का कोई तरीका है? देव मंच की जांच करना एक ही सवाल दिखाता है लेकिन कोई समाधान नहीं (जो मुझे मिल सकता है)।

मुझे पता है कि हम प्रारंभिक लेआउट पास के बाद इसे प्राप्त कर सकते हैं, लेकिन मैं इसे अपनी गतिविधि के क्रिएट () में प्राप्त करने के लिए देख रहा हूं।

धन्यवाद


आप here वर्णन करते हुए एंड्रॉइड की dimens.xml फ़ाइल में पाए गए स्टेटस बार का आयाम भी ले सकते हैं।

यह ड्राइंग के इंतजार की आवश्यकता के बिना स्टेटसबार की ऊंचाई प्राप्त कर सकता है।

ब्लॉग पोस्ट से कोड उद्धृत करना:

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

आपको इस विधि को ContextWrapper क्लास में रखना होगा।


एपीआई 23 के रूप में स्टेटस बार ऊंचाई प्राप्त करने के लिए एक बेहतर समाधान है। एपीआई 23 एक WindowInsets सुविधा जोड़ता है, ताकि आप इस मामले में सिस्टम WindowInsets का आकार प्राप्त कर सकें, इस मामले में शीर्ष पर।

public int getStatusBarHeight() {
    if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        return binding.mainContent.getRootWindowInsets().getStableInsetTop();
    }
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    if(resourceId != 0) {
        return getResources().getDimensionPixelSize(resourceId);
    }
    return 0;
}

ध्यान दें कि getRootWindowInsets() विंडो से दृश्य संलग्न होने के बाद तक शून्य वापस आ जाएगा, इसलिए इसे सीधे onCreate() पर उपयोग नहीं किया जा सकता है लेकिन आप विंडो संलग्नक के लिए श्रोता जोड़ सकते हैं और वहां कर सकते हैं - यहां मैं जोड़ रहा हूं स्टेटस बार को मेरे टूलबार के आकार में इन्सेट करें, जिसे मैं स्टेटस बार के साथ छुपाता हूं और दिखाता हूं। जब यह दिखाया गया है, तो मैं इसके शीर्ष पर स्टेटस बार चाहता हूं, इसलिए मैं टूलबार की शीर्ष पैडिंग में स्टेटस बार ऊंचाई जोड़ता हूं।

    binding.mainContent.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
        @Override
        public void onViewAttachedToWindow(View view) {
            binding.toolbar.setPadding(binding.toolbar.getPaddingLeft(),
                binding.toolbar.getPaddingTop() + getStatusBarHeight(),
                binding.toolbar.getPaddingRight(), binding.toolbar.getPaddingBottom());
            binding.mainContent.removeOnAttachStateChangeListener(this);
        }

        @Override
        public void onViewDetachedFromWindow(View view) {

        }
    });

जोर्गेसिस द्वारा पोस्ट किया गया समाधान बहुत अच्छा है, लेकिन यह क्रिएट () विधि के अंदर काम नहीं करता है। मुझे लगता है कि ऐसा इसलिए है क्योंकि स्टेटसबार और टाइटलबार ऑनक्रेट () के बाद बनाए जाते हैं।

समाधान आसान है - आपको root.post((Runnable action) ); का उपयोग कर कोड को (और चलने योग्य root.post((Runnable action) ); का उपयोग करके root.post((Runnable action) ); के अंदर कोड डालना चाहिए और इसे निष्पादित करना चाहिए root.post((Runnable action) );

तो पूरा समाधान:

root = (ViewGroup)findViewById(R.id.root);
root.post(new Runnable() { 
        public void run(){
            Rect rectgle= new Rect();
            Window window= getWindow();
            window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
            int StatusBarHeight= rectgle.top;
            int contentViewTop= 
                 window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
            int TitleBarHeight= contentViewTop - StatusBarHeight;

            Log.i("***  jakkubu :: ", "StatusBar Height= " + StatusBarHeight +
               " , TitleBar Height = " + TitleBarHeight);
        }
});

मुझे यह मिल गया


मैं अगले कोड का सुझाव दूंगा:

Rect rect = new Rect();
Window window = activity.getWindow();
if (window != null) {
  window.getDecorView().getWindowVisibleDisplayFrame(rect);
  android.view.View v = window.findViewById(Window.ID_ANDROID_CONTENT);

  android.view.Display display = ((android.view.WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();

  //return result title bar height
  return display.getHeight() - v.getBottom() + rect.top;   
}

दो उदाहरण:

1) डिवाइस 1 ब्रांड: सैमसंग, डिवाइस: मैगुरो, बोर्ड: टूना, cpu_abi: armeabi-v7a, डिस्प्ले: आईसीएल 53 एफ.एम 420KREL08, निर्माता: सैमसंग, मॉडल: गैलेक्सी नेक्सस, ver.release: 4.0.2, ver.sdk: 14 ;

स्क्रीन रेज़ोल्यूशन: 1280 x 720. इस डिवाइस पर कोई हार्डवेयर बटन नहीं है।

परिणाम:

rect: left=0 right=720 top=72 bottom=1208;
v: left=0 right=720 top=72 bottom=1208;
display: height=1208 width=720;
correct result=72;

डिवाइस 1 में स्क्रीन के शीर्ष पर शीर्षक पट्टी है और स्क्रीन के नीचे सॉफ़्टवेयर बटन के साथ स्टेटस बार है।

2) डिवाइस 2 डिवाइस: ब्रावो, बोर्ड: ब्रावो, cpu_abi: armeabi-v7a, प्रदर्शन: FRG83G, निर्माता: एचटीसी, मॉडल: एचटीसी डिजायर, ver.release: 2.2.2, ver.sdk: 8,

स्क्रीन रेज़ोल्यूशन: 800 x 400. इस डिवाइस में हार्डवेयर बटन हैं।

परिणाम:

rect: left=0 right=480 top=38 bottom=800;
v: left=0 right=480 top=0 bottom=800;
display: height=800 width=480;
correct result: phone_bar_height=38;

डिवाइस 2 में स्क्रीन के शीर्ष पर शीर्षक पट्टी है और इसमें स्टेटस बार नहीं है।

ऊपर दो समाधान सुझाए गए थे:

A) v.getTop() - rect.top 

( यह डिवाइस 1 के लिए गलत है - यह 72 के बजाय 0 देता है)

B) display.getHeight() - v.getHeight() 

( यह डिवाइस 2 के लिए गलत है - यह 38 के बजाय 0 देता है)

संस्करण:

 display.getHeight() - v.getBottom() + rect.top

दोनों मामलों में सही परिणाम देता है।

अद्यतन करें

3) एक और उदाहरण (तीसरा डिवाइस): ब्रांड: एलजीई, डिवाइस: v909, cpu_abi: armeabi-v7a, प्रदर्शन: एचएमजे 37, मॉडल: एलजी-वी 9 0 9, ver.release: 3.1, ver.sdk: 12

rect: left=0 right=1280 top=0 bottom=720
v: left=0 right=1280 top=0 bottom=720
Display: height=768 width=1280
phone_bar_height=48

डिवाइस 3 में क्षैतिज अभिविन्यास है, स्क्रीन के शीर्ष पर शीर्षक पट्टी नहीं है और स्क्रीन के नीचे स्थित स्टेटस बार है।

अच्छा यहाँ:

int size_of_title_bar = rect.top;
int size_of_status_bar = display.getHeight() - v.getBottom();

यह डिवाइस 2 और 3 के लिए सही है। मुझे डिवाइस 1 के बारे में निश्चित नहीं है। उपयोगकर्ता ने मुझे डिवाइस के स्क्रीनशॉट भेजा है। वहां सॉफ्टवेयर बटन के साथ स्टेटस बार है। लेकिन अभिव्यक्ति "display.getHeight () - v.getBottom ()" 0 देता है।


यद्यपि यह एक पुराना सवाल है, मैंने पाया कि उत्तर पर काम नहीं किया गया onCreate() :

मुझे यह कोड here से मिला here जो 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;
}

मुझे आशा है कि इससे इस मुद्दे पर चलने वाले किसी भी व्यक्ति की मदद मिलेगी।


Rect rectgle= new Rect();
Window window= getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
int StatusBarHeight= rectgle.top;
int contentViewTop= 
    window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
int TitleBarHeight= contentViewTop - StatusBarHeight;

   Log.i("*** Jorgesys :: ", "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;
} 




android