2012-06-14 11 views
10

मैं अपने एंड्रॉइड ऐप के लिए "रोशनी आउट" मोड स्थापित कर रहा हूं जब यह हालिया फोन और टैबलेट पर चल रहा है। मेरी ऑनक्रेट() विधि में, मैंने जोड़ा:रीस्टारेट्स पर "रोशनी-आउट" मोड (View.setSystemUiVisibility) को बनाए रखना

View rootView = getWindow().getDecorView(); 
rootView.setSystemUiVisibility(View.STATUS_BAR_HIDDEN); // aka View.SYSTEM_UI_FLAG_LOW_PROFILE 

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

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

कुछ ब्लॉग पोस्ट सुझाव देते हैं कि मैं सिस्टम UI दृश्यता परिवर्तनों को सुनने के लिए एक हैंडलर सेट कर सकता हूं और फिर दृश्यमान होने पर यूआई को फिर से छुपा सकता हूं। इस तरह:

rootView.setOnSystemUiVisibilityChangeListener(
    new View.OnSystemUiVisibilityChangeListener() { 
    @Override 
    public void onSystemUiVisibilityChange(int visibility) { 
     if (visibility == View.STATUS_BAR_VISIBLE) { 
     game.flagUIIsVisible(); 
     } 
    } 
    }); 

मेरे मामले में, game वस्तु पर विधि सिर्फ सेट एक ध्वज यूआई कह अदृश्य हो गया। बाद में, यदि मेरे ऐप के अंदर कोई स्पर्श ईवेंट है (उन्हें उसी game ऑब्जेक्ट द्वारा नियंत्रित किया जाता है), और यह ध्वज सेट है, तो मैं फिर से STATUS_BAR_HIDDEN कॉल का आह्वान करता हूं।

हालांकि, इन कॉलबैक के साथ यूआई पर कोई दृश्यता प्रभाव नहीं है। मैं देख सकता हूं कि कुछ लॉग संदेशों से दाएं हैंडलर को बुलाया जा रहा है, और मैं देख सकता हूं कि श्रोता को बुलाया जा रहा है।

मैंने अपने onResume पथ में STATUS_BAR_HIDDEN कॉल का आह्वान करने का भी प्रयास किया, लेकिन इससे कोई फर्क नहीं पड़ता।

मैं जानकारी की तलाश में हूं कि यह कुछ प्रकार की ज्ञात बग है, या गैलरी ऐप क्या कर रहा है इसके लिए संकेत (यह कुछ अलग तरीके से कर रहा है)। या कोशिश करने के लिए अन्य एपीआई के सुझाव (या अन्य विवरण जो प्रासंगिक हो सकते हैं)।

मैं libGDX का उपयोग कर रहा हूं, और मेरे ऐप में केवल एक दृश्य है, इसलिए यह बहुत आसान है। दृश्य libGDX द्वारा शीर्षक के बिना पूर्णस्क्रीन होने के लिए भी सेटअप है। मुझे अपने लक्ष्य में एसडीकेवर्सन 15 पर सेट किया गया है।

उत्तर

5

मुझे संदेह है कि एंड्रॉइड 3.2 में एक बग है, क्योंकि मैं onResume में इसे अक्षम करने से पहले स्टेटस बार को पुन: सक्षम करके फिर से शुरू करने से-लॉक-स्क्रीन समस्या के आसपास काम कर सकता हूं। नहीं OnSystemUiVisibilityChangeListener की आवश्यकता है।

विशेष रूप से, मेरे onResume रास्ते में मैं इस तरह कोड है: स्थिति पट्टी दृश्यमान बनाने के लिए

View rootView = getWindow().getDecorView(); 
rootView.setSystemUiVisibility(View.STATUS_BAR_VISIBLE); 
rootView.setSystemUiVisibility(View.STATUS_BAR_HIDDEN); 

प्रतीत होता है अनावश्यक कॉल, स्थिति पट्टी वास्तव में छिपा को अनलॉक करने के बाद काम करने के लिए बाद में कॉल करने के लिए लगता है उपकरण।

rootView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { 
    @Override 
    public void onSystemUiVisibilityChange(int visibility) { 
     if (visibility == View.SYSTEM_UI_FLAG_VISIBLE) { 
      rootView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); 
      rootView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); 
     } 
    } 
}); 

धन्यवाद पी.टी.:

1

यह मेरी समस्या तय!

+0

+1 के साथ, यह मेरा समस्या तय भी: डी – Houssni

2

Android 4.2 यहाँ, सैमसंग टैबलेट पर - अपने समाधान मेरे लिए काम नहीं किया, मैं वास्तव में ValuAnimator के साथ ऐसा करने में कामयाब रहे निकाल दिया बस onSystemUiVisibilityChange के बाद, onAnimationEnd श्रोता

 topView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { 
      @Override 
      public void onSystemUiVisibilityChange(int visibility) { 
      hideMenu(); 
      } 
     }); 

    private void hideMenu(){ 

    ValueAnimator hideAnim = ValueAnimator.ofInt(1,2); 
    hideAnim.setDuration(1); 
    hideAnim.addListener(new AnimatorListenerAdapter() { 
     @Override 
     public void onAnimationEnd(Animator animation) { 
      topView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); 
     } 
    }); 
    hideAnim.start(); 

} 
संबंधित मुद्दे