2012-11-29 27 views
37

मैं एक पूर्ण स्क्रीन ओवरले बनाने के लिए प्रसिद्ध TYPE_SYSTEM_OVERLAY विधि का उपयोग कर रहा हूं जो हमेशा अन्य विचारों के शीर्ष पर होता है।स्थिति बार दृश्यता का पता लगाएं/TYPE_SYSTEM_OVERLAY स्वचालित रूप से आकार बदल नहीं रहा

एक Moto Atrix2 API15 पर और 17 के माध्यम से API 10 से प्रत्येक AVD ओवरले दृश्य स्वचालित रूप से आकार बदलता है के लिए (खड़ी फैलता) जब स्थिति पट्टी दूसरे एप्लिकेशन द्वारा छिपा हुआ है। ओवरले सभी अन्य विचारों के "शीर्ष पर बने" प्रतीत होता है, जैसा कि मुझे लगता है कि इसे करना चाहिए। जब स्टेटस बार फिर से देखा जाता है, तो ओवरले स्वचालित रूप से इसके आकार को कम कर देता है (कम लंबवत पिक्सेल, मूल रूप से स्टेटस बार की ऊंचाई घटाकर)।

यह वांछित व्यवहार है और सोचने के लिए इस अपवाद या यह (मोटोरोला) कई अलग अलग emulators पर और साथ ही कम से कम एक उपकरण निर्माता काम कर रहा है, शायद अधिक की वजह से दोषपूर्ण व्यवहार नहीं है इच्छुक हूँ, लेकिन मैं डॉन , ओवरले स्वतः आकार बदलने नहीं करता है (अंतरिक्ष जहां स्थिति पट्टी एक बार भरने) जब स्थिति पट्टी दूसरे एप्लिकेशन द्वारा छिपा हुआ है एक Samsung GS2 (API15) & भी Kindle Fire (API10?) पर परीक्षण पर: 'टी addtl devices.

समस्या की पहुंच है (पूर्ण स्क्रीन ऐप के पीछे स्टेटस बार)। इन उपकरणों पर, दृश्य के बाद पहली बार मुझे दृश्य के लिए ऑनसाइंडेड ओवरराइड से कोई और घटना नहीं मिलती है।

params = new WindowManager.LayoutParams( 
    1, WindowManager.LayoutParams.MATCH_PARENT, 
    WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 
    |WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 
    PixelFormat.TRANSPARENT); 
wm.addView(sizeLayout, params); 

sizeLayout onSizeChanged ओवरराइड है:

यहाँ उचित कोड है।

मैंने लगभग हर windowmanagerlayoutparam के साथ खेला है, मैं SYSTEM_ALERT, FLAG_LAYOUT_IN_SCREEN इत्यादि सहित पा सकता हूं, मैं तब तक सो नहीं पाऊंगा जब तक कि मैं इसे समझ नहीं पाता!

संपादित 11/30/12: मैं @deviant से मिला: https://stackoverflow.com/a/9195733/1851478 जो मैं मूल रूप से क्या कर रहा है, लेकिन समस्या को स्वचालित रूप से system_overlay आकार बदलने नहीं कुछ उपकरणों के साथ रहता है। शायद मुझे एक बग उठाना चाहिए।

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

संपादित 12/12/12: तो मैं इस पर आगे कोई भी भाग्य नहीं पड़ा है, और मैं विचारों पर getLocalVisibleRect उपयोग करने का प्रयास किया था, लेकिन दुर्भाग्य से बाद से मेरे ऐप SystemUI का स्वामी नहीं है यह कर सकते हैं विचार पता नहीं है कि ओवरले के नीचे क्या है। मुझे लगता है कि कस्टम रोम के साथ मैं ऐसा कर सकता हूं, लेकिन मुझे रूट के बिना समाधान की आवश्यकता है।

मुझे लगता है कि बाजार में अन्य ऐप्स को ऊपर सूचीबद्ध गैर-काम करने वाले फ़ोनों पर स्टेटस बार का पता लगाने में एक ही समस्या है। उदाहरण: कूल टूल, ओमेगा स्टेटसबार & स्टेटस बार +। बाउंटी उठाया।

संपादित करें 12/19/12 चित्र जोड़े गए। ध्यान दें कि एक काम करने वाले डिवाइस पर भूरे रंग का क्षेत्र काला क्षेत्र (किसी भी ऐप जो वर्तमान में पूर्ण स्क्रीन है) को "कवर" करता है, काला क्षेत्र वास्तव में पूरी स्क्रीन को कवर करता है, मैं सिर्फ अपने ओवरले के रूप में ग्रे क्षेत्र दिखा रहा हूं, भले ही यह भी हो पूर्ण स्क्रीन (कार्यक्षेत्र/गैर-कार्य करने वाले डिवाइस के आधार पर स्थिति पट्टी की ऊंचाई या प्लस की ऊंचाई और चाहे वह दृश्य में है या नहीं)।

enter image description hereenter image description here

+0

क्या आप कृपया आवश्यक व्यवहार के स्क्रीन शॉट्स और आप क्या प्राप्त कर रहे हैं? –

+0

@ एनीस तस्वीरें जोड़ा गया। – logray

+0

क्या आपने पूर्ण स्क्रीन पर जाने की कोशिश की है? अपना दृश्य जोड़ने से पहले प्रयास करें: // पूर्ण स्क्रीन विंडोमैनेजर। LayoutParams attrs = mActivity.getWindow()। getAttributes(); attrs.flags | = WindowManager.LayoutParams.FLAG_FULLSCREEN; mActivity.getWindow()। SetAttributes (attrs); –

उत्तर

1

मैं इस संवाद खिड़कियों पर शीर्षक पट्टी जहां प्रणाली चला गया है के बजाय छिपा के लिए दृश्यता सेट छुपा के साथ एक ही मुद्दा हो सकता है लगता है। इससे संवाद विंडो गलत तरीके से केंद्रित हो जाती है।

इसके लिए, मैं इसे कैसे ठीक करता हूं। यह आपकी स्थिति के लिए काम कर सकता है लेकिन आपको स्टेटस बार पहचानकर्ता के नाम के लिए इसे समायोजित करने की आवश्यकता हो सकती है।

Window window = dialog.getWindow(); 
View view = window.getDecorView(); 
int topPanelId = getResources().getIdentifier("topPanel", "id", "android"); 
LinearLayout topPanel = (LinearLayout) view.findViewById(topPanelId); 
topPanel.setVisibility(View.GONE); 
+0

मुझे काफी यकीन है कि इसे रूट (और शायद एक कस्टम सिस्टमयूआई.एपीके) की आवश्यकता होगी, और मुझे इनमें से किसी के बिना समाधान की आवश्यकता है। दूसरी बात यह है कि मैं स्टेटस बार को छिपाने में वास्तव में दिलचस्पी नहीं लेता हूं, सिर्फ यह पता लगा रहा हूं कि यह दृश्यमान है या नहीं। मैं इसके साथ कुछ खेलूँगा, लेकिन मुझे उम्मीद नहीं है। – logray

+0

मुझे किसी ऐप की दृश्यता की दृश्यता की कोई सफलता नहीं मिली है, मेरे ऐप का स्वामित्व नहीं है ... कोशिश करने के लिए धन्यवाद। – logray

3

उम्मीद है कि मैं समझता हूं कि आप यहां क्या हैं लेकिन मेरे ऐप (टीम बैटरीबार) में मुझे एक ही समस्या थी। (कोई रूट न्यूनतम अनुमति नहीं)

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

मैं इसे साफ करने जा रहा था लेकिन यह काम करता था इसलिए मैंने नहीं किया: पी कोड एक वर्ष से अधिक पुराना है और जब से मैंने पहली बार एंड्रॉइड के लिए कोडिंग शुरू की थी तब से। विचार के लिए भोजन था। आशा करता हूँ की ये काम करेगा।

here is the code in a repo at my github सीधे मेरे ऐप से एक कॉपी पेस्ट के साथ मैं इसका उपयोग कैसे कर रहा हूं। यहां छोटे स्निपेट

wm.addView(sizeLayout, params);// add your view 

// then add the next one 
Screendetect mDetector; 
mDetector = new Screendetect(this); 
mDetector.setOnFullScreenListener(new OnFullScreenListener() { 
      @Override 
      public void fsChanged(boolean FS_Bool) { 
       // TODO rethink this to be better.... bit hacky... 
       if (FS_Bool) { 
        Log.d("battbardetect", "Statusbar hidden"); 
        FS_vissible(); // do what ever you need to 
       } else if (!FS_Bool) { 
        Log.d("battbardetect", "Statusbar Vissible"); 
        FS_hidden(); // do what ever you need to 
       } 
      } 
     }); 
wm.addView(mDetector, params); 
+0

मैं ऑनफुलस्क्रीन लिस्टनर का प्रयास करूंगा, लेकिन मूल रूप से आपका उत्तर सिर्फ वही काम कर रहा है जो मैंने पहले ही कोशिश की है, और जो मैंने दस्तावेज किया है वह सभी उपकरणों पर काम नहीं करता है। यह कुछ पर काम करता है, लेकिन दूसरों को नहीं (प्रतीत होता है बिना स्पष्टीकरण)। गैर-काम करने वाले उपकरणों पर आपकी विधि (और मेरा/deviants) ओवरले आकार का आकार बदलने का प्रतीत नहीं होता है, भले ही यह ऑनफुलस्क्रीन लिस्टर, ऑनग्लोबललाउट लिस्टनर का उपयोग कर रहा हो, या ओवरले लेआउट पर साइज चेंज पर ओवरराइड कर रहा हो। – logray

+0

मैंने आपके कोड को देखा और आप बस ओवरआउट पर ओवरराइड कर रहे हैं, जिसे मैंने पहले ही गैर-काम करने वाले उपकरणों पर सफलता के बिना प्रयास किया है।मेरे उदाहरण/प्रश्न में मैंने साइज चेंज पर ओवरराइड किया और बस एक दृश्य ओवरले लेआउट के भीतर बस देख सकने वाले प्रत्येक दृश्य विधि को ओवरराइड करने का प्रयास किया (जैसा कि आपने किया था उतना ही उतना ही)। – logray

+1

कोशिश करने के लिए ठीक है धन्यवाद। मैंने आपके कोड की कोशिश की, शब्द और एक ही समस्या के लिए बहुत अधिक शब्द, ऑनआउट केवल तभी बुलाया जाता है जब दृश्य पहले जोड़ा जाता है (या कॉन्फ़िगरेशन परिवर्तन पर), और तब तक जब तक सेवा (या दृश्य) नष्ट नहीं हो जाती है/हटाया जाता है और बनाया/जोड़ा जाता है फिर। और यहां तक ​​कि यदि मैं बार-बार दृश्य जोड़ता हूं और हटा देता हूं तब भी लंबवत आकार कभी नहीं बदलता जब तक कि मैं स्क्रीन ध्वज में लेआउट जोड़ता हूं। इसलिए मूल रूप से एक ही समस्या है, कम से कम एक सैमसंग जीएस 2 एपीआई 15 पर परीक्षण किया गया है। बीटीडब्ल्यू ऑनसिस्टमयूआईविज़िबिलिटी चेंज या तो काम नहीं करता है। मुझे इससे कोई घटना नहीं मिलती है: जीएस 2 डिवाइस भौतिक नेविगेशन कुंजी के साथ आईसीएस है। – logray