एंड्रॉइड गतिविधि में स्थायी रूप से नेविगेशन बार कैसे छिपाएं?


81

मैं अपनी गतिविधि (पूरे सिस्टम यूआई नहीं) में स्थायी रूप से नेविगेशन बार छिपाना चाहता हूं। अब मैं कोड के इस टुकड़े का उपयोग कर रहा हूँ

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

यह बार को छुपाता है लेकिन जब उपयोगकर्ता स्क्रीन को फिर से दिखाता है तो उसे छूता है। गतिविधि तक इसे स्थायी रूप से छिपाने का कोई तरीका है onStop();



इस आधिकारिक Google / Android लिंक में बहुत सारे अच्छे और विशिष्ट विवरण दिए गए हैं: फुलस्क्रीन मोड सक्षम करें
क्रिस स्प्रैग

जब दस्तावेज़ के अनुसार उपयोगकर्ता ने स्क्रीन को छुआ तो ध्वज अपने आप साफ़ हो गया। आपको हर समय नेविगेशन बार को छिपाने के लिए अपने UI डिज़ाइन में परिवर्तन करना होगा।
user1154390

जवाबों:


118

स्निपेट:

फुलस्क्रीनफ्रेममेंट.जावा

HideNavigationBarComponent.java


यह एंड्रॉयड 4.4+ के लिए है

इमर्सिव मोड देखें https://developer.android.com/training/system-ui/immersive.html

फास्ट स्निपेट (एक गतिविधि वर्ग के लिए):

private int currentApiVersion;

@Override
@SuppressLint("NewApi")
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    currentApiVersion = android.os.Build.VERSION.SDK_INT;

    final int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_FULLSCREEN
        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;

    // This work only for android 4.4+
    if(currentApiVersion >= Build.VERSION_CODES.KITKAT)
    {

        getWindow().getDecorView().setSystemUiVisibility(flags);

        // Code below is to handle presses of Volume up or Volume down.
        // Without this, after pressing volume buttons, the navigation bar will
        // show up and won't hide
        final View decorView = getWindow().getDecorView();
        decorView
            .setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener()
            {

                @Override
                public void onSystemUiVisibilityChange(int visibility)
                {
                    if((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0)
                    {
                        decorView.setSystemUiVisibility(flags);
                    }
                }
            });
    }

}


@SuppressLint("NewApi")
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
    super.onWindowFocusChanged(hasFocus);
    if(currentApiVersion >= Build.VERSION_CODES.KITKAT && hasFocus)
    {
        getWindow().getDecorView().setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
    }
}

अगर आपको वॉल्यूम बढ़ाने या वॉल्यूम बढ़ाने पर समस्या आती है तो अपने नेविगेशन बार को दिखाएं। मैं में कोड जोड़ onCreateदेखने setOnSystemUiVisibilityChangeListener

यहाँ एक और संबंधित प्रश्न है:

वॉल्यूम प्रेस या न्यूनतम-पुनर्स्थापना के बाद इमर्सिव मोड नेविगेशन चिपचिपा हो जाता है


4
जब उपयोगकर्ता स्क्रीन के ऊपर / नीचे स्वाइप करता है, तो वह अर्ध-पारदर्शी नेविगेशन बार प्रदर्शित करेगा जो अस्थायी रूप से दिखाई देगा और फिर से छिपाएगा। क्या यह ऐसा करने के लिए सुरक्षित है?
खोजक

@KarthickRamu मुझे एक रास्ता मिल गया, जरा मेरे जवाब को नीचे
देखिए

1
@MuhammedRefaat आपके संकेत को एक निहित डिवाइस की आवश्यकता है :(
खोजक

1
@DawidDrozd धन्यवाद, लेकिन मुझे एक समस्या है, मेरी गतिविधि रूट लेआउट RelativeLayout है, और इसमें एक बच्चा दृश्य है जिसे Android सेट किया गया है: Layout_alignParentBottom = "true", नेविगेशन बार, लेकिन बच्चे का दृश्य निचले किनारे पर नहीं जाता है स्क्रीन के रूप में, अगर नेविगेशन बार अदृश्य नहीं गया है, तो क्या आप मदद कर सकते हैं?
जैक

1
यदि आप उस स्थान का उपयोग करना चाहते हैं जिस पर नेविगेशन बार ने कब्जा कर लिया है, तो आपको android:fitsSystemWindows="true"अपने विचारों से सभी घटनाओं को हटाना होगा । एंड्रॉइड स्टूडियो में कुछ लेआउट बनाते समय यह विशेषता शामिल होती है। देखें stackoverflow.com/a/42501330/650894
जो लैप

65

यह करो।

public void FullScreencall() {
    if(Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api
        View v = this.getWindow().getDecorView();
        v.setSystemUiVisibility(View.GONE);
    } else if(Build.VERSION.SDK_INT >= 19) {
        //for new api versions.
        View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
        decorView.setSystemUiVisibility(uiOptions);
    }
}

यह 100% काम करता है और आप निम्न एपीआई संस्करणों के लिए भी ऐसा कर सकते हैं, भले ही यह एक देर से जवाब हो मुझे आशा है कि यह किसी और की मदद करेगा।

यदि आप चाहते हैं कि यह स्थायी हो, तो बस FullscreenCall()अपने onResume()तरीके से कॉल करें ।


2
मैं डेवलपर. android.com/training/system-ui/immersive.html पर एक नज़र डालने की सलाह देता हूं , जो बताता है कि आपका तरीका केवल बार को छुपाता है जब तक कि बातचीत न हो और फिर से बातचीत पूरी होने के तुरंत बाद फिर से।
कार्ट

आपका बहुत - बहुत धन्यवाद! : D: +1
क्रिस्टोफर स्टॉक

7

सरल समाधान देखने वाले लोगों के लिए, मुझे लगता है कि आपके पास कोड की यह एक पंक्ति हो सकती है onStart()

  getWindow().getDecorView().setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|
            View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);

इसे इमर्सिव मोड कहा जाता है। आप अन्य संभावनाओं के लिए आधिकारिक दस्तावेज देख सकते हैं।


मैं गलत हो रहा हूँ (प्रतीक नहीं देख सकते हैं। View_YSTEM_UI_FLAG_IMMERSIVE_STICKY);) super.onStart (); } `` `
बिलाल यक़ुब

4

Android डेवलपर साइट के अनुसार

मुझे लगता है कि तुम नहीं कर सकते (जहाँ तक मुझे पता है) नेविगेशन पट्टी को स्थायी रूप से छिपाएँ ..

हालाँकि आप एक तरकीब कर सकते हैं। इसकी एक ट्रिक है आपको।

बस जब navigation barउपयोगकर्ता स्क्रीन को छूता है तब दिखाता है। तुरंत इसे फिर से छिपाएं। मजा आता है।

इसकी जाँच करें

void setNavVisibility(boolean visible) {
int newVis = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        | SYSTEM_UI_FLAG_LAYOUT_STABLE;
if (!visible) {
    newVis |= SYSTEM_UI_FLAG_LOW_PROFILE | SYSTEM_UI_FLAG_FULLSCREEN
            | SYSTEM_UI_FLAG_HIDE_NAVIGATION;
}

// If we are now visible, schedule a timer for us to go invisible.
if (visible) {
    Handler h = getHandler();
    if (h != null) {
        h.removeCallbacks(mNavHider);
        if (!mMenusOpen && !mPaused) {
            // If the menus are open or play is paused, we will not auto-hide.
            h.postDelayed(mNavHider, 1500);
        }
    }
}

// Set the new desired visibility.
setSystemUiVisibility(newVis);
mTitleView.setVisibility(visible ? VISIBLE : INVISIBLE);
mPlayButton.setVisibility(visible ? VISIBLE : INVISIBLE);
mSeekView.setVisibility(visible ? VISIBLE : INVISIBLE);
}

इस बारे में अधिक जानकारी के लिए इसे देखें ..

टैबलेट में सिस्टम बार छिपाएं


3

उपयोग:-

view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

एंड्रॉइड 4+ चलाने वाले टैबलेट में, सिस्टम / नेविगेशन बार को छिपाना संभव नहीं है।

से प्रलेखन :

SYSTEM_UI_FLAG_HIDE_NAVIGATION एक नया ध्वज है जो नेविगेशन बार को पूरी तरह से छिपाने का अनुरोध करता है। ज्ञात हो कि यह केवल कुछ हैंडसेट द्वारा उपयोग किए जाने वाले नेविगेशन बार के लिए काम करता है (यह टैबलेट्स पर सिस्टम बार को छिपाता नहीं है)।


2

यह मेरा समाधान है:

सबसे पहले, बूलियन को परिभाषित करें जो इंगित करता है कि नेविगेशन बार दिखाई दे रहा है या नहीं।

boolean navigationBarVisibility = true //because it's visible when activity is created

दूसरा तरीका है जो नेविगेशन बार को छिपाता है।

private void setNavigationBarVisibility(boolean visibility){
    if(visibility){
        View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN;
        decorView.setSystemUiVisibility(uiOptions);
        navigationBarVisibility = false;
    }

    else
        navigationBarVisibility = true;
}

डिफ़ॉल्ट रूप से, यदि आप नेविगेशन बार को छिपाने के बाद गतिविधि पर क्लिक करते हैं, तो नेविगेशन बार दिखाई देगा। इसलिए हमें यह मिल गया है कि अगर यह दिखाई देगा तो हम इसे छिपा देंगे।

अब OnClickListener को अपने विचार पर सेट करें। मैं अपने लिए एक सतह का उपयोग करता हूं:

    playerSurface.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            setNavigationBarVisibility(navigationBarVisibility);
        }
    });

गतिविधि शुरू होने पर हमें इस विधि को कॉल करना होगा। क्योंकि हम शुरुआत में इसे छिपाना चाहते हैं।

        setNavigationBarVisibility(navigationBarVisibility);

2

इसका सुरक्षा मुद्दा: https://stackoverflow.com/a/12605313/1303691

इसलिए यह संभव नहीं है कि दृश्य निर्माण की शुरुआत में एक एकल कॉल के साथ एक टैबलेट पर नेविगेशन को छिपाना संभव हो। यह छिपा हुआ होगा, लेकिन स्क्रीन को छूने पर यह पॉप अप हो जाएगा। तो आपकी स्क्रीन का दूसरा स्पर्श आपके लेआउट पर एक क्लिकक्लिक कर सकता है। इसलिए आपको इस कॉल को इंटरसेप्ट करने की आवश्यकता है, लेकिन मैंने इसे अभी तक प्रबंधित नहीं किया है, जब मुझे पता चला तो मैं अपने उत्तर को अपडेट करूंगा। या अब आप पहले से ही जवाब है?


1

मुझे लगता है कि झटका कोड आपकी मदद करेगा, और setContentView () से पहले उन कोड को जोड़ देगा

getWindow().setFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

SetContentView () getWindow ()। GetDecorView ()। SetSystemUiVisibility (View.SYSTEM_UI_FLAG_LOW_PROFILE) के पीछे उन कोड को जोड़ें;


1
फ़ील्ड के लिए एपीआई स्तर 21+
zackygaurav

1

अन्य उत्तर अधिकतर setSystemUiVisibility()विधि के लिए झंडे का उपयोग करते हैं View। हालाँकि, एंड्रॉइड 11 के बाद से इस एपीआई को हटा दिया गया है। अधिक जानकारी के लिए सिस्टम यूआई दृश्यता को संशोधित करने के बारे में मेरे लेख की जांच करें। लेख यह भी बताता है कि कटआउट को ठीक से कैसे संभालना है या दृश्यता परिवर्तनों को कैसे सुनना है।

यहां नई एपीआई के साथ सिस्टम बैक को दिखाने / छिपाने के लिए कोड स्निपेट हैं और साथ ही पिछड़े संगतता के लिए अपग्रेड किए गए हैं:

/**
 * Hides the system bars and makes the Activity "fullscreen". If this should be the default
 * state it should be called from [Activity.onWindowFocusChanged] if hasFocus is true.
 * It is also recommended to take care of cutout areas. The default behavior is that the app shows
 * in the cutout area in portrait mode if not in fullscreen mode. This can cause "jumping" if the
 * user swipes a system bar to show it. It is recommended to set [WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER],
 * call [showBelowCutout] from [Activity.onCreate]
 * (see [Android Developers article about cutouts](https://developer.android.com/guide/topics/display-cutout#never_render_content_in_the_display_cutout_area)).
 * @see showSystemUI
 * @see addSystemUIVisibilityListener
 */
fun Activity.hideSystemUI() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        window.insetsController?.let {
            // Default behavior is that if navigation bar is hidden, the system will "steal" touches
            // and show it again upon user's touch. We just want the user to be able to show the
            // navigation bar by swipe, touches are handled by custom code -> change system bar behavior.
            // Alternative to deprecated SYSTEM_UI_FLAG_IMMERSIVE.
            it.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
            // make navigation bar translucent (alternative to deprecated
            // WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
            // - do this already in hideSystemUI() so that the bar
            // is translucent if user swipes it up
            window.navigationBarColor = getColor(R.color.internal_black_semitransparent_light)
            // Finally, hide the system bars, alternative to View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
            // and SYSTEM_UI_FLAG_FULLSCREEN.
            it.hide(WindowInsets.Type.systemBars())
        }
    } else {
        // Enables regular immersive mode.
        // For "lean back" mode, remove SYSTEM_UI_FLAG_IMMERSIVE.
        // Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY
        @Suppress("DEPRECATION")
        window.decorView.systemUiVisibility = (
                // Do not let system steal touches for showing the navigation bar
                View.SYSTEM_UI_FLAG_IMMERSIVE
                        // Hide the nav bar and status bar
                        or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        or View.SYSTEM_UI_FLAG_FULLSCREEN
                        // Keep the app content behind the bars even if user swipes them up
                        or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
        // make navbar translucent - do this already in hideSystemUI() so that the bar
        // is translucent if user swipes it up
        @Suppress("DEPRECATION")
        window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
    }
}

/**
 * Shows the system bars and returns back from fullscreen.
 * @see hideSystemUI
 * @see addSystemUIVisibilityListener
 */
fun Activity.showSystemUI() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        // show app content in fullscreen, i. e. behind the bars when they are shown (alternative to
        // deprecated View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION and View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
        window.setDecorFitsSystemWindows(false)
        // finally, show the system bars
        window.insetsController?.show(WindowInsets.Type.systemBars())
    } else {
        // Shows the system bars by removing all the flags
        // except for the ones that make the content appear under the system bars.
        @Suppress("DEPRECATION")
        window.decorView.systemUiVisibility = (
                View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
    }
}

मैंने एमुलेटर पर BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE ध्वज के साथ आपके कोड की कोशिश की, लेकिन नेविगेशन बार पॉप जाएगा और स्क्रीन को छूने पर प्रदर्शित रहेगा। किसी भी विचार मैं एंड्रॉइड 11 पर STICKY कार्यक्षमता प्राप्त करने के लिए और क्या सेट करना चाहिए?
एंजेल कोह

यदि आप इसे छुपाना चाहते हैं तो @AngelKoh आपको HideSystemUI () को मैन्युअल रूप से कॉल करना होगा। मेरे उत्तर में वर्णित लेख की जांच करें, इसमें ये सभी विवरण हैं। स्टिकी मोड का मतलब है कि बार पारदर्शी होंगे यदि उपयोगकर्ता उन्हें स्वाइप करता है और ऐप को टच ईवेंट भी प्राप्त होंगे ( डेवलपर . android.com/training/system-ui/… देखें )।
मिलो Milernilovský

हाँ HideSystemUI () कहा जाता है और Ui पहली बार छिपा हुआ है। हालाँकि जब मैं स्क्रीन को बाद में छूता हूँ, तो नेविगेशन बार वापस बाहर आ जाता है और प्रदर्शित होता रहता है।
एंजेल कोह

BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE का उद्देश्य सिस्टम को छूने और बार प्रदर्शित करने से रोकना है। इसलिए मुझे यकीन नहीं है कि असली ऐप को देखे / डीबग किए बिना यह क्या कारण हो सकता है।
मिलो Milernilovský

0

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

View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
          | View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);

नहीं यह मुझे एक ही परिणाम दे रहा है
सुजीत मंझावन

0

मुझे लगता है कि यह कोड आपकी समस्या को हल कर देगा। इस कोड को अपने MainActivity.java पर कॉपी और पेस्ट करें

@Override
protected void onCreate(Bundle savedInstanceState) {                          
    super.onCreate(savedInstanceState);

    View decorView = getWindow().getDecorView();
    decorView.setOnSystemUiVisibilityChangeListener
    (new View.OnSystemUiVisibilityChangeListener() {
        @Override
        public void onSystemUiVisibilityChange(int visibility) {

            if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                hideNavigationBar();
            } 
        }
    });
}



private void hideNavigationBar() {
   getWindow().getDecorView().setSystemUiVisibility(
        View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|
        View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}

यह एंड्रॉइड -10 पर काम करेगा। मुझे उम्मीद है कि इससे मदद मिलेगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.