Android Studio — otváranie nového okna v appke
Tentoraz to bude o tom, ako urobiť appku, v ktorej sa po stlačení tlačidla otvorí nové okno.
Veľakrát sa stane, že po vykonaní istej akcie treba otvoriť nové okno, novú aktivitu. Teraz si to popíšeme pekne krok po kroku.
Vizuál bude zhruba takýto.


Budú to dve obrazovky pre dve aktivity. Tá vľavo na obrázku 1, na napísanie a odoslanie správy, bude definovaná v súbore activity_main.xml, tá druhá, vpravo, na zobrazenie správy, bude v súbore activity_display_message.xml.
Prvý súbor už máme, druhý musíme pridať.
Pridanie nového súboru XML
Je to jednoduché. Pravým tlačidlom klikni na /res/layout/ priečinok a vyber New > Layout resource file.

Následne sa otvorí nové okno, kde zadaj len meno súboru activity_display_message, všetko ostatné ponechaj na pokoji. Neskôr to budeš vedieť meniť a rozumieť tomu, teraz sa tým zbytočne zaoberať.

Potvrď OK. Nový XML súbor je vytvorený a pripravený na použitie.
Príprava obrazoviek
Dokopy budeš potrebovať 3 elementy. Ako prvý otvor súbor activity_main.xml. Do obrazovky potiahni jeden prvok EditText/PlainText, ktorému daj ID message. Viď obrázok 3.

Potom k nemu potiahni jeden prvok Button, ktorému daj ID openDetail. Viď obrázok 4.

Po pravde, tie ID–čká si daj, aké chceš. Aby si sa však teraz nestratil alebo nestratila, majme všetko rovnaké pre ľahšie dohľadanie prípadnej chyby.
Teraz otvor obrazovku definovanú v súbore activity_display_message.xml. Tam budeš potrebovať len jeden element typu TextView, ktorému daj ID textView. Viď obrázok 5.

To by sme mali.
Pridaj 20 dkg kódu
Nič extra to nebude, len základ na pochopenie pricípu. Ty už vieš, čo s tým ďalej. Ako prvý si vytvor cez pravý klik súbor s novou aktivitou nazvaný DisplayMessageActivity. Viď obrázok 6.

Pre jazyk Kotlin vyber typ súboru Kotlin File/Class.
Následne zapíš meno DisplayMessageActitivy a potvrď OK. Zvyšné veci zatiaľ nerieš. Viď obrázok 7.

Nová trieda vo vnútri súboru vyzerá takto pre Javu:
public class DisplayMessageActivity extends AppCompatActivity {
}Pre jazyk Kotlin takto:
class DisplayMessageActivity : AppCompatActivity() {
}Hlavná aktivita
Otvor teraz súbor MainActivity a pridaj dve premenné pre jazyk Java:
EditText editText;
String messageText;Pre jazyk Kotlin takto:
var editText: EditText? = null
var messageText: String = ""Do metódy onCreate() na jej koniec pridaj pre jazyk Java tento kus kódu:
Button button = (Button) findViewById(R.id.openDetail);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendMessage();
}
});editText = (EditText) findViewById(R.id.message);
Pre jazyk Kotlin takto:
val button = findViewById(R.id.openDetail) as Button
button.setOnClickListener { sendMessage() }editText = findViewById(R.id.message) as EditText
Na tlačidlo s ID–čkom openDetail pridané do obrazovky podľa obrázka 4 pridáme načúvač (ang. listener), ktorý načúva na kliknutie/ťapnutie. Keď sa tak stane, zavolá sa metóda sendMessage(), ktorá pre jazyk Java vyzerá takto:
public void sendMessage() {
Intent intent = new Intent(this, DisplayMessageActivity.class);
messageText = editText.getText().toString();
intent.putExtra("KEY", messageText);
startActivity(intent);
}Pre jazyk Kotlin takto:
fun sendMessage() {
val intent = Intent(this, DisplayMessageActivity::class.java)
messageText = editText!!.text.toString()
intent.putExtra("KEY", messageText)
startActivity(intent)
}V skratke ide o vytvorenie účelu (ang. intent) operácií, ktoré majú byť vykonané.
Intent — podľa oficiálneho zdroja sa jedná o účel operácií, ktoré sa majú v istej chvíli vykonať. Intent môže byť použitý na naštartovanie novej aktivity.
Tento popis bude vytvorený v aktuálnej inštancii this a bude narábať s inštanciou triedy DisplayMessageActivity. V elemente editText je správa, ktorú sme napísali. Získame ju postupným volaním metód getText() a toString(). To, čo získame, musíme premeniť na text, lebo tam môže byť aj číslo.
Potom do premennej messageText vložíme reťazec získaný z políčka na zadanie správy. Tento text vložíme do popisu a dáme mu kľúč KEY.
Nakoniec danú aktivitu naštartujeme volaním metódy startActivity(intent) so vstupným parametrom intent, ktorý danú aktivitu popisuje.
Keď appku spustíš a skúsiš, tak sa nové okno síce otvorí, ale ešte nič nezobrazí.
Celá hlavná aktivita v jazyku Java:
package become.sk.opendetail;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
EditText editText;
String messageText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("Pošli správu");
Button button = (Button) findViewById(R.id.openDetail);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendMessage();
}
});
editText = (EditText) findViewById(R.id.message);
}
public void sendMessage() {
Intent intent = new Intent(this, DisplayMessageActivity.class);
messageText = editText.getText().toString();
intent.putExtra("KEY", messageText);
startActivity(intent);
}
}V jazyku Kotlin:
package become.sk.opendetail
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.EditText
class MainActivity : AppCompatActivity() {
var editText: EditText? = null
var messageText: String = ""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "Pošli správu"
val button = findViewById(R.id.openDetail) as Button
button.setOnClickListener { sendMessage() }
editText = findViewById(R.id.message) as EditText
}
fun sendMessage() {
val intent = Intent(this, DisplayMessageActivity::class.java)
messageText = editText!!.text.toString()
intent.putExtra("KEY", messageText)
startActivity(intent)
}
}Aktivita na zobrazenie správy
Preto teraz otvor súbor DisplayMessageActivity.
Pre jayzk Java bude metóda onCreate() vyzerať takto:
@Override
protected void onCreate(Bundle savedInstanceState) {
// 1
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_message);
// 2
setTitle("Správa");
// 3
Intent intent = getIntent();
String message = intent.getStringExtra("KEY");
// 4
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(message);
}Pre jazyk Kotlin takto:
override fun onCreate(savedInstanceState: Bundle?) {
// 1
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_display_message)
// 2
title = "Správa"
// 3
val intent = intent
val message = intent.getStringExtra("KEY")
// 4
val textView = findViewById(R.id.textView) as TextView
textView.text = message
}Rozoberme si to.
- Základ metódy je volanie tejto metódy v rodičovskej triede a nastavenie layoutu/rozloženia podľa súboru
activity_display_message. - Takto nastavíš titulok danej obrazovky.
- Inicializujeme intent (z ang. účel), ktorý vyvolal túto aktivitu a získame z neho podľa kľúča
KEYz hlavnej aktivity danú správu. - Nájdeme element s ID–čkom
textView, do ktorého následne správumessagevložíme a tým ju zobrazíme.
Celá aktivita v jazyku Java:
package become.sk.opendetail;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class DisplayMessageActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_message);
setTitle("Správa");
Intent intent = getIntent();
String message = intent.getStringExtra("KEY");
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(message);
}
}V jazyku Kotlin:
package become.sk.opendetail
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
class DisplayMessageActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_display_message)
title = "Správa"
val intent = intent
val message = intent.getStringExtra("KEY")
val textView = findViewById(R.id.textView) as TextView
textView.text = message
}
}Manifest
Aby dané aktivity vôbec tušili, že sú si navzájom prepojené. Je nutné otvoriť súbor AndroidManifest.xml. Ten je v priečinku /app/manifests/.
Zatiaľ je tam jedna, hlavná aktivita:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>Za ňou daj ENTER a pridaj aktovitu na zobrazenie správy DisplayMessageActivity:
<activity android:name=".DisplayMessageActivity"
android:parentActivityName=".MainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
</activity>Tejto aktivite povieme, že jej rodičovskou aktivitou bude hlavná aktivita. Celý manifest by mal vyzerať podobne tomuto:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="become.sk.opendetail">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".DisplayMessageActivity"
android:parentActivityName=".MainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
</activity>
</application>
</manifest>Tak. Teraz spusti appku a všetko si skús. Viď video 1.
To je všetko.
—
Tento článok vznikol zo sponzorských darov OZ Harpúna a jeho použitie je úplne voľné na nekomerčné účely.
