Android-sovellusten suunnittelussa on tärkeää hallita käyttäjäkokemusta sekä tarjota selkeitä ja intuitiivisia käyttöliittymiä. Tässä käsitellään, kuinka luoda yksinkertainen hakutoiminto ja kuinka hyödyntää Immersive Mode -tilaa täysnäyttöisissä sovelluksissa.

Aluksi luodaan uusi Activity nimeltään SearchResultActivity, joka vastaa hakutulosten näyttämisestä. Tätä varten luodaan TextView-muuttuja mTextViewSearchResult, joka esittää haetun tekstin. Seuraavaksi muutetaan onCreate()-metodia niin, että se lataa käyttöliittymän, asettaa TextView-elementin ja tarkistaa, onko saapunut hakutoiminto (QUERY). Tämän jälkeen toteutetaan hakutoiminto metodiin handleSearch(), joka yksinkertaisesti näyttää syötetyn hakusanan TextView-komponentissa.

Koodissa näkyy seuraava rakenne:

java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_search_result); mTextViewSearchResult = (TextView) findViewById(R.id.textViewSearchResult); if (Intent.ACTION_SEARCH.equals(getIntent().getAction())) { handleSearch(getIntent().getStringExtra(SearchManager.QUERY)); } } private void handleSearch(String searchQuery) { mTextViewSearchResult.setText(searchQuery); }

Kun nämä perusasetukset on tehty, on tärkeää liittää SearchResultActivity oikeaan paikkaan AndroidManifest.xml-tiedostossa. Tämä mahdollistaa SearchManagerin lähettämän hakukyselyn ohjaamisen SearchResultActivity-aktiivisuuteen. Tähän lisätään tarvittavat intent filter -asetukset, jotka ohjaavat hakukyselyn SearchResultActivityyn.

xml
<activity android:name=".SearchResultActivity">
<intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity>

Kun hakupainike tai enter-näppäin on painettu, hakutulos näytetään kyseisessä aktiivisuudessa. Tällöin voidaan käyttää esimerkiksi paikallista tietokantaa tai verkkopalvelua hakutulosten näyttämiseen, riippuen sovelluksen tarpeista. Tämä perusratkaisu mahdollistaa helpon ja nopean hakukokemuksen, mutta voi vaatia lisätoimintoja ja optimointia sen mukaan, miten sovelluksessa käsitellään ja haetaan tietoa.

Android 4.4 (API 19) toi mukanaan uuden käyttöliittymäominaisuuden nimeltään Immersive Mode. Tämä tila on erityisen hyödyllinen sovelluksille, jotka haluavat tarjota käyttäjälle täysin immersiivisen kokemuksen ilman häiriöitä, kuten pelit, piirustusohjelmat tai videoiden katselu. Immersive Mode piilottaa käyttöjärjestelmän käyttöliittymän (System UI), mutta antaa sovelluksen hallita käyttäjän kosketustapahtumia.

Immersive Modea on kolme pääasiallista käyttötapaa:

  1. Luku ja artikkelit – Immersive Mode on käytössä, mutta käyttäjä voi tarvittaessa palauttaa järjestelmän käyttöliittymän.

  2. Pelit ja piirustussovellukset – Immersive Mode piilottaa käyttöliittymän, mutta minimoi järjestelmän vuorovaikutuksen.

  3. Videon katselu – Täysnäyttötilassa järjestelmän käyttöliittymä näkyy normaalisti, koska käyttäjän ei oleteta olevan vuorovaikutuksessa sovelluksen kanssa.

Tässä vaiheessa käyttäjä voi palauttaa järjestelmän käyttöliittymän pyyhkäisemällä näytön reunoja.

Immersive Mode voidaan aktivoida seuraavilla lippuilla (flags):

java
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

Tässä esimerkissä käytetään kahta lippua, jotka piilottavat navigointipalkin ja tekevät sovelluksesta täysnäyttöisen.

Lopuksi on tärkeää ymmärtää, että Immersive Mode ja täysnäyttö eivät ole aina oikea ratkaisu. Tietyissä tilanteissa, kuten videoiden katselussa, käyttäjälle voi olla hyödyllistä, että käyttöliittymä on näkyvissä, jotta hän voi käyttää esimerkiksi ohjauspainikkeita (play, pause, volume). Tämä pitää ottaa huomioon suunniteltaessa sovelluksen käyttöliittymää ja käyttäjäkokemusta.

Toteutettaessa hakutoimintoa ja Immersive Modea, on oleellista pitää mielessä sovelluksen yleinen käyttötarkoitus ja käyttäjän vuorovaikutus. Yksinkertaisessa hakutoiminnossa keskeistä on sujuva ja nopea hakuprosessi, kun taas Immersive Mode tarjoaa mahdollisuuden keskittyä täysin sovelluksen sisältöön ilman häiriöitä. Tällöin voidaan optimoida sovelluksen toiminta niin, että se palvelee käyttäjää parhaalla mahdollisella tavalla, riippuen käytettävästä laitteesta ja käyttötilanteesta.

Miten rakentaa tehokkaita ja käyttäjäystävällisiä dialogeja Android-sovelluksissa?

Android-kehityksessä dialogit muodostavat keskeisen osan vuorovaikutusta käyttäjän kanssa. Erityisesti AlertDialog tarjoaa yksinkertaisen ja monipuolisen tavan esittää kysymyksiä, ilmoituksia tai valintoja. Yksinkertaisimmillaan dialogi voi toimia poistamisen varmistusikkunana, jossa käyttäjältä kysytään, haluaako hän varmasti jatkaa toimenpiteellä. AlertDialog.Builder-olion avulla voidaan määritellä otsikko, viesti ja painikkeet, kuten OK ja Peruuta, jotka reagoivat käyttäjän valintoihin välittömästi. Painikkeiden painallukset voidaan käsitellä Toast-viestein, jolloin sovellus antaa käyttäjälle välittömän visuaalisen palautteen ilman, että dialogin sulkemista täytyy hallita erikseen – se hoidetaan pohjaluokassa automaattisesti.

AlertDialog ei rajoitu vain kahteen valintapainikkeeseen. Kolmas, neutraali painike voidaan lisätä metodilla setNeutralButton(), ja dialogiin voidaan liittää myös ikoni setIcon()-metodilla. Dialogin sisältö ei myöskään ole sidottu pelkkään tekstiin: valintalistat voidaan toteuttaa monella tavalla – yksinkertaisilla listoilla setItems(), mukautetuilla adaptereilla setAdapter(), yhden valinnan radio-painikkeilla setSingleChoiceItems() tai monivalintaruuduilla setMultiChoiceItems(). On kuitenkin tärkeää muistaa, että setMessage() ja listaelementit eivät voi olla aktiivisia samanaikaisesti – viestimetodi ohittaa listasisällön.

Kehittyneempiä käyttöliittymäratkaisuja varten AlertDialog tukee myös täysin mukautettuja näkymiä. setView()-metodilla voidaan lisätä oma layout, jossa voi olla mitä tahansa käyttöliittymäelementtejä. Tällöin kehittäjän vastuulle jää myös dialogin sulkeminen – dismiss() vapauttaa resurssit pysyvästi, kun taas hide() piilottaa ikkunan, jolloin sen voi avata uudelleen myöhemmin.

ProgressDialog oli pitkään vakiomenetelmä toiminnan etenemisen näyttämiseksi. Se tarjoaa yksinkertaisen tavan näyttää käyttäjälle, että jotain on käynnissä. Esimerkiksi palvelimen vasteen simulointia varten voidaan käyttää viivästettyä ajastinta (Handler.postDelayed()), joka sulkee dialogin tietyn ajan kuluttua. Kuitenkin käyttöliittymäsuositukset suosittelevat välttämään ProgressDialogin käyttöä. Tärkein syy tähän on se, että käyttäjä ei voi olla vuorovaikutuksessa sovelluksen kanssa niin kauan kuin dialogi on näkyvissä. Tämän vuoksi suositellaan käytettäväksi suoraan käyttöliittymään upotettua ProgressBar-elementtiä, joka mahdollistaa toiminnan seurannan ilman, että käyttäjä kokee sovelluksen pysähtyneen. Esimerkiksi Google Play -sovellus toteuttaa tämän tyylin onnistuneesti.

Jos ProgressDialog on kuitenkin välttämätön – esimerkiksi tilanteissa, joissa käyttäjän on odotettava ennen kuin jatkotoimenpiteet ovat mahdollisia – kannattaa käyttää sen yksinkertaisinta muotoa, jossa setCancelable(false) estää käyttäjää peruuttamasta dialogia taaksepäin-näppäimellä. Tarvittaessa voidaan käyttää horisontaalista edistymispalkkia setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)-metodilla, mikäli etenemistä voidaan mitata tarkasti.

Ilmoitukset (Notifications) ovat nykyisin keskeinen osa käyttöliittymän kommunikaatiota. Ne mahdollistavat tiedon välittämisen käyttäjälle ilman, että sovelluksen tarvitsee keskeyttää tai estää vuorovaikutusta. Notification-objekti tukee ääntä, valoja ja tärinää – elementtejä, jotka herättävät käyttäjän huomion tehokkaasti. Tästä syystä niitä tulee käyttää harkiten: liiallinen häirintä voi johtaa sovelluksen poistamiseen. Paras käytäntö on tarjota käyttäjälle hallintamahdollisuus – valita, haluaako hän ilmoituksia, ja millä tavoin ne esitetään.

Dialogien rakentamisessa ja käytössä tärkeää ei ole vain tekninen toteutus, vaan myös käyttäjäkokemuksen hienovarainen hallinta. Vahvistusdialogit, edistymisnäytöt ja ilmoitukset eivät ole irrallisia elementtejä, vaan ne ohjaavat käyttäjän odotuksia, rytmittävät toimintaa ja antavat palautetta. Käyttöliittymä ei saa koskaan tuntua siltä, että se pysähtyy tai jäätyy, ellei siihen ole erityinen syy. Dialogit ovat tehokas väline, mutta niitä ei tule käyttää väärin – jokainen vuorovaikutuksen hetki on käyttäjän aikaa, jota on kunnioitettava.