Aktywność na pełnym ekranie w Androidzie?

Odpowiedzi:

1050

Możesz to zrobić programowo:

public class ActivityName extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // remove title
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.main);
    }
}

Lub możesz to zrobić za pomocą swojego AndroidManifest.xmlpliku:

<activity android:name=".ActivityName"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen"/>

Edytować:

Jeśli używasz AppCompatActivity, musisz dodać nowy motyw

<style name="Theme.AppCompat.Light.NoActionBar.FullScreen" parent="@style/Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowContentOverlay">@null</item>
</style>

a następnie użyj go.

<activity android:name=".ActivityName"
    android:label="@string/app_name"
    android:theme="@style/Theme.AppCompat.Light.NoActionBar.FullScreen"/>

Dzięki https://stackoverflow.com/a/25365193/1646479

Cristian
źródło
65
tylko android: theme = "@ android: style / Theme.NoTitleBar.Fullscreen" atrybut twojej aktywności w manifeście jest wystarczający. Dzięki :)
Praveen
19
Jeśli Twoja aplikacja korzysta z innego motywu, użyj odpowiedniej nazwy motywu, np. Motyw Biały @android:style/Theme.Holo.Light.NoActionBar.Fullscreen
ankitjaininfo
5
Ustawienie motywu w manifestie powoduje czarny ekran przy uruchomieniu, lepiej zrobić to w kodzie.
aurelien_lepage
4
jeśli używasz ActionBar i po prostu nie chcesz TitleBar, usuń wiersz `requestWindowFeature () ', ponieważ spowoduje to NullPointer w innym przypadku
X.X_Mass_Developer
3
Jeśli używasz AppCompatActivity, musisz requestWindowFeaturewcześniej super.onCreate. W przeciwnym razie otrzymasz:android.util.AndroidRuntimeException: requestFeature() must be called before adding content
Slav
128

W KitKat dostępna jest technika o nazwie Immersive Full-Screen Mode . Wciągająca prezentacja trybu pełnoekranowego

Przykład

Dmide
źródło
5
Pamiętaj, że „bańka przypomnienia” zostanie wyświetlona przy pierwszym uruchomieniu aplikacji w trybie immersyjnym. Jest to przydatne w przypadku niektórych działań, ale nie na przykład w przypadku ekranu powitalnego.
LarsH,
pęka podczas używania błystek
ViVekH
chcę ukryć tylko dolny pasek nawigacji, a nie pasek stanu. Czy można to zrobić?
PvDev,
76

Jeśli nie chcesz używać motywu, @android:style/Theme.NoTitleBar.Fullscreenponieważ już używasz własnego motywu, możesz go użyć android:windowFullscreen.

W AndroidManifest.xml:

<activity
  android:name=".ui.activity.MyActivity"
  android:theme="@style/MyTheme">
</activity>

W styles.xml:

<style name="MyTheme"  parent="your parent theme">
  <item name="android:windowNoTitle">true</item>
  <item name="android:windowFullscreen">true</item> 
</style>
Ariel Cabib
źródło
dodaj rodzica jako motyw nadrzędny
Saurabh Bhandari
musisz również umieścić <item name = "windowActionBar"> false </item>
htafoya
52

W pliku AndroidManifest.xml :

<activity
    android:name=".Launch"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen" > <!-- This line is important -->

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>  

Lub w kodzie Java :

protected void onCreate(Bundle savedInstanceState){
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
nieskończone możliwości
źródło
2
musisz dodać kod, aby zrobić to programowo w JAVA
Dr. aNdRO
2
requestWindowFeature (Window.FEATURE_NO_TITLE); getWindow (). setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
iNFInite PosSibiLitiEs
chcę ukryć tylko dolny pasek nawigacji, a nie pasek stanu. Czy można to zrobić?
PvDev,
32

Jeśli używasz AppCompat i ActionBarActivity, użyj tego

getSupportActionBar().hide();

Bala Wisznu
źródło
Nie spowoduje to usunięcia paska stanu u góry
Manohar Reddy
24

Uważaj z

requestWindowFeature(Window.FEATURE_NO_TITLE);

Jeśli używasz dowolnej metody, aby ustawić pasek akcji w następujący sposób:

getSupportActionBar().setHomeButtonEnabled(true);

Spowoduje to wyjątek wskaźnika zerowego.

Jiahao
źródło
Powodem jest to, że dostosowujesz pasek akcji, który kod zmiany rozmiaru próbuje ukryć!
Andy
22

Wypróbuj to z appcompat z style.xml. Zapewnia obsługę wszystkich platform.

<!-- Application theme. -->
<style name="AppTheme.FullScreen" parent="AppTheme">
    <item name="android:windowFullscreen">true</item>
</style>


<!-- Application theme. -->
<style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar" />
Rohit Suthar
źródło
ładne i łatwe rozwiązanie. Dla początkujących dodaj ten motyw do znacznika aktywności lub aplikacji w AndroidManifest.xml: android: theme = "@ style / AppTheme.FullScreen"
Leos Literak
1
chcę ukryć tylko dolny pasek nawigacji, a nie pasek stanu. Czy można to zrobić?
PvDev,
13

Korzystanie z Android Studio (obecnie obecna wersja to 2.2.2) jest bardzo łatwe do dodania aktywności na pełnym ekranie.

Zobacz kroki:

  1. Kliknij prawym przyciskiem myszy główny pakiet Java> Wybierz „Nowy”> Wybierz „Aktywność”> Następnie kliknij „Aktywność na pełnym ekranie”.

Krok pierwszy

  1. Dostosuj działanie („Nazwa działania”, „Nazwa układu” itd.) I kliknij „Zakończ”.

Krok drugi

Gotowy!

Teraz masz łatwą aktywność na pełnym ekranie (zobacz klasę Java i układ aktywności, aby wiedzieć, jak to działa)!

Filipe Brito
źródło
8

Dla korzystających z AppCompact ... style.xml

 <style name="Xlogo" parent="Theme.AppCompat.DayNight.NoActionBar">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
</style>

Następnie wpisz nazwę w swoim manifeście ...

X-Black ...
źródło
7

Najpierw musisz ustawić motyw aplikacji za pomocą „NoActionBar”, jak poniżej

<!-- Application theme. -->
<style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar" />

Następnie dodaj te linie do aktywności na pełnym ekranie.

public class MainActiviy extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                                  WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.main);
    }
}

Ukryje pasek akcji / pasek narzędzi, a także pasek stanu w aktywności na pełnym ekranie

Rajesh Peram
źródło
7

AndroidManifest.xml

<activity ...
          android:theme="@style/FullScreenTheme"
    >
</activity>

I. Twoją główną aplikacją jest Theme.AppCompat.Light.DarkActionBar

Do ukrywania ActionBar / StatusBar
style.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    ...
</style>

<style name="FullScreenTheme" parent="AppTheme">
    <!--this property will help hide the ActionBar-->
    <item name="windowNoTitle">true</item>
    <!--currently, I don't know why we need this property since use windowNoTitle only already help hide actionbar. I use it because it is used inside Theme.AppCompat.Light.NoActionBar (you can check Theme.AppCompat.Light.NoActionBar code). I think there are some missing case that I don't know-->
    <item name="windowActionBar">false</item>
    <!--this property is used for hiding StatusBar-->
    <item name="android:windowFullscreen">true</item>
</style>

Aby ukryć pasek nawigacji systemu

public class MainActivity extends AppCompatActivity {

    protected void onCreate(Bundle savedInstanceState) {
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
        setContentView(R.layout.activity_main)
        ...
    }
 }

II. Twoim głównym motywem aplikacji jest Theme.AppCompat.Light.NoActionBar

Do ukrywania ActionBar / StatusBar
style.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    ...
</style>

<style name="FullScreenTheme" parent="AppTheme">
    <!--don't need any config for hide ActionBar because our apptheme is NoActionBar-->
    <!--this property is use for hide StatusBar-->
    <item name="android:windowFullscreen">true</item> // 
</style>

Aby ukryć pasek nawigacji systemu

Podobnie jakTheme.AppCompat.Light.DarkActionBar .

Próbny

Phan Van Linh
źródło
Dzięki. Testowane na Androidzie 5.0.1.
CoolMind,
@CoolMind spotkamy się ponownie. Dziękujemy za edycję
Phan Van Linh
6

dzięki za odpowiedź @Cristian dostałem błąd

android.util.AndroidRuntimeException: przed dodaniem treści należy wywołać requestFeature ()

rozwiązałem to za pomocą

@Override
protected void onCreate(Bundle savedInstanceState) {

    requestWindowFeature(Window.FEATURE_NO_TITLE);

    super.onCreate(savedInstanceState);

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

    setContentView(R.layout.activity_login);

    -----
    -----
}
Bikesh M
źródło
Czy powinniśmy ustawić requestWindowFeature(Window.FEATURE_NO_TITLE);wcześniej super.onCreate(savedInstanceState);?
CoolMind
4

pokaż pełny wciągający:

private void askForFullScreen()
    {
        getActivity().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 // hide nav bar
                        | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
                        | View.SYSTEM_UI_FLAG_IMMERSIVE);
    }

wyjść z trybu pełnego zanurzenia:

 private void moveOutOfFullScreen() {
        getActivity().getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    }
Gal Rom
źródło
3

Chciałem użyć własnego motywu zamiast @android: style / Theme.NoTitleBar.Fullscreen. Ale to nie działało, jak wspomniano tutaj w jednym z postów, więc poprawiłem go, aby to rozgryźć.

W AndroidManifest.xml:

<activity
    android:name=".ui.activity.MyActivity"
    android:theme="@style/MyTheme">
</activity>

W styles.xml:

<style name="MyTheme">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="android:windowFullscreen">true</item>
</style>

Uwaga: w moim przypadku musiałem użyć name="windowActionBar"zamiast, name="android:windowActionBar"zanim zadziałało poprawnie. Więc użyłem obu, aby upewnić się, że w razie potrzeby muszę później przenieść się na nową wersję Androida.

Szef kuchni faraon
źródło
3

Oto przykładowy kod. Możesz włączyć / wyłączyć flagi, aby ukryć / pokazać określone części.

wprowadź opis zdjęcia tutaj

public static void hideSystemUI(Activity activity) {
    View decorView = activity.getWindow().getDecorView();
    decorView.setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    //| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    //| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
                    | View.SYSTEM_UI_FLAG_IMMERSIVE);
}

Następnie resetujesz do stanu domyślnego :

wprowadź opis zdjęcia tutaj

public static void showSystemUI(Activity activity) {
    View decorView = activity.getWindow().getDecorView();
    decorView.setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}

Możesz wywołać powyższe funkcje z onCreate:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.course_activity);
    UiUtils.hideSystemUI(this);
}
nie zgadzam się
źródło
3

KOTLIN

Po dokumencie Google istnieje prosty sposób:

override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
if (hasFocus) hideSystemUI() }


private fun hideSystemUI() {
// 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
window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE
        // Set the content to appear under the system bars so that the
        // content doesn't resize when the system bars hide and show.
        or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
        or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        // Hide the nav bar and status bar
        or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
        or View.SYSTEM_UI_FLAG_FULLSCREEN)      }


// Shows the system bars by removing all the flags
// except for the ones that make the content appear under the system bars.
private fun showSystemUI() {
window.decorView.systemUiVisibility = 
(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
        or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)       }

Dokumenty Google

Álvaro Agüero
źródło
2

WSKAZÓWKA: Korzystanie z getWindow (). SetLayout () może zepsuć wyświetlanie na pełnym ekranie! Uwaga dokumentacja tej metody mówi:

Ustaw parametry układu szerokości i wysokości okna ... możesz zmienić je na ... wartość bezwzględną, aby okno nie było pełnoekranowe.

http://developer.android.com/reference/android/view/Window.html#setLayout%28int,%20int%29

Do moich celów stwierdziłem, że musiałem użyć setLayout z parametrami bezwzględnymi, aby poprawnie zmienić rozmiar okna pełnego ekranu. W większości przypadków działało to dobrze. Zostało wywołane przez zdarzenie onConfigurationChanged (). Wystąpił jednak czkawka. Jeśli użytkownik opuści aplikację, zmieni orientację i ponownie wejdzie, doprowadzi to do odpalenia mojego kodu, który zawiera setLayout (). Podczas tego okna czasu ponownego wejścia mój pasek stanu (który był ukryty przez manifest) zostałby ponownie wyświetlony, ale w żadnym innym przypadku setLayout () nie spowodowałby tego! Rozwiązaniem było dodanie dodatkowego wywołania setLayout () po tym z twardymi wartościami, takimi jak:

       public static void setSize( final int width, final int height ){
//DO SOME OTHER STUFF...
            instance_.getWindow().setLayout( width, height );
            // Prevent status bar re-appearance
            Handler delay = new Handler();
            delay.postDelayed( new Runnable(){ public void run() {
                instance_.getWindow().setLayout(
                    WindowManager.LayoutParams.FILL_PARENT,
                    WindowManager.LayoutParams.FILL_PARENT );
            }}, FILL_PARENT_ON_RESIZE_DELAY_MILLIS );
        }

Następnie okno zmieniło odpowiednio rozmiar, a pasek stanu nie pojawił się ponownie, niezależnie od zdarzenia, które je wywołało.

BuvinJ
źródło
2
 @Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    adjustFullScreen(newConfig);
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        adjustFullScreen(getResources().getConfiguration());
    }
}
private void adjustFullScreen(Configuration config) {
    final View decorView = getWindow().getDecorView();
    if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        decorView.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);
    } else {
        decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
    }
}
Tarun konda
źródło
2

Inside styles.xml ...

<!-- No action bar -->
<style name="NoActonBar" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Theme customization. -->
    <item name="colorPrimary">#000</item>
    <item name="colorPrimaryDark">#444</item>
    <item name="colorAccent">#999</item>
    <item name="android:windowFullscreen">true</item>
</style>

To zadziałało dla mnie. Mam nadzieję, że ci to pomoże.

Anuj Sain
źródło
2

Z kotlin tak właśnie zrobiłem:

class LoginActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)
        window.decorView.systemUiVisibility =
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
                View.SYSTEM_UI_FLAG_FULLSCREEN

    }
}

Tryb immersyjny

Tryb zanurzenia jest przeznaczony dla aplikacji, w których użytkownik będzie intensywnie wchodził w interakcje z ekranem. Przykładami są gry, przeglądanie obrazów w galerii lub czytanie stronicowanych treści, takich jak książka lub slajdy w prezentacji. W tym celu wystarczy dodać następujące linie:

View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

Lepkie zanurzenie

W zwykłym trybie immersyjnym za każdym razem, gdy użytkownik przesuwa się od krawędzi, system dba o odsłonięcie pasków systemowych - aplikacja nawet nie zdaje sobie sprawy z tego, że ten gest wystąpił. Jeśli więc użytkownik może rzeczywiście potrzebować przeciągnięcia palcem od krawędzi ekranu w ramach podstawowej aplikacji - na przykład podczas grania w grę wymagającą dużej liczby przeciągnięć lub korzystania z aplikacji do rysowania - należy zamiast tego włączyć tryb „lepki” .

View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY

Po więcej informacji: Włącz tryb pełnoekranowy

W przypadku korzystania z klawiatury czasami zdarza się, że pasek stanu pokazuje się, gdy pojawia się klawiatura. W takim przypadku zazwyczaj dodam to do mojego stylu xml

styles.xml

<style name="FullScreen" parent="AppTheme">
    <item name="android:windowFullscreen">true</item>
</style>

A także ta linia do mojego manifestu

<activity
        android:name=".ui.login.LoginActivity"
        android:label="@string/title_activity_login"
        android:theme="@style/FullScreen">
Jorge Casariego
źródło
Dzięki. Wymaga API 16 i 19.
CoolMind
2

Po prostu wklej ten kod do onCreate()metody

requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
Ahsan
źródło
1

To zadziałało dla mnie.

if (Build.VERSION.SDK_INT < 16) {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
    } else {
        View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
        decorView.setSystemUiVisibility(uiOptions);
    }
Singh
źródło
1
W innym przypadku byłoby lepiej użyć następującego polecenia: getWindow (). GetDecorView (). SetSystemUiVisibility (View.SYSTEM_UI_FLAG_FULLSCREEN);
Protonflux,
1
 protected void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.activity_splash_screen);
    getSupportActionBar().hide();

}
Sai Gopi N.
źródło
1

Po wielu latach bez powodzenia przyjechałem z własnym rozwiązaniem, które jest zupełnie inne w przypadku innego programisty. Więc jeśli ktoś jej potrzebuje, to właśnie tak. Moim problemem było to, że pasek nawigacji systemu nie ukrywał się po wywołaniu. Również w moim przypadku potrzebowałem krajobrazu, więc na wszelki wypadek skomentuj tę linię i to wszystko. Przede wszystkim stwórz styl

    <style name="FullscreenTheme" parent="AppTheme">
    <item name="android:actionBarStyle">@style/FullscreenActionBarStyle</item>
    <item name="android:windowActionBarOverlay">true</item>
    <item name="android:windowBackground">@null</item>
    <item name="metaButtonBarStyle">?android:attr/buttonBarStyle</item>
    <item name="metaButtonBarButtonStyle">?android:attr/buttonBarButtonStyle</item>
</style>

To jest mój plik manifestu

<activity
        android:name=".Splash"
        android:screenOrientation="landscape"
        android:configChanges="orientation|keyboard|keyboardHidden|screenLayout|screenSize"
        android:label="@string/app_name"
        android:theme="@style/SplashTheme">

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name=".MainActivity"
        android:configChanges="orientation|keyboard|keyboardHidden|screenLayout|screenSize"
        android:screenOrientation="landscape"
        android:label="@string/app_name"
        android:theme="@style/FullscreenTheme">
    </activity>

To jest moja aktywność spalsh

public class Splash extends Activity {
/** Duration of wait **/
private final int SPLASH_DISPLAY_LENGTH = 2000;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.splash_creen);

    /* New Handler to start the Menu-Activity
     * and close this Splash-Screen after some seconds.*/
    new Handler().postDelayed(new Runnable(){
        @Override
        public void run() {
            /* Create an Intent that will start the Menu-Activity. */
            Intent mainIntent = new Intent(Splash.this,MainActivity.class);
            Splash.this.startActivity(mainIntent);
            Splash.this.finish();
        }
    }, SPLASH_DISPLAY_LENGTH);
}

}

I to jest moja główna aktywność na pełnym ekranie. onSystemUiVisibilityChange Ta metoda jest ważna, w przeciwnym razie główny pasek nawigacji Androida po wywołaniu pozostanie i nie zniknie. Naprawdę irytujący problem, ale ta funkcja rozwiązuje ten problem.

klasa publiczna MainActivity rozszerza AppCompatActivity {

private View mContentView;
@Override
public void onResume(){
    super.onResume();

    mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
            | View.SYSTEM_UI_FLAG_FULLSCREEN
            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

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

    setContentView(R.layout.fullscreen2);
    ActionBar actionBar = getSupportActionBar();
    if (actionBar != null)
    {
        actionBar.hide();
    }
    mContentView = findViewById(R.id.fullscreen_content_text);
    mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
            | View.SYSTEM_UI_FLAG_FULLSCREEN
            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);



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

                    if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0)
                    {
                        mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
                                | View.SYSTEM_UI_FLAG_FULLSCREEN
                                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
                    }
                    else
                    {

                        mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
                                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

                        }
                }
            });

}

}

Oto mój układ ekranu powitalnego:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ImageView android:id="@+id/splashscreen" android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:background="@android:color/white"
        android:src="@drawable/splash"
        android:layout_gravity="center"/>
    <TextView android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Hello World, splash"/>
</LinearLayout>

This is my fullscreen layout
    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#0099cc"
        >
        <TextView
            android:id="@+id/fullscreen_content_text"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:keepScreenOn="true"
            android:text="@string/dummy_content2"
            android:textColor="#33b5e5"
            android:textSize="50sp"
            android:textStyle="bold" />

    </FrameLayout>

mam nadzieję, że to Ci pomoże

Jevgenij Kononov
źródło
1

https://developer.android.com/training/system-ui/immersive.html

Czynność :

@Override
public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        decorView.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);
    }
}

AndroidManifesty:

 <activity android:name=".LoginActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/title_activity_login"
            android:theme="@style/FullscreenTheme"
            ></activity>
Dheerendra Mitm
źródło
1

Utwórz puste działanie i dodaj dwa wiersze onCreate.

public class MainActivity extends AppCompatActivity {

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

        // full screen activity
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getSupportActionBar().hide();

        setContentView(R.layout.activity_main);
    }
    ...
}
wannik
źródło
1

Użyj tej metody po setContentView w onCreate () i przekaż obiekt Window przez getWindow () .

    public void makeActivityFullScreen(Window window){
    View decorView = window.getDecorView();
    //        int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
       window.getAttributes().layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
    }
    decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
            | View.SYSTEM_UI_FLAG_FULLSCREEN
            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
    );
}

Ten kod będzie działał również na ekranie wycięcia. Aby sprawdzić wycięcie na pełnym ekranie, potrzebujesz Androida P, ale jeśli masz telefon z wycięciem, przejdź do ustawienia -> Ustawienia wyświetlania -> współczynnik wyświetlania aplikacji ---> wybierz aplikację ---> będą dwie bezpieczne opcje wyświetlanie i pełny ekran, wybierz pełny ekran i uruchom aplikację, możesz zobaczyć pełny ekran w wycięciu również bez Androida Pie

Sługus
źródło
1

Aby uczynić aktywność na pełnym ekranie, wykonaj następujące czynności:

    // add following lines before setContentView
    // to hide toolbar
                if(getSupportActionBar()!=null)
                    getSupportActionBar().hide();
    //to hide status bar
                getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);

Spowoduje to ukrycie paska narzędzi i paska stanu.

Ale w niektórych przypadkach możesz chcieć wyświetlić pasek stanu z przezroczystym tłem, w takim przypadku wykonaj następujące czynności:

// add following lines before setContentView
// to hide toolbar
if(getSupportActionBar()!=null)
   getSupportActionBar().hide();
// to make status bar transparent
getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

Inne alternatywy do ukrywania paska narzędzi zamiast getSupportActionBar().hide():

  1. Usuń pasek narzędzi, zmieniając element nadrzędny motywu aplikacji:

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">

  1. Jeśli chcesz usunąć pasek narzędzi z tylko jednego działania, przejdź do manifestu, w polu tag działania dodaj to: android:theme="@style/Theme.AppCompat.Light.NoActionBar"

Dla miłośników kotlin skorzystać z funkcji rozszerzenia:

W pierwszym przypadku:

fun AppCompatActivity.makeItFullScreenStatusBarVisible(){
    supportActionBar?.hide()
    window.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
}

I zadzwoń wcześniej setContentView:

makeItFullScreenStatusBarVisible()

Po drugie:

fun AppCompatActivity.makeItFullScreenStatusBarHidden(){
    supportActionBar?.hide()
    window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN)
}

I nazwij to wcześniej setContentView:

makeItFullScreenStatusBarHidden()
Suraj Vaishnav
źródło
0

Na Androidzie 10 żaden nie działał dla mnie.

Ale ja działałem idealnie dobrze (pierwsza linia w utworzeniu):

    View decorView = getWindow().getDecorView();
    int uiOptions = View.SYSTEM_UI_FLAG_IMMERSIVE;
    decorView.setSystemUiVisibility(uiOptions);

    setContentView(....);

    if (getSupportActionBar() != null) {
        getSupportActionBar().hide();
    }

cieszyć się :)

Arnaud
źródło
0

Aby wyświetlić zawartość przez wycięcie lub obszar wycięcia. Może to pomóc w dokumentach:

LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES - Treść jest renderowana w obszarze wycinania zarówno w trybie pionowym, jak i poziomym.

Kluczową rzeczą dla mnie była ta linia w stylu aktywności:

// Important to draw through the cutouts
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item> 

Dla mnie chciałem pokazać obraz w trybie immersyjnym. Po kliknięciu chcę wyświetlić interfejs użytkownika systemu (paski stanu i nawigacji).

Oto moje rozwiązanie:

1- W ćwiczeniu niektóre metody pokazywania / ukrywania interfejsu użytkownika systemu (paski stanu / nawigacji)

private fun hideSystemUI() {
    sysUIHidden = true
    window.decorView.systemUiVisibility = (
            View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
            or View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
            // Hide the nav bar and status bar
            or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // Hide nav bar
            or View.SYSTEM_UI_FLAG_FULLSCREEN // Hide status bar
            )
}


private fun showSystemUI() {
    sysUIHidden = false
    window.decorView.systemUiVisibility = (
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            // Set the content to appear under the system bars so that the
            // content doesn't resize when the system bars hide and show.
            or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION // layout Behind nav bar
            or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN // layout Behind status bar
            )
}

2- Upewnij się, że jest to w widoku głównym twojego układu xml

android:fitsSystemWindows="false"

3- Styl dla pełnego ekranu Aktywność zapewni paski stanu / nawigacji półprzezroczyste tło, gdy się pojawią:

<style name="FullscreenTheme" parent="AppTheme">
    <item name="android:actionBarStyle">@style/FullscreenActionBarStyle</item>
    <item name="android:windowActionBarOverlay">true</item>
    <item name="android:windowBackground">@null</item>
    <item name="metaButtonBarStyle">?android:attr/buttonBarStyle</item>
    <item name="metaButtonBarButtonStyle">?android:attr/buttonBarButtonStyle</item>
    <item name="android:statusBarColor">#50000000</item>
    <item name="android:navigationBarColor">#50000000</item>
    // Important to draw behind cutouts
    <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item> 
</style>

<style name="FullscreenActionBarStyle" parent="Widget.AppCompat.ActionBar">
    <item name="android:background">@color/sysTransparent</item>
</style>
Badr
źródło