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.

Peter Druska
Aug 8, 2017 · 6 min read

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.

Obrázok 1. Vľavo: priestor na písanie správy a odoslanie. Vpravo: tu zobrazíme napísanú a odoslanú správu.

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.

Obrázok 2. Vytvorenie nového XML súboru.

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ť.

Obrázok 2. Pomenovanie nového súboru s definovaním rozhrania.

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.

Obrázok 3. Element TextEdit má ID message.

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

Obrázok 4. Element Button má ID openDetail.

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.

Obrázok 5. Element TextView má ID textView.

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.

Obrázok 6. Nový súbor typu Java Class.

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.

Obrázok 7. Pomenovanie novej triedy (nového súboru)

Nová trieda vo vnútri súboru vyzerá takto pre Javu:

public class DisplayMessageActivity extends AppCompatActivity {

}

Pre jazyk Kotlin takto:

class DisplayMessageActivity : AppCompatActivity() {
}

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.

  1. 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.
  2. Takto nastavíš titulok danej obrazovky.
  3. Inicializujeme intent (z ang. účel), ktorý vyvolal túto aktivitu a získame z neho podľa kľúča KEY z hlavnej aktivity danú správu.
  4. Nájdeme element s ID–čkom textView, do ktorého následne správu message vloží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.

Video 1. Ukážka otvárania nového okna s odoslanou správou.

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.

Peter Druska

Written by

Učiteľ programátor. #eduScrum

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade