Intent

Zámery zapúzdrujú požiadavky na systém a špecifikujú, čo má ktorá aktivita vykonať. Pomocou explicitného zámeru môžeme spustiť inú aktivitu:

Java:

Intent zamer = new Intent(getApplication(), Aktivita2.class);

Kotlin:

val zamer = Intent(applicationContext, Aktivita2::class.java)

                  alebo

Java:

Intent zamer = new Intent(MainActivity.this, Aktivita2.class);

Kotlin:

val zamer = Intent(this, Aktivita2::class.java)

Po vytvorení explicitného zámeru musíme vyžiadať spustenie aktivity. Aktivitu spustíme zavolaním metódy startActivity(), do parametra vložíme inštanciu nášho zámeru.

startActivity(zamer);

 

Príklad 1.

Aplikácia obsahuje dve aktivity. Prvá aktivita obsahuje widget TextView s textom „Prvá aktivita“ a tlačidlo, ktoré po stlačení vyvolá druhú aktivitu. Druhá aktivita obsahuje iba text „Druhá aktivita“.

Java kód triedy MainActivity:

 public class MainActivity extends AppCompatActivity {

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

        Button btnTlacidlo = findViewById(R.id.tlacidlo);
        btnTlacidlo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent zamer = new Intent(MainActivity.this,  
                               Aktivita2.class);
                zamer.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                startActivity(zamer);
            }
        });
    }
}

Kotlin:

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

val btnTlacidlo: Button = findViewById(R.id.tlacidlo)
btnTlacidlo.setOnClickListener { v: View ->
val zamer = Intent(this, Aktivita2::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
}
startActivity(zamer)
}
}
}

}

Za vytvorením explicitného zámeru, sme nastavili pomocou metódy addFlags() žiadnu animáciu prechodu medzi obrazovkami.

XML súbor activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="p_v.zamery.MainActivity">

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Prvá aktivita"
        android:layout_centerInParent="true"/>
    <Button
        android:id="@+id/tlacidlo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/text"
        android:layout_centerHorizontal="true"
        android:text="Ďalšia aktivita"
        />
</RelativeLayout>

 

Prenášanie údajov medzi aktivitami

Ak chceme poslať nejaké informácie z prvej aktivity do druhej aktivity, zavoláme na inštancií zámeru metódu putExtra(). Metóda obsahuje dva parametre typu String : prvý parameter tejto metódy je kľúč a druhý parameter je hodnota, ktorú chceme poslať.

Java:

zamer.putExtra("kluc", "text z obrazovky 1");

Kotlin:

val zamer = Intent(this, Aktivita2::class.java).apply {

addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)

putExtra("kluc", "text z obrazovky 1")

}

V druhej aktivite získame prenesenú hodnotu pomocou zavolania metódy getIntent(), ktorá vráti zámer, ktorý vyvolal aktivitu a metódy, ktorá vráti String hodnotu getStringExtra() s parametrom – hodnotou kľúču z predchádzajúcej aktivity.

Java:

String ulozenaHodnota = getIntent().getStringExtra("kluc");

Kotlin:

val ulozenaHodnota = intent.getStringExtra("kluc")

Alternatívou k získania hodnoty je vytvorenie inštancie triedy Bundle, ktorá slúži na prenášanie údajov medzi aktivitami.

Java:

String ulozenaHodnota;
Bundle extras = getIntent().getExtras();
if (extras != null) {
    ulozenaHodnota = extras.getString("kluc");
}

 Kotlin:

val extras = intent.extras

val ulozenaHodnota: String? = extras?.getString("kluc")

Príklad 2.

Keď upravíme druhú aktivitu predchádzajúcúceho príkladu – pod text „Druhá aktivita“ pridáme ďalší widget TextView, ktorému nastavíme inicializačnú hodnotu viditeľnosti na Invisible. Po stlačení tlačidla sa vyvolá druhá aktivita a prepošle sa jej text z prvej aktivity. V druhej aktivite sa načíta text z prvej aktivity do premennej ulozenaHodnota a zobrazí sa v druhom widgete TextView. Nesmieme zabudnúť zmeniť hodnotu viditeľnosti druhého widgetu na viditeľný.

Prvá aktivita

public class MainActivity extends AppCompatActivity {

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

        Button btnTlacidlo = findViewById(R.id.tlacidlo);
        btnTlacidlo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent zamer = new Intent(MainActivity.this, Aktivita2.class);
                zamer.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                zamer.putExtra("kluc", "text z obrazovky 1");
                startActivity(zamer);
            }
        });
    }
}

 Kotlin:

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

val btnTlacidlo: Button = findViewById(R.id.tlacidlo)
btnTlacidlo.setOnClickListener {
val zamer = Intent(this, Aktivita2::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
putExtra("kluc", "text z obrazovky 1")
}
startActivity(zamer)
}
}
}

Druhá aktivita

public class Aktivita2 extends AppCompatActivity {

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

        String ulozenaHodnota = getIntent().getStringExtra("kluc");

        TextView text = (TextView) findViewById(R.id.text2);
        text.setText(ulozenaHodnota);
        text.setVisibility(View.VISIBLE);
    }
}

Kotlin:

class Aktivita2 : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_aktivita2)

val ulozenaHodnota = intent.getStringExtra("kluc")

val text: TextView = findViewById(R.id.text2)
text.text = ulozenaHodnota
text.visibility = View.VISIBLE
}
}