Obraz zawierający tekst, Czcionka, Grafika

Opis wygenerowany automatycznie 

Kierunek Informatyka

 

Instrukcja do ćwiczeń laboratoryjnych nr:

10

Nazwa przedmiotu:
Programowanie aplikacji mobilnych

Temat: Cykl życia aktywności – zabezpieczanie danych formularza, okna dialogowe 

Tryb studiów: stacjonarne

Czas trwanie ćw.

2x45 min

Autor materiałów: dr Marcin Skuba

1. Treści programowe:

Cykl życia aktywności, wybrane funkcje aktywności, użycie funkcji onSaveInstanceState do zapisywania danych tymczasowych, okna dialogowe.

 

2. Cel zajęć:

Celem zajęć jest poznanie kolejności wykonywania podstawowych metod aktywności, wyrobienie umiejętności tworzenia i używania okien dialogowych oraz zabezpieczanie danych w formularzu przed utratą podczas obracania ekranu.

 

3. Materiały dydaktyczne

 

public class MainActivity extends AppCompatActivity {
   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
       
setContentView(R.layout.activity_main);
       
Log.i("Test", "OnCreate()");

 

        //Alternatywa dla void onDestroy ()

getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
    @Override
    public void handleOnBackPressed() {
        Log.i("Test", "OnBackPressed()");
        finish();
    }
});

    }

   
@Override
   
protected void onStart() {
       
super.onStart();
       
Log.i("Test", "OnStart()");
   
}
   
@Override
   
protected void onResume() {
       
super.onResume();
       
Log.i("Test", "OnResume()");
   
}
   
@Override
   
protected void onPause() {
       
super.onPause();
       
Log.i("Test", "OnPause()");
   
}
   
@Override
   
protected void onStop() {
       
super.onStop();
       
Log.i("Test> ", "OnStop()");
   
}
       
@Override
       
protected void onDestroy () {
           
super.onDestroy();
           
Log.i("Test", "OnDestroy()");
   
}
   
@Override
   
public void onSaveInstanceState(Bundle savedInstanceState) {
       
Log.i("Test", "OnSaveInstanceState()");
        super.onSaveInstanceState(savedInstanceState);
   
}

   
@Override
   
public void onBackPressed() {
       
super.onBackPressed();
       
Log.i("Test", "OnBackPressed()");
   
}
}

 

 

a). Uruchomienie nowej aplikacji

 

Obraz zawierający Czcionka, tekst, zrzut ekranu, Grafika

Zawartość wygenerowana przez AI może być niepoprawna.

 

b) Użycie przycisku

 

 Obraz zawierający symbol, zrzut ekranu, design, smartfon

Zawartość wygenerowana przez AI może być niepoprawna.

 

Obraz zawierający tekst, Czcionka, zrzut ekranu, Grafika

Zawartość wygenerowana przez AI może być niepoprawna.

 

c). powrót

 

Obraz zawierający gadżet, Urządzenie elektroniczne, multimedia, Komunikator

Zawartość wygenerowana przez AI może być niepoprawna.

 

Obraz zawierający Czcionka, tekst, Grafika, typografia

Zawartość wygenerowana przez AI może być niepoprawna.

 

d) Użycie przycisku

 

Obraz zawierający symbol, smartfon, design

Zawartość wygenerowana przez AI może być niepoprawna.

 

Obraz zawierający tekst

Opis wygenerowany automatycznie

 

e). powrót

 

Obraz zawierający tekst, sprzęt elektroniczny, zrzut ekranu, wyświetlanie

Opis wygenerowany automatycznie

 

Obraz zawierający tekst, pomarańczowy, ciemny

Opis wygenerowany automatycznie

 

f) Użycie przycisku

 

Obraz zawierający symbol, smartfon, design

Zawartość wygenerowana przez AI może być niepoprawna.

 

Obraz zawierający Czcionka, tekst, zrzut ekranu, typografia

Zawartość wygenerowana przez AI może być niepoprawna.

 

g) Powrót

 

Obraz zawierający tekst, sprzęt elektroniczny, zrzut ekranu, wyświetlanie

Opis wygenerowany automatycznie

 

Obraz zawierający tekst

Opis wygenerowany automatycznie

 

h) Obrót

 

Obraz zawierający zrzut ekranu, multimedia, gadżet, Urządzenie elektroniczne

Zawartość wygenerowana przez AI może być niepoprawna.

 

Obraz zawierający tekst, Czcionka, zrzut ekranu, design

Zawartość wygenerowana przez AI może być niepoprawna.

 

Przykład aplikacji zapisującej dane z formularz poprzez metodę onSaveInstanceState():

 

Obraz zawierający zrzut ekranu, multimedia, oprogramowanie, gadżet

Zawartość wygenerowana przez AI może być niepoprawna.

 

Plik activity_main.xml

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
   
xmlns:tools="http://schemas.android.com/tools"
   
android:layout_width="match_parent"
   
android:layout_height="match_parent"
   
tools:context=".MainActivity"
   
android:orientation="vertical"
   
android:padding="20dp"
   
android:gravity="center">

    <TextView
       
android:id="@+id/textViewDaneZBazy"
       
android:layout_width="wrap_content"
       
android:layout_height="wrap_content"
       
android:layout_margin="20dp"
       
android:textSize="22dp"
       
android:text="Dane " />

    <EditText
       
android:id="@+id/editTextImie"
       
android:layout_width="match_parent"
       
android:layout_height="wrap_content"
       
android:inputType="text"
       
android:layout_margin="20dp"
       
android:text="Name" />

    <EditText
       
android:id="@+id/editTextWiek"
       
android:layout_width="match_parent"
       
android:layout_height="wrap_content"
       
android:inputType="number"
       
android:layout_margin="20dp"
       
android:text="Name" />

    <CheckBox
       
android:id="@+id/checkBox"
       
android:layout_width="match_parent"
       
android:layout_height="wrap_content"
       
android:text="Opcja do wyboru "/>

</LinearLayout>

 

Plik MainActivity.java

 

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.CheckBox;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {
   
EditText editTextImie;
   
EditText editTextWiek;
   
CheckBox checkBox;

   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
       
setContentView(R.layout.activity_main);

       
editTextImie = findViewById(R.id.editTextImie);
       
editTextWiek = findViewById(R.id.editTextWiek);
       
checkBox = findViewById(R.id.checkBox);

       
if (savedInstanceState != null) {
           
editTextImie.setText(savedInstanceState.getString("KEY_IMIE"));
           
editTextWiek.setText(savedInstanceState.getString("KEY_WIEK"));
           
checkBox.setChecked(savedInstanceState.getBoolean("KEY_OPCJA"));
       
}
    }

   
@Override
   
protected void onSaveInstanceState(@NonNull Bundle outState) {
       
super.onSaveInstanceState(outState);

       
outState.putString("KEY_IMIE", editTextImie.getText().toString());
       
outState.putString("KEY_WIEK", editTextWiek.getText().toString());
       
outState.putBoolean("KEY_OPCJA", checkBox.isChecked());
   
}
}

 

Metoda budująca okno dialogowe z możliwością udzielenia odpowiedzi TAK NIE

 

Obraz zawierający zrzut ekranu, tekst, multimedia, gadżet

Zawartość wygenerowana przez AI może być niepoprawna.

 

private void Dialog() {
   
AlertDialog.Builder builder = new AlertDialog.Builder(this);
       
builder.setTitle("Uwaga")
               .setMessage(
"Treść pytania....")
                .setIcon(
R.drawable.ic_baseline_beach_access_24)
            .setPositiveButton(
"TAK", new DialogInterface.OnClickListener() {
               
public void onClick(DialogInterface dialog, int id) {
                   

               
}
            })
            .setNegativeButton(
"NIE", new DialogInterface.OnClickListener() {
               
public void onClick(DialogInterface dialog, int id) {
                   

               
}
            }).show()
;
}

 

Przykład ukazujący deklarację przycisku w postaci przełącznika z zapisaniem stanu w czasie zmiany orientacji ekranu:

 

Obraz zawierający zrzut ekranu, Telefon komórkowy, gadżet, tekst

Zawartość wygenerowana przez AI może być niepoprawna.

 

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;

public class MainActivity extends AppCompatActivity {

   
final boolean  STOP = false;
   
final boolean  START = true;
   
boolean startStop=START;
   
ImageButton imageButton;

   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
       
setContentView(R.layout.activity_main);
       
Log.i("Test: ", "onCreate");

       
imageButton = findViewById(R.id.imageButton);
       
imageButton.setOnClickListener(new View.OnClickListener() {
           
@Override
           
public void onClick(View view) {
               
if(startStop==START){
                   
startStop=STOP;
               
}else if(startStop==STOP){
                   
startStop=START;
               
}
                setIconButton()
;
           
}
        })
;

       
if(savedInstanceState!=null){
           
startStop = savedInstanceState.getBoolean("KEY_BUTTON");
           
setIconButton();
       
}
    }
   
private void setIconButton(){
       
if(startStop==START){
           
imageButton.setBackgroundResource(R.drawable.on_ic_baseline_cast_24);
       
}else if(startStop==STOP){
           
imageButton.setBackgroundResource(R.drawable.off_ic_baseline_cast_connected_24);
       
}
    }

   
@Override
   
protected void onSaveInstanceState(@NonNull Bundle outState) {
       
super.onSaveInstanceState(outState);
       
outState.putBoolean("KEY_BUTTON", startStop);
   
}
}

 

4. Zadania

 

Zadanie 1.

Napisz program, w którym zdeklaruj pola tekstowe do wprowadzenia danych studenta: imię, nazwisko, rok studiów, email oraz pole pojedynczego wyboru do prowadzenia informacji czy student ma zaliczenie (true/false). Zabezpiecz formularz tak aby dane nie znikały podczas obracania ekranu. Używając przycisku systemowego „<” „wstecz” wyświetl pole dialogowe z pytanie „Czy chcesz wyłączyć program?” Jeśli zostanie użyty przycisk TAK program powinien się zakończyć.