Andmete edastamine tegevuse ja teenuse vahel. Tegevuse ja teenuse vaheline suhtlus

Rakendus ei koosne alati ühest ekraanist. Näiteks oleme loonud väga kasulik programm ja kasutaja soovib teada, kes on autor. Ta klõpsab nuppu "Teave" ja avaneb uuele ekraanile, kus on kasulikku teavet programmi versiooni, autori, saidi aadressi, autori kasside jne kohta. Mõelge tegevuskuvale kui veebilehele, millel on link teisele lehele. Kui vaatate failis olevat koodi MainActivity.java eelmistest tundidest näete, et meie klass Põhitegevus kehtib ka kohta Tegevus(või tema pärijad) või, täpsemalt öeldes, on päritud temalt.

Avalik klass MainActivity laiendab rakendust AppCompatActivity

Nagu võite arvata, peaksime looma uue klassi, mis võib välja näha Põhitegevus ja siis lülituda sellele nupuvajutusega kuidagi.

Katse jaoks võtame programmi esimesest õppetunnist ja kasutame nuppu katsete tegemiseks (või loo uus projektühe nupuga ekraanil). Järgmiseks loome uus vorm kuvada kasulik informatsioon. Näiteks näitame kasutajale, mida kass teeb, kui ta läheb vasakule ja paremale. Nõus, see on väga oluline teave, mis annab võtme universumi lahtiharutamiseks.

Loome uue tegevuse käsitsi, kuigi stuudiol on valmis mallid. Kuid midagi keerulist pole ja paremaks mõistmiseks on kasulik kõike käsitsi teha.

Loome uue XML-märgistusfaili action_about.xml kaustas res/paigutus. Paremklõpsake kaustal paigutus ja valida kontekstimenüü Uus | Paigutusressursi fail. Ilmub dialoogiboks. Sisestage esimesele väljale faili nimi tegevus_umbes. Teises peate sisestama juurelemendi. Vaikimisi on see olemas PiirangLayout. Kustuta tekst ja sisesta kerimisvaade. Mõne tähemärgi sisestamisest piisab, et stuudio pakuks valmis valikuid, võite kohe vajutada sisestusklahvi, ootamata sõna täielikku sisestamist:

Saame vastava tooriku, millesse sisestame elemendi tekstivaade.

Teave hangitakse ressurssidest, nimelt stringressursist about_text. Nüüd on see punasega esile tõstetud, mis annab märku teabe puudumisest. sai vajutada Alt+Enter ja sisestage dialoogiboksi tekst. Kuid meie näite puhul see meetod ei tööta, kuna meie tekst on mitmerealine, kasutades juhtmärke. Nii et teeme seda teisiti. Avame faili res/values/strings.xml ja sisestage käsitsi järgmine tekst:

Roheline tamm mereranna lähedal;\n Kuldne kett sellel tammel:\n Päev ja öö teadlane kass\n Kõik käib ümber keti;\n Käib õige- laul lülitub sisse,\n Vasakule- jutustab muinasjuttu.

Kasutasime lihtsaimaid HTML-i tekstivormingu silte nagu , , . Meie näite puhul piisab kassile ja liikumissuunale viitavatest sõnadest paksus kirjas. Teksti tõlkimiseks keelde uus rida kasutada sümboleid \n. Lisame uue ekraani pealkirja jaoks veel ühe stringiallika:

Programmi kohta

Märgistamisega mõistetav. Järgmiseks peate akna jaoks looma klassi AboutActivity.java. Valige menüüst fail | Uus | Java klass ja täitke nõutud väljad. Algul piisab ainult nime määramisest. Seejärel tegele teiste valdkondadega.

Teeme ettevalmistusi.

Nüüd on klassiruum peaaegu tühi. Lisame koodi käsitsi. Klass peab pärima abstraktsest klassist Tegevus või selle sugulased FragmentActivity, AppCompatActivity jne. Lisamine pikendab tegevust. Tegevusklassil peab olema meetod onCreate(). Viige hiirekursor klassi sisse ja valige menüüst kood | Alista meetodid(Ctrl+O). Otsime dialoogiboksis soovitud klassi, mille jaoks saate klaviatuuril tippida esimesed märgid kiire otsing. Loodud meetodis peate meetodi välja kutsuma setContentView(), mis laadib ekraanile ettevalmistatud märgistuse. Meil on selline variant.

Pakett et.alexanderklimov.helloworld; import android.app.Activity; import android.os.Bundle; /** * Loodud Aleksander Klimovi poolt 12.01.2014. */ avalik klass AboutActivity laiendab tegevust ( @Override protected void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_about); ) )

Nüüd algab kõige tähtsam. Meie ülesanne on liikuda uuele ekraanile, kui esimesel ekraanil klõpsate nuppu. Lähme tagasi klassi Põhitegevus. Kirjutame nupu kliki töötleja:

Public void onClick(vaatevaade) ( Intent intent = new Intent(MainActivity.this, AboutActivity.class); startActivity(intent); )

Siin kasutasin tunnis kirjeldatud nupuklõpsude käsitlemise meetodit.

Uue ekraani käivitamiseks peate looma klassi eksemplari Kavatsus ja määrake esimeses parameetris praegune klass ja teises parameetris ülemineku klass, meil on see Teave tegevuse kohta. Pärast seda nimetatakse meetodit startActivity(), mis käivitab uue ekraani.

Kui proovite nüüd rakendust emulaatoris testida, kuvatakse tõrketeade. Mida me valesti tegime? Meil jäi üks oluline samm vahele. Peate registreerima uue Tegevus manifestis AndroidManifest.xml. Leidke see fail oma projektist ja topeltklõpsake seda. Avaneb faili redigeerimise aken. Lisage uus silt pärast sulgevat silti esimeseks tegevuseks. Sisestage ise ja kasutage aktiivselt vihjeid. Saate järgmise:

Siin tuleb appi stringiressurss about_title. Käivitage rakendus, klõpsake nuppu ja avage aken Programmi kohta. Nii õppisime, kuidas luua uus aken ja seda nupuvajutusega kutsuda. Ja meie käsutusse on ilmunud mega mugav programm - nüüd on alati käepärast vihje, mida kass teeb, kui ta vasakule läheb.

Taaskord juhin tähelepanu asjaolule, et teine ​​loodud tegevusklass peab olema klassist päritud Tegevus või sarnane ( Loenditegevus jne), omama XML-märgistusfaili (vajadusel) ja olema kirjutatud manifestis.

Pärast meetodi helistamist startActivity() algab uus tegevus (antud juhul Teave tegevuse kohta), muutub see nähtavaks ja liigub jooksvaid komponente sisaldava virna ülaossa. Meetodi kutsumisel lõpetama() uuest tegevusest (või riistvaralise tagasilükkeklahvi vajutamisel) see suletakse ja eemaldatakse virust. Arendaja saab sama meetodit kasutades navigeerida ka eelmisele (või mõnele muule) tegevusele startActivity().

Kolmanda ekraani loomine – viis laiskadele

Programmeerijad, nagu kassid, on laisad olendid. Pidage alati meeles, et tegevuse jaoks peate looma märgistuse ja klassi, mis pärineb Tegevus, ja siis ärge unustage klassi manifestis registreerida – oh noh, mida kuradit.

Sel juhul valige menüüst fail | Uus | tegevus | põhitegevus(või muu muster). Järgmisena ilmub tuttav aken uue tegevuse loomiseks. Täitke nõutud väljad.

Klõpsake nuppu Lõpetama ja tegevus on valmis. Selle kontrollimiseks avage manifesti fail ja kontrollige uut kirjet. Ma ei räägi klassifailidest ja märgistustest, need ilmuvad teie ette.

Lisage ise põhitegevuse ekraanile uus nupp ja kirjutage loodud tegevuse juurde navigeerimiseks kood.

Algul soovitaksin kõik uue tegevuse jaoks vajalikud komponendid käsitsi luua, et mõista klassi, märgistuse ja manifesti seost. Ja kui olete selle kätte saanud, saate tegevuste kiirendamiseks kasutada tegevuste loomise viisardit.

Andmete edastamine tegevuste vahel

Kasutasime kõige lihtsamat näidet mõne teise tegevuskuva kutsumiseks. Mõnikord on vaja mitte ainult uuele ekraanile helistada, vaid ka sellele andmeid edastada. Näiteks kasutajanimi. Sel juhul peate kasutama spetsiaalset ala lisaandmed, mis klassis on Kavatsus.

Piirkond lisaandmed on paaride loend võti/väärtus, mis edastatakse koos kavatsusega. Stringe kasutatakse võtmetena ja väärtuste jaoks saate kasutada mis tahes primitiivseid andmetüüpe, primitiivide massiive, klassi objekte kimp ja jne.

Andmete edastamiseks teisele tegevusele kasutage meetodit paneExtra():

Intent.putExtra("Võti", "Väärtus");

Vastuvõttev tegevus peaks kutsuma mõnda sobivat meetodit: getIntExtra(), getStringExtra() jne.:

Int count = getIntent().getIntExtra("nimi", 0);

Teeme eelmise näite uuesti. Meil on juba kolm tegevust. Esimesel tegevusel on kaks tekstivälja ja nupp. Välimus võib olla järgmine:

Teisel tegevusel Teine tegevus seadke element tekstivaade, milles kuvame esimesest tegevusest saadud teksti. Kirjutame meetodi jaoks järgmise koodi onCreate() teisel tegevusel.

@Override protected void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); String user = "Animal"; String gift = "sõõriku auk"; TextView infoTextView = (TextView)Id(RBy .id.textViewInfo); infoTextView.setText(kasutaja + " , teile anti " + kingitus); )

Kui käivitame nüüd programmi ja kutsume lihtsalt teise akna välja, nagu on kirjeldatud artikli esimeses osas, näeme vaikekirja ZhYvotnoe, sulle anti sõõriku auk. Nõus, selliseid sõnumeid on üsna kahju saada.

Parandame olukorra. Lisage kood esimesele tegevusele:

Public void onClick(View view) ( EditText userEditText = (EditText) findViewById(R.id.editTextUser); EditText giftEditText = (R.id.editTextGift); FindViewById(R.id.editTextGift); Intent.intentMa =in IntentthintentMa =intent.intent.isActivity. klass); // lükake teksti esimeselt tekstiväljalt kasutajanime võtmesse intent.putExtra("kasutajanimi", userEditText.getText().toString()); // lükake tekst teiselt tekstiväljalt kingivõtmesse intent.putExtra("kingitus", kingitusEditText.getText().toString()); startActivity(intent); )

Panime spetsiaalsesse objekti konteinerisse Kavatsus kaks klahvi tekstiväljadelt võetud väärtustega. Kui kasutaja sisestab andmed tekstiväljadele, satuvad need sellesse konteinerisse ja edastatakse teisele tegevusele.

Teine tegevus peaks olema valmis sõnumeid soojalt vastu võtma järgmiselt (rasvas kirjas esile tõstetud).

// Vaikeväärtused String user = "LIFE"; String kingitus = "sõõriku auk"; kasutaja = getIntent().getExtras().getString("kasutajanimi"); kingitus = getIntent().getExtras().getString("kingitus"); TextView infoTextView = (TextView)findViewById(R.id.textViewInfo); infoTextView.setText(kasutaja + " , teile anti " + kingitus);

Nüüd ei tundu sõnum nii solvav, vaid mõne jaoks isegi meeldiv. Keerukate näidete puhul on soovitav andmetöötluse käigus lisada valideerimine. On olukordi, kui alustate teist tegevust tühjade andmetega, näiteks null, mis võib rakenduse krahhi.

Meie puhul teame, et ootame stringi väärtust, nii et koodi saab ümber kirjutada järgmiselt:

intent intent = getIntent(); kasutaja = intent.getStringExtra("kasutajanimi");

Kasutaja = getIntent().getStringExtra("kasutajanimi");

Programmil on puudus - pole selge, kellelt me ​​tervitusi saame. Ükski hästi käituv ahv ei võta anonüümselt allikalt kingitust vastu. Seega lisage kodutöö jaoks veel üks tekstiväli, et sisestada sõnumi saatva kasutaja nimi.

Google soovitab kasutada võtmete jaoks järgmist vormingut: eesliitena teie paketi nimi, millele järgneb võti ise. Sel juhul võite olla kindel, et võti on teiste rakendustega suhtlemisel unikaalne. Umbes nii:

Avalik lõplik staatiline string KASUTAJA = "ru.alexanderklimov.myapp.USER";

Kes kass Vaska raamis - saame tulemuse tagasi

Alati ei piisa lihtsalt andmete edastamisest teisele tegevusele. Mõnikord peate mõne muu tegevuse kohta teavet tagasi saama, kui see on suletud. Kui enne kasutasime meetodit startActivity (Intent intent), siis on olemas seotud meetod startActivityForResult(Intent intent, int RequestCode). Meetodite erinevus seisneb lisaparameetris päringu kood. Põhimõtteliselt on see vaid täisarv, mida saate enda kohta mõelda. See on vajalik selleks, et eristada, kellelt tulemus tuli. Oletame, et teil on viis lisaekraani ja määrate neile väärtused vahemikus 1 kuni 5 ning selle koodi järgi saate määrata, kelle tulemust peate töötlema. Võite kasutada väärtust -1, siis on see samaväärne meetodi kutsumisega startActivity(), st. me ei saa mingit tulemust.

Kui kasutate meetodit startActivityForResult(), siis peate tulemuse saamiseks koodis oleva meetodi alistama onActivityResult() ja töödelda tulemust. Segaduses? Vaatame näidet.

Oletame, et olete detektiiv. Laekus info, et restoranis varastati mõjuka isiku laualt kaks tükki vorsti ja muid tooteid. Kahtlus langes kolmele kahtlusalusele - varesele, kuradi koerale ja kassile Vaskale.

Üks külastajatest esitas fotoseeria oma pontoonist iPhone'ist:


Samuti on olemas teise tunnistaja ütlused: Ja Vaska kuulab ja sööb.

Loome uue projekti Sherlock kahe tegevusega. Esimesel ekraanil on nupp teisele ekraanile lülitumiseks ja tekstisilt, mis kuvab varga nime.