Widok pełnoekranowy, animacje przejść, przekazywanie danych

Tryb pełnoekranowy w Androidzie

1. Czym jest tryb pełnoekranowy? 2. Po co stosuje się tryb pełnoekranowy? 3. Rodzaje pełnego ekranu 4. Sterowanie trybem 5. Różnice w odbiorze użytkownika 6. Uwaga praktyczna

Główny widok aplikacji

Pracę przy głównym widoku rozpoczniemy od przygotowania tła dla półprzezroczystego paska na dole ekranu. Tworzymy nowy zasób w res/ drawable/ panel_tlo.xml, który stanie się tłem dla wysuwającego się panelu Android Studio widok pełnoekranowy layout aplikacji

Będzie prostokątny kształt z zaokrąglonymi rogami wypełniony tłem gradientowym

Wskazówka:


<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="16dp" />
    <gradient
        android:startColor="#A32196F3"
        android:endColor="#6321CBF3"
        android:angle="270"/>
</shape>

Dodatkowo do tego samego folderu kopiujemy dowolną grafikę, która będzie przykładowym tłem w głównym widoku aplikacji.

Android Studio widok pełnoekranowy layout aplikacji

Układ głównego widoku składa się z kontrolek typu ImageView, LinearLayout (vertical), EditText, LinearLayout (horizonatal), i trzech przycisków Button.

Android Studio widok pełnoekranowy layout aplikacji

Parametry proponowanego układu przedstawia poniższy plik activity_main.xml

Wskazówka:


<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- Tło pełnoekranowe -->
    <ImageView
        android:id="@+id/imgObraz"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:contentDescription="Tlo"
        android:scaleType="centerCrop"
        android:src="@drawable/img_tla"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.0" />
    <!-- Dolny panel: prosty LinearLayout -->
    <LinearLayout
        android:id="@+id/LinearLayoutPanel"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/panel_tlo"
        android:orientation="vertical"
        android:paddingLeft="16dp"
        android:paddingTop="12dp"
        android:paddingRight="16dp"
        android:paddingBottom="12dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent">

        <EditText
            android:id="@+id/editWiadomosc"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:hint="Wiadomość"
            android:imeOptions="actionSend"
            android:singleLine="true" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="end"
            android:orientation="horizontal"
            android:paddingTop="8dp">

            <Button
                android:id="@+id/btWyslij"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Wyślij" />

            <Button
                android:id="@+id/btAnimacja"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="8dp"
                android:text="Animacja przejścia" />
        </LinearLayout>
    </LinearLayout>

    <!-- Przycisk  -->
    <Button
        android:id="@+id/btPelnyEkran"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:layout_marginStart="32dp"
        android:layout_marginEnd="32dp"
        android:layout_marginBottom="28dp"
        android:text="Pełny ekran"
        app:layout_constraintBottom_toTopOf="@+id/LinearLayoutPanel"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Ukrywanie pasków systemowych aplikacji

Do kontroli ukrywania pasków wykorzystuje się klasę WindowInsetsControllerCompat, która daje programiście kontrolę nad paskami systemowymi Androida (status bar i navigation bar). Dzięki temu można je ukrywać (hide) lub pokazywać (show) w zależności od potrzeb.

W tej aplikacji klasę wykorzystamy do włączania i wyłączania trybu pełnoekranowego (immersive mode).

W kodzie programu musimy przewidzieć logiczną flagę (typ Boolean), w której zapamiętamy aktualny stan aplikacji ? czy jest teraz w trybie pełnoekranowym (true), czy nie (false).

Pozwala ona łatwo przełączać widok za pomocą przycisku Pełny ekran (toggleFullscreen()), bez konieczności każdorazowego sprawdzania stanu systemu.

Zmiany w metodzie onCreate() pozwolą zrezygnować ze standardowego zachowania się widoku aplikacji. Poniżej kod

Wskazówka:


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    WindowCompat.setDecorFitsSystemWindows(window, false)
    setContentView(R.layout.activity_main)
    //ukryj pasek akcji (ewentualny tytul, przyciski akcji, menu)
    supportActionBar?.hide()

    val glownyWidok = findViewById<View>(R.id.main)
    val Panel = findViewById<View>(R.id.LinearLayoutPanel)
    val btPelnyEkran = findViewById<Button>(R.id.btPelnyEkran)

    // Kontroler pasków systemowych (dla immersive sticky)
    kontrolerStanu = WindowCompat.getInsetsController(window, glownyWidok)!!
    kontrolerStanu.systemBarsBehavior =
        WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
    // Padding dolny dla panelu pod gesty/system bar
    ViewCompat.setOnApplyWindowInsetsListener(Panel) { v, insets ->
        val bars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
        v.setPadding(v.paddingLeft, v.paddingTop, v.paddingRight, bars.bottom)
        insets
    }
    

}

Na tę chwilę aplikacja po skompilowaniu niczym się nie różni od standardowego podejścia.

Procedura ukrycia/ wywołania pasków

Do projektu dodamy funkcje ukrycia i przywrócenia pasków. Do głównej klasy (MainActivity.kt) projektu dodamy poniższe funkcje (poza ciałem metody onCreate)

Wskazówka:


private fun wlaczPelnyEkran() {
    kontrolerStanu.hide(WindowInsetsCompat.Type.systemBars())
    fPelnyEkran = true
}

private fun wylaczPelnyEkran() {
    kontrolerStanu.show(WindowInsetsCompat.Type.systemBars())
    fPelnyEkran = false
}

private fun przelaczPelnyEkran() {
    if (fPelnyEkran) wylaczPelnyEkran() else wlaczPelnyEkran()
}

Aby sprawdzić czy działa włączenie pełnego ekranu wystarczy wstępnie wywołać funkcję wlaczPelnyEkran(). Dopisz tę funkcję na końcu metody onCreate()

Wskazówka:


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    
    
    ViewCompat.setOnApplyWindowInsetsListener(Panel) { v, insets ->
        val bars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
        v.setPadding(v.paddingLeft, v.paddingTop, v.paddingRight, bars.bottom)
        insets
    }
    
    wlaczPelnyEkran()

}

Skompiluj aplikację. W widoku emulatora aplikacja nie będzie posiadać pasków u góry i u dołu ekranu.

Android Studio widok pełnoekranowy ukrycie pasków menu

Dodamy obsługę przełączania widoku do słuchacza kliknięć przycisku id= btPelnyEkran

Wskazówka:


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    
    // Padding dolny dla panelu pod gesty/system bar
    ViewCompat.setOnApplyWindowInsetsListener(Panel) { v, insets ->
        val bars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
        v.setPadding(v.paddingLeft, v.paddingTop, v.paddingRight, bars.bottom)
        insets
    }
    wlaczPelnyEkran()
    val btPelnyEkran = findViewById<Button>(R.id.btPelnyEkran)
    btPelnyEkran.setOnClickListener { przelaczPelnyEkran() }
}

Po skompilowaniu projektu aplikacja będzie reagować na zmianę trybu widoku pełnoekranowego i standardowego.

Jeżeli chcemy aby aplikacja zachowała wybrany tryb, na przykład po wyjściu do innej aplikacji, tak aby użytkownik nie musiał włączać go ręcznie za każdym razem należy nadpisać metodę onWindowFocusChanged().Dodajemy poniższy kod

Wskazówka:


override fun onWindowFocusChanged(hasFocus: Boolean) {
    super.onWindowFocusChanged(hasFocus)
    if (hasFocus && fPelnyEkran) wlaczPelnyEkran()
}

Druga aktywność

Do projektu dodajemy drugą aktywność z osobnym widokiem. Aplikację wzbogacimy o przekazanie danych oraz animację przejścia. Do projektu dodajemy klasę o nazwie DrugaAktywnosc.kt z szablonem pustego widoku New/ Activity/ Empty Views Activity

Android Studio dodanie drugiej aktywności

W widoku umieszczamy dwie kontrolki typu TextView i Button

Android Studio dodanie drugiej aktywności

Proponowany układ parametrów

Wskazówka:


<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".DrugaAktywnosc">

    <TextView
        android:id="@+id/tvWiadomosc"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="32dp"
        android:layout_marginEnd="16dp"
        android:text="..."
        android:textSize="18sp"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btWroc"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Wróć"
        app:layout_constraintTop_toBottomOf="@id/tvWiadomosc"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginTop="24dp"/>

  </androidx.constraintlayout.widget.ConstraintLayout>

Sprawdź czy w manifeście pojawiły się poniższe linijki kodu (jeżeli nie, to dodaj)

Wskazówka:


<activity
    android:name=".DrugaAktywnosc"
    android:exported="false" />

Otwórz plik DrugaAktywnosc.kt i wprowadź obsługę odbioru przesłanych danych z pierwszej aktywności oraz powrót do pierwszej aktywności

Wskazówka:


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    enableEdgeToEdge()
    setContentView(R.layout.activity_druga_aktywnosc)
    supportActionBar?.hide()
    ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
        val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
        v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
        insets
    }
    val tvWiadomosc = findViewById<TextView>(R.id.tvWiadomosc)
    // Odbiór danych z MainActivity
    val tekst = intent.getStringExtra("MOJA_WIADOMOSC").orEmpty()
    tvWiadomosc.text = if (tekst.isNotBlank()) tekst else "Brak wiadomości"
    
    val btWroc = findViewById<Button>(R.id.btWroc)
    btWroc.setOnClickListener {
        finish()
    }        
}

Przejdź do pliku MainActivity.kt i zapisz funkcję wysłania wiadomości do drugiej aktywności oraz jej wywołanie

Wskazówka:


private fun uruchomDrugiWidok() {
    val et = findViewById<EditText>(R.id.editWiadomosc)
    val tekst = et.text?.toString().orEmpty()

    val intent = Intent(this, DrugaAktywnosc::class.java)
    intent.putExtra("MOJA_WIADOMOSC", tekst)
    startActivity(intent)

}

Uruchomienie w słuchaczu

Wskazówka:


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    
    
    
    wlaczPelnyEkran()
    val btPelnyEkran = findViewById<Button>(R.id.btPelnyEkran)
    btPelnyEkran.setOnClickListener { przelaczPelnyEkran() }

    val btWyslij = findViewById<Button>(R.id.btWyslij)
    btWyslij.setOnClickListener {
        uruchomDrugiWidok()
    }
}

Skompiluj program i sprawdź efekt działania. Widomość powinna zostać wysłana i odebrana ale nie zostanie zauważony tryb pełnoekranowy.

Android Studio dodanie drugiej aktywności

Zmiany jakie trzeba wprowadzić są analogiczne jak dla głównego widoku. Poniżej pełny kod pliku DrugaAktywnosc.kt

Wskazówka:


class DrugaAktywnosc : AppCompatActivity() {
    private lateinit var kontrolerStanu: WindowInsetsControllerCompat
    private var fPelnyEkran = true
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_druga_aktywnosc)
        supportActionBar?.hide()
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }

        val glownyWidok = findViewById<View>(R.id.main)
        kontrolerStanu = WindowCompat.getInsetsController(window, glownyWidok)!!
        kontrolerStanu.systemBarsBehavior =
            WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE

        wlaczPelnyEkran()
        val tvWiadomosc = findViewById<TextView>(R.id.tvWiadomosc)
        // Odbiór danych z MainActivity
        val tekst = intent.getStringExtra("MOJA_WIADOMOSC").orEmpty()
        tvWiadomosc.text = if (tekst.isNotBlank()) tekst else "Brak wiadomości"

        val btWroc = findViewById<Button>(R.id.btWroc)
        btWroc.setOnClickListener {
            finish()
        }
    }
    private fun wlaczPelnyEkran() {
        kontrolerStanu.hide(WindowInsetsCompat.Type.systemBars())
        fPelnyEkran = true
    }
    private fun wylaczPelnyEkran() {
        kontrolerStanu.show(WindowInsetsCompat.Type.systemBars())
        fPelnyEkran = false
    }
    private fun przelaczPelnyEkran() {
        if (fPelnyEkran) wylaczPelnyEkran() else wlaczPelnyEkran()
    }
    override fun onWindowFocusChanged(hasFocus: Boolean) {
        super.onWindowFocusChanged(hasFocus)
        if (hasFocus && fPelnyEkran) wlaczPelnyEkran()
    }

}

Teraz po skompilowaniu projektu druga aktywność przyjmuje ustawienia pełnoekranowe oraz ich zmianę.

Animacja przejść widoków

Do projektu dodamy animacje przejść pomiędzy widokami. Dla trzymania porządku w hierarchii projektu utworzymy folder, a w nim odpowiednie pliki XML przejść. W Android Studio pliki animacji tworzy się w specjalnym folderze: res/anim/. Kliknij prawym przyciskiem na folder: res/ New / Android Resource Directory

Android Studio dodanie animacji przejść

W utworzonym folderze tworzymy pliki zasobów animacji. Kliknij prawym na folder: anim/ New/ Animation Resource File

Android Studio dodanie animacji przejść

Na tej zasadzie utwórz cztery pliki dla animacji o poniższych nazwach i zawartościach:

slajd_w_lewo.xml

Wskazówka:


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0%" android:toXDelta="20%" android:duration="220"/>
    <alpha android:fromAlpha="1" android:toAlpha="0" android:duration="220"/>
</set>

slajd_w_prawo.xml

Wskazówka:


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="100%" android:toXDelta="0%" android:duration="280"/>
    <alpha android:fromAlpha="0" android:toAlpha="1" android:duration="280"/>
</set>

slajd_powrot_z_lewej.xml

Wskazówka:


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0%" android:toXDelta="-20%" android:duration="220"/>
    <alpha android:fromAlpha="1" android:toAlpha="0" android:duration="220"/>
</set>

slajd_powrot_z_prawej.xml

Wskazówka:


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0%" android:toXDelta="20%" android:duration="220"/>
    <alpha android:fromAlpha="1" android:toAlpha="0" android:duration="220"/>
</set>

Animacje wywoływane są w metodzie overridePendingTransition(). Metoda overridePendingTransition() sprawia, że przejście między ekranami w aplikacji nie jest suche, tylko płynne i atrakcyjne wizualnie. To my wybieramy animacje wejścia i wyjścia z katalogu res/anim/

Wywołanie animacji przejścia widoków wywołamy w klasie MainActivity.kt w poniższej funkcji

Wskazówka:


private fun uruchomDrugiWidok() {
    val et = findViewById<EditText>(R.id.editWiadomosc)
    val tekst = et.text?.toString().orEmpty()

    val intent = Intent(this, DrugaAktywnosc::class.java)
    intent.putExtra("MOJA_WIADOMOSC", tekst)
    startActivity(intent)
    // >>> animacja przejścia do przodu
    overridePendingTransition(R.anim.slajd_w_prawo, R.anim.slajd_powrot_z_lewej)
}

A w klasie DrugaAktywnosc.kt w słuchaczu kliknięcia w przycisk btWroc

Wskazówka:


btWroc.setOnClickListener {
    finish()
    // >>> animacja powrotu (odwrotna do wejścia)
    overridePendingTransition(R.anim.slajd_w_lewo, R.anim.slajd_powrot_z_prawej)
}

Skompiluj projekt i sprawdź efekt działania. Przejścia pomiędzy widokami będą płynne w formie przesuwania lewo/ prawo widoków.

Aby drugi widok automatycznie reagował na zmiany pełny ekran/ widoczne paski należy przesłać widomość w postaci flagi wyboru (prawda/ fałsz). Zmiany w klasie ManActivity.kt

Wskazówka:


private fun uruchomDrugiWidok() {
    val et = findViewById<EditText>(R.id.editWiadomosc)
    val tekst = et.text?.toString().orEmpty()

    val intent = Intent(this, DrugaAktywnosc::class.java)
    intent.putExtra("MOJA_WIADOMOSC", tekst)
    // <-- dodajemy flagę
    intent.putExtra("PELNY_EKRAN", fPelnyEkran) 
    startActivity(intent)
    // >>> animacja przejścia do przodu
    overridePendingTransition(R.anim.slajd_w_prawo, R.anim.slajd_powrot_z_lewej)
}

Zmiany w pliku DrugaAktywnosc.kt

Wskazówka:


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    setContentView(R.layout.activity_druga_aktywnosc)
    supportActionBar?.hide()
    ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
        val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
        v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
        insets
    }

    val glownyWidok = findViewById<View>(R.id.main)
    kontrolerStanu = WindowCompat.getInsetsController(window, glownyWidok)!!
    kontrolerStanu.systemBarsBehavior =
        WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE

    // ODBIÓR FLAGI ? decydujemy o trybie
    fPelnyEkran = intent.getBooleanExtra("PELNY_EKRAN", true)
    if (fPelnyEkran) wlaczPelnyEkran() else wylaczPelnyEkran()

    val tvWiadomosc = findViewById<TextView>(R.id.tvWiadomosc)
    // Odbiór danych z MainActivity
    val tekst = intent.getStringExtra("MOJA_WIADOMOSC").orEmpty()
    tvWiadomosc.text = if (tekst.isNotBlank()) tekst else "Brak wiadomości"

    val btWroc = findViewById<Button>(R.id.btWroc)
    btWroc.setOnClickListener {
        finish()
        // >>> animacja powrotu (odwrotna do wejścia)
        overridePendingTransition(R.anim.slajd_w_lewo, R.anim.slajd_powrot_z_prawej)
    }

Skompiluj program i sprawdź zachowanie aplikacji.

Android Studio dodanie animacji przejść

Pełny kod pliku MainActivity.kt

Wskazówka:


import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat

@Suppress("DEPRECATION")
class MainActivity : AppCompatActivity() {

    private lateinit var kontrolerStanu: WindowInsetsControllerCompat
    private var fPelnyEkran = true

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        WindowCompat.setDecorFitsSystemWindows(window, false)
        setContentView(R.layout.activity_main)
        //ukryj pasek akcji (ewentualny tytul, przyciski akcji, menu)
        supportActionBar?.hide()

        val glownyWidok = findViewById<View>(R.id.main)
        val Panel = findViewById<View>(R.id.LinearLayoutPanel)

        // Kontroler pasków systemowych (dla immersive sticky)
        kontrolerStanu = WindowCompat.getInsetsController(window, glownyWidok)!!
        kontrolerStanu.systemBarsBehavior =
            WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
        // Padding dolny dla panelu pod gesty/system bar
        ViewCompat.setOnApplyWindowInsetsListener(Panel) { v, insets ->
            val bars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(v.paddingLeft, v.paddingTop, v.paddingRight, bars.bottom)
            insets
        }
        wlaczPelnyEkran()
        val btPelnyEkran = findViewById<Button>(R.id.btPelnyEkran)
        btPelnyEkran.setOnClickListener { przelaczPelnyEkran() }

        val btWyslij = findViewById<Button>(R.id.btWyslij)
        btWyslij.setOnClickListener {
            uruchomDrugiWidok()
        }
    }
    private fun wlaczPelnyEkran() {
        kontrolerStanu.hide(WindowInsetsCompat.Type.systemBars())
        fPelnyEkran = true
    }

    private fun wylaczPelnyEkran() {
        kontrolerStanu.show(WindowInsetsCompat.Type.systemBars())
        fPelnyEkran = false
    }

    private fun przelaczPelnyEkran() {
        if (fPelnyEkran) wylaczPelnyEkran() else wlaczPelnyEkran()
    }

    private fun uruchomDrugiWidok() {
        val et = findViewById<EditText>(R.id.editWiadomosc)
        val tekst = et.text?.toString().orEmpty()

        val intent = Intent(this, DrugaAktywnosc::class.java)
        intent.putExtra("MOJA_WIADOMOSC", tekst)
        // <-- dodajemy flagę
        intent.putExtra("PELNY_EKRAN", fPelnyEkran)
        startActivity(intent)
        // >>> animacja przejścia do przodu
        overridePendingTransition(R.anim.slajd_w_prawo, R.anim.slajd_powrot_z_lewej)
    }
    override fun onWindowFocusChanged(hasFocus: Boolean) {
        super.onWindowFocusChanged(hasFocus)
        if (hasFocus && fPelnyEkran) wlaczPelnyEkran()
    }
}

Pełny kod pliku DrugaAktywnosc.kt

Wskazówka:


import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat

@Suppress("DEPRECATION")
class DrugaAktywnosc : AppCompatActivity() {
    private lateinit var kontrolerStanu: WindowInsetsControllerCompat
    private var fPelnyEkran = true
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_druga_aktywnosc)
        supportActionBar?.hide()
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }

        val glownyWidok = findViewById<View>(R.id.main)
        kontrolerStanu = WindowCompat.getInsetsController(window, glownyWidok)!!
        kontrolerStanu.systemBarsBehavior =
            WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE

        // ODBIÓR FLAGI ? decydujemy o trybie
        fPelnyEkran = intent.getBooleanExtra("PELNY_EKRAN", true)
        if (fPelnyEkran) wlaczPelnyEkran() else wylaczPelnyEkran()

        val tvWiadomosc = findViewById<TextView>(R.id.tvWiadomosc)
        // Odbiór danych z MainActivity
        val tekst = intent.getStringExtra("MOJA_WIADOMOSC").orEmpty()
        tvWiadomosc.text = if (tekst.isNotBlank()) tekst else "Brak wiadomości"

        val btWroc = findViewById<Button>(R.id.btWroc)
        btWroc.setOnClickListener {
            finish()
            // >>> animacja powrotu (odwrotna do wejścia)
            overridePendingTransition(R.anim.slajd_w_lewo, R.anim.slajd_powrot_z_prawej)
        }
    }
    private fun wlaczPelnyEkran() {
        kontrolerStanu.hide(WindowInsetsCompat.Type.systemBars())
        fPelnyEkran = true
    }
    private fun wylaczPelnyEkran() {
        kontrolerStanu.show(WindowInsetsCompat.Type.systemBars())
        fPelnyEkran = false
    }
    private fun przelaczPelnyEkran() {
        if (fPelnyEkran) wylaczPelnyEkran() else wlaczPelnyEkran()
    }
    override fun onWindowFocusChanged(hasFocus: Boolean) {
        super.onWindowFocusChanged(hasFocus)
        if (hasFocus && fPelnyEkran) wlaczPelnyEkran()
    }

}
Układ okresowy- kod qr
Układ okresowy

Układ okresowy pierwiastków- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
Alkomat- wirtualny test kod qr
Alkomat- wirtualny test

Alkomat- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
Światłomierz fotograficzny kod qr
Światłomierz fotograficzny

Światłomierz fotograficzny- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
Taklarz- olinowanie stałe kod qr
Olinowanie stałe- kalkulator średnic

Olinowanie stałe- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
przepis na gogfry

Przepis na gofry

zobacz
przepis na bitą śmietanę

Przepis na bitą śmietanę

zobacz