Widok pełnoekranowy, animacje przejść, przekazywanie danych
Tryb pełnoekranowy w Androidzie
1. Czym jest tryb pełnoekranowy?- Aplikacja zajmuje cały ekran urządzenia.
- Ukryte są elementy systemowe takie jak:
- Opcjonalnie ukrywa się także ActionBar (górny pasek aplikacji).
status bar ? pasek u góry ekranu (godzina, bateria, powiadomienia),
navigation bar ? pasek na dole ekranu (przyciski ?wstecz?, ?home?, ?ostatnie aplikacje? lub gesty).
- gry mobilne (maksymalne wykorzystanie ekranu),
- odtwarzacze filmów i zdjęć,
- czytniki e-booków, prezentacje,
- aplikacje VR/AR i interaktywne wizualizacje.
- Fullscreen zwykły ? jednorazowe ukrycie status bara,
- Immersive mode ? rozszerzona wersja: status i navigation bar są ukryte, a użytkownik może je tymczasowo przywołać gestem (przesunięcie od krawędzi). Po chwili znów znikają.
- Immersive sticky ?paski pojawiają się tylko na moment i same się chowają. To standard w grach i filmach.
- wejście w fullscreen: insetsController.hide(WindowInsetsCompat.Type.systemBars())
- wyjście: insetsController.show(WindowInsetsCompat.Type.systemBars())
- dobre praktyki:
przy powrocie do aplikacji (np. po zminimalizowaniu) ponownie ustawiać fullscreen,
używać WindowInsetsControllerCompat (AndroidX) ? działa też na starszych wersjach Androida.
- w trybie normalnym użytkownik widzi zawsze zegar i przyciski systemowe,
- w fullscreen/immersive aplikacja wygląda bardziej jak gra/film i pozwala skupić się tylko na treści.
- nie wszystkie aplikacje powinny chować paski systemowe ? w aplikacjach użytkowych (np. bankowość, komunikatory) paski systemowe dają szybki dostęp do powiadomień i przycisków nawigacyjnych.
- pełny ekran jest zarezerwowany raczej dla multimediów i gier.
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
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.

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

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.

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

W widoku umieszczamy dwie kontrolki typu TextView i Button

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.

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

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

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.

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()
}
}