Zadnja izmjena: 03.04.2018
Objekt Intent koristi se za prijenos podataka između dvije aktivnosti. Putem metode putExtra() možete dodati ključ i njegovu pridruženu vrijednost.
Na primjer, prosljeđivanje iz trenutne aktivnosti u SecondActivity niza "Hello World" s ključem "hello":
// kreiraj namjeru za pokretanje SecondActivity Intent intent = nova namjera(this, SecondActivity.class); // prosljeđivanje objekta s ključem "hello" i vrijednošću "Hello World" namjerom putExtra("hello", "Hello World"); // pokretanje SecondActivity startActivity(namjera);
Za prijenos podataka koristi se metoda putExtra() koja vam omogućuje prijenos podataka najjednostavnijih tipova - String, int, float, double, long, short, byte, char, nizova ovih tipova ili objekta Serializable. sučelje kao vrijednost.
Za dobivanje poslanih podataka kada se SecondActivity učita, možete koristiti metodu get(), kojoj se prosljeđuje ključ objekta:
Argumenti paketa = getIntent().getExtras(); Naziv niza = arguments.get("hello").toString(); // Pozdrav svijete
Ovisno o vrsti podataka koji se šalju, možemo koristiti brojne metode na objektu Bundle kada ga primimo. Svi oni uzimaju ključ objekta kao parametar. Glavni su:
get() : generička metoda koja vraća vrijednost tipa Object. U skladu s tim, polje primanja, ova vrijednost mora se pretvoriti u željenu vrstu
getString() : vraća objekt tipa String
getInt() : vraća int vrijednost
getByte() : vraća vrijednost bajta
getChar() : vraća vrijednost tipa char
getShort() : vraća vrijednost tipa short
getLong() : vraća dugu vrijednost
getFloat() : vraća vrijednost float
getDouble() : vraća dvostruku vrijednost
getBoolean() : vraća Booleovu vrijednost
getCharArray() : vraća niz char objekata
getIntArray() : vraća niz int objekata
getFloatArray() : vraća niz float objekata
getSerializable() : vraća objekt Serializable sučelja
Neka u našem projektu budu definirane dvije aktivnosti: MainActivity i SecondActivity.
U SecondActivity kodu definirajmo primanje podataka:
Paket com.example.eugene.serializeapp; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; javna klasa SecondActivity proširuje AppCompatActivity ( @Override protected void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); TextView textView = new TextView(this); textView.setTextSize(20); textView.setPadding(16, 16, 16, 16 ); Bundle arguments = getIntent().getExtras(); if(arguments!=null)( String name = arguments.get("name").toString(); String company = arguments.getString("company"); int cijena = arguments.getInt("cijena"); textView.setText("Naziv: " + naziv + "\nTvrtka: " + tvrtka + "\nCijena: " + cijena); ) setContentView(textView); ) )
U ovom slučaju, u SecondActivity dobivamo sve podatke iz Bundle objekta i prikazujemo ih u tekstualnom polju TextView. Pretpostavlja se da će ovoj aktivnosti biti proslijeđena tri elementa - dva niza s ključevima naziv i tvrtka te broj s ključem cijene.
Sada definirajmo prijenos podataka u SecondActivity. Na primjer, definirajmo sljedeće sučelje za MainActivity u datoteci activity_main.xml:
Ovdje su definirana tri tekstualna polja za unos podataka i gumb.
U klasi MainActivity definirajte sljedeći sadržaj:
Paket com.example.eugene.serializeapp; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; javna klasa MainActivity proširuje AppCompatActivity ( @Override protected void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ) public void onClick(View v) ( final EditText nameText = findViewById(R.id) .name); final EditText companyText = findViewById(R.id.company); final EditText priceText = findViewById(R.id.price); String name = nameText.getText().toString(); String company = companyText.getText( ).toString(); int cijena = Integer.parseInt(priceText.getText().toString()); Intent intent = new Intent(this, SecondActivity.class); intent.putExtra("name", name); intent. putExtra("poduzeće", tvrtka); namjera. putExtra("cijena", cijena); startActivity(namjera); ) )
U rukovatelju klikom gumba dobivamo podatke unesene u tekstualna polja EditText i prosljeđujemo ih objektu Intent pomoću metode putExtra(). Zatim pokrećemo SecondActivity.
Kao rezultat toga, kada kliknete na gumb, pokrenut će se SecondActivity, koji će primiti neke podatke unesene u tekstualna polja.
Prolaz složenih objekata
U gornjem primjeru proslijeđeni su jednostavni podaci - brojevi, nizovi. Ali možemo prenijeti i složenije podatke. U ovom slučaju koristi se mehanizam serijalizacije.
Na primjer, neka je klasa proizvoda definirana u našem projektu:
Paket com.example.eugene.serializeapp; import java.io.Serializable; public class Product implements Serializable ( private String name; private String company; private int price; public Product(String name, String company, int price)( this.name = name; this.company = company; this.price = price; ) public String getName() ( return name; ) public void setName(String name) ( this.name = name; ) public String getCompany() ( return company; ) public void setCompany(String company) ( this.company = company; ) public int getPrice() ( povratna cijena; ) public void setPrice(int cijena) ( this.price = cijena; ) )
Imajte na umu da ova klasa implementira Serializable sučelje. Sada promijenimo kod MainActivity:
Paket com.example.eugene.serializeapp; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; javna klasa MainActivity proširuje AppCompatActivity ( @Override protected void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ) public void onClick(View v) ( final EditText nameText = findViewById(R.id) .name); final EditText companyText = findViewById(R.id.company); final EditText priceText = findViewById(R.id.price); String name = nameText.getText().toString(); String company = companyText.getText( ).toString();int cijena = Integer.parseInt(priceText.getText().toString()); Proizvod proizvoda = novi proizvod (ime, tvrtka, cijena); Namjera namjere = nova namjera(ovo, SecondActivity.class); intent.putExtra(Product.class.getSimpleName(), product); startActivity(intent); ) )
Sada se umjesto tri različita podatka prosljeđuje jedan proizvodni objekt. Ključ je rezultat metode Product.class.getSimpleName(), koja u biti vraća naziv klase.
I promijenite klasu SecondActivity:
Paket com.example.eugene.serializeapp; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; javna klasa SecondActivity proširuje AppCompatActivity ( @Override protected void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); TextView textView = new TextView(this); textView.setTextSize(20); textView.setPadding(16, 16, 16, 16 ); Bundle arguments = getIntent().getExtras(); final Product product; if(arguments!=null)( product = (Product) arguments.getSerializable(Product.class.getSimpleName()); textView.setText("Name: " + product.getName() + "\nTvrtka: " + product.getCompany() + "\nCijena: " + String.valueOf(product.getPrice())); ) setContentView(textView); ) )
Metoda getSerializable() koristi se za dobivanje podataka jer klasa Product implementira Serializable sučelje. Dakle, možemo proslijediti jedan jedini objekt umjesto skupa različitih podataka.
Aplikacija se ne sastoji uvijek od jednog zaslona. Na primjer, napravili smo vrlo koristan program i korisnik želi znati tko je njegov autor. Klikne na gumb “O” i dolazi do novog ekrana s korisnim informacijama o verziji programa, autoru, adresi stranice, koliko mačaka autor ima itd. Zaslon aktivnosti zamislite kao web stranicu s vezom na drugu stranicu. Ako pogledate kod u datoteci MainActivity.java iz prethodnih lekcija, vidjet ćete da naš razred Glavna aktivnost također se odnosi na Aktivnost(odnosno njegovi nasljednici) odnosno, točnije, nasljeđuje se od njega.
Javna klasa MainActivity proširuje AppCompatActivity
Kao što možda pretpostavljate, trebali bismo stvoriti novu klasu koja bi mogla izgledati ovako Glavna aktivnost a zatim se nekako prebaciti na njega pritiskom na gumb.
Za eksperiment ćemo uzeti program iz prve lekcije i koristiti gumb za eksperimente (ili izraditi novi projekt s jednim gumbom na ekranu). Zatim, stvorimo novi obrazac za prikaz korisnih informacija. Na primjer, pokažimo korisniku što mačka radi kada ide lijevo-desno. Slažem se, ovo je vrlo važna informacija koja daje ključ za razotkrivanje svemira.
Novu aktivnost izradit ćemo ručno, iako studio ima gotove predloške. Ali nema ništa komplicirano i za bolje razumijevanje korisno je učiniti sve ručno.
Kreirajmo novu XML datoteku za označavanje activity_about.xml u mapi rez/izgled. Desni klik na mapu raspored i odaberite iz kontekstnog izbornika Novo | Datoteka resursa izgleda. Pojavit će se dijaloški okvir. Unesite naziv datoteke u prvo polje aktivnost_o. U drugom morate unijeti korijenski element. Prema zadanim postavkama postoji ConstraintLayout. Obrišite tekst i unesite scrollview. Unos nekoliko znakova dovoljan je da studio predloži gotove opcije, možete odmah pritisnuti Enter bez čekanja na puni unos riječi:
Dobivamo odgovarajuću prazninu u koju umetnemo element prikaz teksta.
Informacije će se dohvatiti iz resursa, točnije iz resursa niza o_tekstu. Sada je označen crvenom bojom, signalizirajući nedostatak informacija. moglo se pritisnuti Alt+Enter i unesite tekst u dijaloški okvir. Ali za naš primjer, ova metoda neće raditi, jer će naš tekst biti višeredni, koristeći kontrolne znakove. Pa učinimo to drugačije. Otvorimo datoteku res/vrijednosti/nizovi.xml i ručno unesite sljedeći tekst:
Koristili smo najjednostavnije HTML oznake za oblikovanje teksta poput , , . Za naš primjer dovoljno je podebljati riječi koje se odnose na mačku i smjer kretanja. Za prijevod teksta u novi red koristite simbole \n. Dodajmo još jedan izvor niza za naslov novog zaslona:
Razumije se s markupom. Zatim trebate stvoriti klasu za prozor AboutActivity.java. Odaberite iz izbornika datoteka | Novo | Java klasa i ispunite potrebna polja. U početku je dovoljno navesti samo ime. Zatim se pozabavite drugim poljima.
Krenimo s pripremom.
Sada je učionica gotovo prazna. Dodajmo kôd ručno. Klasa mora naslijediti od apstraktne klase Aktivnost ili njegovih srodnika FragmentActivity, AppCompatActivity itd. Dodavanje proširuje Aktivnost. Klasa aktivnosti mora imati metodu onCreate(). Postavite kursor miša unutar klase i odaberite iz izbornika kod | Nadjačavanje metoda(Ctrl+O). U dijaloškom okviru tražimo željenu klasu, možete upisati prve znakove na tipkovnici za brzo pretraživanje. U stvorenoj metodi morate pozvati metodu setContentView(), koji će učitati pripremljenu oznaku na ekran. Imat ćemo takvu mogućnost.
Paket en.alexanderklimov.helloworld; import android.app.Activity; import android.os.Bundle; /** * Kreirao Alexander Klimov 01.12.2014. */ javna klasa AboutActivity proširuje aktivnost ( @Override protected void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_about); ) )
Sada počinje ono najvažnije. Naš zadatak je prijeći na novi zaslon kada se klikne gumb na prvom zaslonu. Vratimo se u razred Glavna aktivnost. Napišimo rukovatelj klikom na gumb:
Public void onClick(View view) ( Intent intent = new Intent(MainActivity.this, AboutActivity.class); startActivity(intent); )
Ovdje sam koristio metodu rukovanja klikom na gumb opisanu u lekciji.
Da biste pokrenuli novi zaslon, trebate stvoriti instancu klase Namjera i navedite trenutnu klasu u prvom parametru, a klasu za prijelaz u drugom, imamo ovo O Aktivnosti. Nakon toga se poziva metoda startActivity(), koji pokreće novi zaslon.
Ako sada pokušate testirati aplikaciju u emulatoru, primit ćete poruku o pogrešci. Što smo učinili krivo? Propustili smo jedan važan korak. Morate registrirati novi Aktivnost u manifestu AndroidManifest.xml. Pronađite ovu datoteku u svom projektu i dvaput kliknite na nju. Otvorit će se prozor za uređivanje datoteke. Dodajte novu oznaku
Ovo je mjesto gdje izvor niza dolazi od koristi o_naslovu. Pokrenite aplikaciju, kliknite na gumb i otvorite prozor O programu. Tako smo naučili kako napraviti novi prozor i pozvati ga pritiskom na gumb. I na raspolaganju nam se pojavio mega-praktičan program - sada će uvijek biti pri ruci savjet što mačka radi kada ide ulijevo.
Još jednom vam skrećem pozornost na činjenicu da druga stvorena klasa aktivnosti mora biti naslijeđena od klase Aktivnost ili slično ( ListActivity itd.), imati XML datoteku za označavanje (ako je potrebna) i biti upisan u manifest.
Nakon poziva metode startActivity() započet će nova aktivnost (u ovom slučaju O Aktivnosti), postat će vidljiv i pomaknuti se na vrh hrpe koja sadrži aktivne komponente. Prilikom pozivanja metode Završi() od nove aktivnosti (ili kada se pritisne hardverska povratna tipka) bit će zatvoren i uklonjen sa stoga. Programer se također može pomaknuti na prethodnu (ili bilo koju drugu) aktivnost koristeći istu metodu startActivity().
Stvaranje trećeg ekrana - način za lijene
Programeri su, poput mačaka, lijena bića. Uvijek imajte na umu da za aktivnost morate stvoriti oznake i klasu koja nasljeđuje Aktivnost, a zatim ne zaboravite registrirati klasu u manifestu - oh pa, koji vrag.
U tom slučaju odaberite iz izbornika datoteka | Novo | aktivnost | osnovna djelatnost(ili drugi uzorak). Zatim će se pojaviti poznati prozor za stvaranje nove aktivnosti. Ispunite obavezna polja.
Kliknite na gumb Završi i aktivnost će biti spremna. Da biste to provjerili, otvorite datoteku manifesta i potražite novi unos. Ne govorim o datotekama klasa i oznakama, one će se pojaviti pred vama.
Sami dodajte novi gumb na zaslon glavne aktivnosti i napišite kod za navigaciju do stvorene aktivnosti.
Za početak bih vam savjetovao da ručno izradite sve potrebne komponente za novu aktivnost kako biste razumjeli odnos između klase, oznake i manifesta. A kada ga se dočepate, možete upotrijebiti čarobnjak za stvaranje aktivnosti da ubrzate stvari.
Prijenos podataka između aktivnosti
Koristili smo najjednostavniji primjer za pozivanje drugog zaslona aktivnosti. Ponekad je potrebno ne samo pozvati novi zaslon, već i prenijeti podatke na njega. Na primjer, korisničko ime. U ovom slučaju morate koristiti posebno područje extraData, koje razred ima Namjera.
Regija extraData je popis parova ključ/vrijednost, koji se donosi uz namjeru. Nizovi se koriste kao ključevi, a za vrijednosti možete koristiti bilo koje primitivne tipove podataka, nizove primitiva, objekte klase paket i tako dalje.
Za prosljeđivanje podataka drugoj aktivnosti upotrijebite metodu stavitiExtra():
Intent.putExtra("Ključ", "Vrijednost");
Aktivnost primanja treba pozvati neku odgovarajuću metodu: getIntExtra(), getStringExtra() itd.:
Int count = getIntent().getIntExtra("name", 0);
Prepravimo prethodni primjer. Već imamo tri aktivnosti. Prva aktivnost će imati dva tekstualna polja i gumb. Izgled može biti sljedeći:
Kod druge aktivnosti Druga aktivnost postaviti element prikaz teksta, u kojem ćemo prikazati tekst dobiven iz prve aktivnosti. Napišimo sljedeći kod za metodu onCreate() na drugoj aktivnosti.
@Override protected void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); String user = "Animal"; String gift = "donut hole"; TextView infoTextView = (TextView)findViewById( R .id.textViewInfo); infoTextView.setText(user + " , dobili ste " + dar); )
Ako sada pokrenemo program i jednostavno pozovemo drugi prozor, kao što je opisano u prvom dijelu članka, vidjet ćemo zadani natpis ZhYvotnoe, dobili ste rupu od krafne. Slažem se, prava je šteta primati takve poruke.
Popravljamo situaciju. Dodajte kod prvoj aktivnosti:
Public void onClick(View view) ( EditText userEditText = (EditText) findViewById(R.id.editTextUser); EditText giftEditText = (EditText) findViewById(R.id.editTextGift); Namjera namjere = nova namjera(MainActivity.this, SecondActivity. class); // gurnite tekst iz prvog tekstualnog polja u ključ korisničkog imena intent.putExtra("username", userEditText.getText().toString()); // gurnite tekst iz drugog tekstualnog polja u ključ poklona intent.putExtra("dar ", giftEditText.getText().toString()); startActivity(namjera); )
Stavili smo u poseban spremnik za objekte Namjera dva ključa s vrijednostima preuzetim iz tekstualnih polja. Kada korisnik unese podatke u tekstualna polja, oni će pasti u ovaj spremnik i bit će proslijeđeni na drugu aktivnost.
Druga aktivnost bi trebala biti spremna za toplo primanje poruka kako slijedi (istaknuto podebljano).
// Zadane vrijednosti String user = "LIFE"; Struna dar = "rupa od krafne"; korisnik = getIntent().getExtras().getString("korisničko ime"); dar = getIntent().getExtras().getString("dar"); TextView infoTextView = (TextView)findViewById(R.id.textViewInfo); infoTextView.setText(user + " , dobili ste " + dar);
Sada poruka ne izgleda tako uvredljivo, već nekima čak i ugodno. U složenim primjerima poželjno je dodati validaciju tijekom obrade podataka. Postoje situacije kada započnete drugu aktivnost s praznim podacima poput ništavan, što može srušiti aplikaciju.
U našem slučaju, znamo da čekamo vrijednost niza, tako da se kod može prepisati ovako:
namjera namjera = getIntent(); korisnik = intent.getStringExtra("korisničko ime");
Korisnik = getIntent().getStringExtra("korisničko ime");
Program ima nedostatak - nije jasno od koga primamo čestitke. Svaki dobro odgojeni majmun neće prihvatiti dar od anonimnog izvora. Dakle, za domaću zadaću dodajte još jedno tekstualno polje za unos imena korisnika koji šalje poruku.
Google preporučuje korištenje sljedećeg formata za ključeve: naziv vašeg paketa kao prefiks, nakon kojeg slijedi sam ključ. U tom slučaju možete biti sigurni da je ključ jedinstven u interakciji s drugim aplikacijama. Otprilike ovako:
Javni konačni statički niz USER = "ru.alexanderklimov.myapp.USER";
Tko je smjestio mačku Vasku - vraćamo rezultat
Nije uvijek dovoljno samo proslijediti podatke drugoj aktivnosti. Ponekad trebate dobiti informacije od druge aktivnosti kada je ona zatvorena. Ako smo prije koristili metodu startActivity(namjera namjere), onda postoji srodna metoda startActivityForResult(namjera namjere, int kod zahtjeva). Razlika između metoda leži u dodatnom parametru kod zahtjeva. To je u osnovi samo cijeli broj kojeg se možete sami sjetiti. To je potrebno kako bi se razlučilo od koga je rezultat došao. Recimo da imate pet dodatnih ekrana i dodijelite im vrijednosti od 1 do 5, a iz tog koda možete odrediti čiji rezultat trebate obraditi. Možete koristiti vrijednost -1, tada će to biti ekvivalentno pozivanju metode startActivity(), tj. nećemo dobiti nikakav rezultat.
Ako koristite metodu startActivityForResult(), tada morate nadjačati metodu u kodu da biste dobili rezultat onActivityResult() i obraditi rezultat. Zbunjeni? Pogledajmo primjer.
Recimo da ste detektiv. Zaprimljena je informacija da su sa stola jedne utjecajne osobe u ugostiteljskom objektu ukradena dva komada kobasica i drugi proizvodi. Sumnja je pala na troje osumnjičenih - vranu, jebenog psa i mačku Vasku.
Jedan od posjetitelja pružio je niz fotografija sa svog pontonskog iPhonea:
Tu je i iskaz drugog svjedoka: A Vaska sluša i jede.
Kreiramo novi projekt Sherlock sa dvije aktivnosti. Na prvom ekranu bit će gumb za prebacivanje na drugi ekran i tekstualna oznaka koja će prikazivati ime lopova.
Drugi zaslon će imati grupu radio gumba:
Budući da ćemo čekati odgovor s drugog zaslona, moramo upotrijebiti metodu startActivityForResult() na prvom ekranu gdje ćemo proslijediti varijablu IZABERI_LOPOVA kao parametar kod zahtjeva.
static final private int CHOOSE_THIEF = 0; public void onClick(View v) ( Intent questionIntent = new Intent(MainActivity.this, ChooseActivity.class); startActivityForResult(questionIntent, CHOOSE_THIEF); )
Pogledaj kod. Kada se klikne na gumb, radit ćemo s drugim zaslonom Odaberite Aktivnost i pokrenite drugi zaslon čekajući rezultat.
Prelazimo na drugi ekran i napisat ćemo kod za drugu aktivnost.
Javni završni statički niz THIEF = "ru.alexanderklimov.sherlock.THIEF"; public void onRadioClick(View v) ( Intent answerIntent = new Intent(); switch (v.getId()) ( case R.id.radioDog: answerIntent.putExtra(THIEF, "Jebeni pas"); break; case R.id .radioCrow: answerIntent.putExtra(THIEF, "Crow"); break; case R.id.radioCat: answerIntent.putExtra(THIEF, "Przewalski's Horse"); break; default: break; ) setResult(RESULT_OK, answerIntent); završetak ();)
Ovdje je sve jednostavno, kada detektiv odabere ime kriminalca, zatim kroz metodu stavitiExtra() prosljeđujemo ime ključa i njegovu vrijednost.
Radi praktičnosti, nakon odabira, odmah zatvaramo drugi prozor i prosljeđujemo vrijednost prije zatvaranja REZULTAT_OK kako bi bilo jasno da je izbor napravljen. Ako korisnik zatvori zaslon preko gumba Natrag, vrijednost će biti proslijeđena REZULTAT_OTKAZAN.
metoda postaviRezultat() uzima dva parametra: rezultirajući kod i sam rezultat, predstavljen kao namjera. Rezultirajući kod govori s kakvim je rezultatom aktivnost završila, u pravilu i jest Aktivnost.RESULT_OK, ili Aktivnost.RESULT_CANCELED. U nekim slučajevima morate koristiti vlastiti povratni kod za rukovanje opcijama specifičnim za aplikaciju. metoda postaviRezultat() podržava bilo koju cjelobrojnu vrijednost.
Ako ćete podatke proslijediti eksplicitno kroz gumb, bilo bi lijepo dodati metodu Završi() zatvoriti drugu aktivnost kao nepotrebnu. Ako se prijelaz dogodi putem gumba Natrag, to nije potrebno.
Ako je aktivnost zatvorio korisnik kada je pritisnut hardverski gumb za povratak ili ako je metoda Završi() je pozvan prije metode postaviRezultat(), rezultirajući kod bit će postavljen na REZULTAT_OTKAZAN a vraćena namjera pokazat će vrijednost ništavan.
Vraćamo se na prvi ekran. Prvi ekran čeka na odgovor drugog ekrana, tako da trebate dodati metodu kodu onActivityResult().
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) ( super.onActivityResult(requestCode, resultCode, data); TextView infoTextView = (TextView) findViewById(R.id.textViewInfo); if (requestCode == CHOOSE_THIEF) ( if (resultCode == RESULT_OK) ( String thiefname = data.getStringExtra(ChooseActivity.THIEF); infoTextView.setText(thiefname); )else ( infoTextView.setText(""); // brisanje teksta ) ) )
Metoda očekuje dolazne podatke s kodom IZABERI_LOPOVA, i ako takvi podaci stignu, onda izdvaja vrijednost iz ključa Odaberite Aktivnost.LOPOD pomoću metode getStringExtra. Dobivenu vrijednost ispisujemo u prikaz teksta(varijabilno infoTextView). Ako smo se vratili na ekran preko tipke Natrag, tada jednostavno brišemo tekst.
Kada se podređena aktivnost zatvori unutar nadređene komponente, aktivira se rukovatelj onActivityResult(). rukovatelj onActivityResult() uzima više parametara.
- Šifra zahtjeva. Kod koji se koristi za pokretanje aktivnosti koja vraća rezultat
- Rezultirajući kod. Šifra rezultata koju je postavila podređena aktivnost koja označava kako je podređena aktivnost završila. To može biti bilo koja cjelobrojna vrijednost, ali obično bilo koja Aktivnost.RESULT_OK, ili Aktivnost.RESULT_CANCELED
- Podaci. Namjera koja se koristi za pakiranje vraćenih podataka. Ovisno o svrsi dječje aktivnosti, ona može uključivati URI stazu koja predstavlja odabrani dio sadržaja. Alternativno (ili dodatno), dječja aktivnost može vratiti informacije kao jednostavne vrijednosti umotane u parametar namjere dodaci
Ako je dječja aktivnost neočekivano završila ili ako nije naveden kod rezultata prije zatvaranja, ovaj će parametar postati jednak Aktivnost.RESULT_CANCELED.
Pokrećemo projekt, kliknemo na gumb i idemo na drugi ekran. Tamo biramo jednu od opcija. Ako odaberete vranu, ekran će se zatvoriti i na prvom ekranu će se prikazati ime kriminalca. Ako odaberete psa, prikazat će se njegovo ime.
Usput, ako odaberete mačku, njeno ime neće biti prikazano! Provjerite i uvjerite se sami. Pitat ćete zašto? Osnovno Watsone! Prekršitelj nije uzeo u obzir jedan važan detalj. Restoran je bio pod nadzorom video kamera, a na snimci se vidjelo tko je zapravo ukrao kobasicu i smjestio mački. Vaska, izdrži!
p.s. Ako vam se isprva nešto činilo neshvatljivim, s praksom će mnogo toga postati jasno. Prijenos podataka između zaslona uobičajen je u aplikacijama, a primjer ćete proučavati više puta.
P.P.S. Najbolja riba je kobasica. Znajući tu slabost, mačku nije bilo teško smjestiti.
Korištenje filtara
U članku sam pokazao uobičajeni način prebacivanja na drugu aktivnost, kada ste u metodi startActivity() naznačena je trenutna klasa i klasa za prijelaz. Usput, razred aktivnosti ne mora biti dio vaše prijave. Ako znate naziv klase iz druge aplikacije, možete se prebaciti i na nju. Ali možete se prebaciti na drugu aktivnost na drugačiji način.
Rjeđe u praksi, ali korisno. Recimo da već imate drugu aktivnost. U manifestu dodajte poseban filtar:
A drugu aktivnost pokrećemo klikom na gumb na ovaj način.
Public void onClick(View view) ( startActivity(nova namjera("ru.alexanderklimov.testapplication.SecondActivity"); )
Zamijenimo dugačak niz konstantom.
Javni statički konačni niz ACTION_SECOND_ACTIVITY = "ru.alexanderklimov.testapplication.SecondActivity"; public void onClick(View view) ( startActivity(nova namjera(ACTION_SECOND_ACTIVITY)); )
Pa što smo učinili. Za drugu aktivnost registrirali smo filtar i odredili naziv akcijski u atributu android:ime. Radi praktičnosti, samo sam stavio puni naziv aktivnosti s nazivom paketa. Konstruktor klase Namjera ima nekoliko preopterećenih verzija. U jednoj verziji možete navesti niz za radnju. Naznačili smo našu kreiranu akciju koja je registrirana u drugoj aktivnosti. Sustav tijekom rada pregledava manifeste svih instaliranih aplikacija. Prilikom traženja podudaranja, sustav pronalazi naš filter i pokreće željenu aktivnost.
Po istom principu možete pokrenuti i druge aktivnosti. Pogledajte primjer. Ako kopirate primjer sebi i pogledate dokumentaciju za android.provider.Settings.ACTION_AIRPLANE_MODE_SETTINGS, vidjet ćete da ovaj kod odgovara konstanti niza public static final java.lang.String ACTION_AIRPLANE_MODE_SETTINGS = "android.settings.AIRPLANE_MODE_SETTINGS". Usporedite s našim kodom. Možete pretpostaviti da aktivnost postavki za izvanmrežni način rada ima ovaj redak u filtru.
Naziv kategorije filtra android.intent.category.DEFAULT govori sustavu da poduzme zadanu radnju, a to je pokretanje aktivnosti. Ima još imena koja nas još ne zanimaju.
A sad jedno škakljivo pitanje. Što se događa ako stvorite drugu aktivnost i navedete isti filtar kao drugu aktivnost? I provjerimo. Napravite treću aktivnost za sebe i kopirajte blok s filtrom iz druge aktivnosti u nju.
Kliknemo na gumb u prvoj aktivnosti. Sustav će od vas tražiti da odaberete željenu opciju.
Ako odaberete stavku STALNO onda sljedeći put nećete morati birati. Za poništavanje odabira idite na svojstva aplikacije u Postavkama i pronađite gumb jasne zadane postavke.
Pokretanje aktivnosti pod njezinim imenom
U konstruktoru Namjera Drugi parametar je klasa. Ali pretpostavimo da postoji neka vrsta baze podataka u kojoj su naznačeni nazivi aktivnosti i trebamo pokrenuti željenu aktivnost pod njenim imenom. Možemo dobiti samu klasu na temelju string varijable i pokrenuti aktivnost.
Pokušajte ( // Puni naziv klase aktivnosti String activityName = "ru.alexanderklimov.testapplication.SecondActivity"; // dohvatite objekt klase klase>myClass = Class.forName(activityName); Namjera namjere = nova namjera(ovo, mojRazred); startActivity(namjera); ) catch (ClassNotFoundException e) ( e.printStackTrace(); )
Zdravo.
Podatke primljene preko UART-a potrebno je prenijeti u Aktivnost. To se može učiniti stvaranjem niti u Aktivnosti u kojoj se organizira while (!isInterrupted()) petlja i čitaju podaci iz UART međuspremnika. Nakon toga, pozivanjem UI niti aktivnosti - MainActivity.this.runOnUiThread(new Runnable() , izvršite potrebne radnje s ovom aktivnošću. Ali ako pozovemo druge aktivnosti iz glavne aktivnosti, tada organizirana nit ne dopušta prolaz podataka u novostvorene aktivnosti. Ako sam dobro shvatio da bi se podaci iz toka mogli prenijeti u bilo koju aktivnost, tok mora biti kreiran ne u aktivnosti, već u usluzi.
Pitanje: podaci su došli preko UART-a, u thread-u (koji se kreira u Servce-u) potrebno je prebaciti podatke u Activity, koji je sada aktivan, kako se to može učiniti i radi li se uopće?
1 odgovor
U svakoj aktivnosti stvorite rukovatelja. U onResume() metodi ove aktivnosti, bindService() je gotov. Tamo je jedan od parametara sučelje ServiceConnection. Provedite ga s barem istom aktivnošću. U njemu implementirajte metodu onServiceConnected(). U ovom povratnom pozivu, sama Usluga dolazi kao jedan od parametara. Dakle, nazovite ovu uslugu svojom metodom setHandler(). Proslijedite tamo rukovatelja koji je u trenutnoj aktivnosti. Ali ubacite dolazne podatke putem UART-a u uslugu na ovom rukovatelju. Usput, Handler tradicionalno radi na glavnoj niti, tako da runOnUiThread neće morati biti izvršen.