Aktivity, Intent, Fragment
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
}
}