Fragmenttien käsittely on keskeinen osa monimutkaisempia Android-sovelluksia, joissa käyttäjä voi navigoida useiden sisältöjen välillä ilman, että koko sovelluksen käyttöliittymä latautuu uudelleen. Fragmenttien luominen ja niiden välinen siirtyminen on sujuva tapa hallita eri näkymiä ja tiloja sovelluksessa, mutta se vaatii huolellista suunnittelua ja oikeiden koodirakenteiden käyttöä. Tässä käymme läpi fragmenttien luomisen, niiden käsittelyn sekä tiedonsiirron kahden fragmentin välillä.

Ensimmäinen vaihe on luoda XML-tiedostot fragmenttien käyttöliittymille. Esimerkiksi fragment_one.xml voi sisältää yksinkertaisen tekstin, joka näyttää "Fragment One", ja toinen tiedosto fragment_two.xml voi olla lähes identtinen, mutta tekstinä "Fragment Two". Näiden XML-tiedostojen avulla määritämme fragmenttien ulkoasun, joka sitten liitetään aktiiviteettiin.

Seuraavaksi luodaan Java-luokat fragmentteja varten. Esimerkiksi FragmentOne ja FragmentTwo luokat perivät Fragment-luokan ja määrittelevät onCreateView-metodin, joka lataa oikean käyttöliittymän kummallekin fragmentille. Nämä fragmentit voidaan myöhemmin lisätä aktiiviteettiin ja vaihtaa niiden välillä ohjelmallisesti. Koodissa tämä näyttää seuraavalta:

java
public class FragmentOne extends Fragment {
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_one, container, false); } }

Näin ollen olemme luoneet yksinkertaisen fragmentin, joka on valmis liitettäväksi aktiiviteettiin.

Aktiiviteettiin tarvitsemme myös säilytyspaikan, jossa fragmentit voivat vaihtua. Tämä tapahtuu lisäämällä FrameLayout-säilö main_activity.xml-tiedostoon. Kun fragmentit ja säilö on määritelty, voimme kirjoittaa koodin, joka käsittelee fragmenttien siirtymistä.

java
FragmentOne mFragmentOne;
FragmentTwo mFragmentTwo; int showingFragment = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mFragmentOne = new FragmentOne(); mFragmentTwo = new FragmentTwo(); FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.add(R.id.frameLayout, mFragmentOne); fragmentTransaction.commit(); showingFragment = 1; }

Tässä vaiheessa olemme määritelleet, että alussa FragmentOne lisätään käyttöliittymään. Seuraavaksi käsitellään fragmenttien vaihtamista. Käyttäjä voi vaihtaa fragmenttia painamalla painiketta, mikä kutsuu seuraavaa metodia:

java
public void switchFragment(View view) {
FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); if (showingFragment == 1) { fragmentTransaction.replace(R.id.frameLayout, mFragmentTwo); showingFragment = 2; } else { fragmentTransaction.replace(R.id.frameLayout, mFragmentOne); showingFragment = 1; } fragmentTransaction.commit(); }

Tässä koodissa tarkistetaan, mikä fragmentti on tällä hetkellä näkyvissä, ja vaihdetaan se toiseen fragmenttiin käyttäjän pyynnöstä. Fragmenttien hallinta Androidissa on hyvin dynaamista, mutta se vaatii tarkkaa seurantaa siitä, mikä fragmentti on aktiivinen ja mitä sille pitäisi tapahtua.

Tärkeä asia, joka monesti jää huomiotta, on fragmenttien hallinta takaisin-näppäimen osalta. Jos fragmentit lisätään takaisin-pinoon addToBackStack()-kutsulla, käyttäjä voi palata aiemmin nähtyyn fragmenttiin takaisin-näppäintä painamalla. Tämä parantaa sovelluksen käytettävyyttä ja vastaa käyttäjän odotuksia siitä, että he voivat navigoida taaksepäin sovelluksessa, riippumatta siitä, ovatko he siirtyneet aktiviteeteista vai fragmentteista.

Lisäksi usein tarvitsemme tiedonsiirtoa fragmenttien välillä. Tavanomaisessa käytössä fragmentit eivät suoraan kommunikoi toistensa kanssa, koska se voi rikkoa koodin, jos fragmentteja ei ole saatavilla esimerkiksi vaihtuvan käyttöliittymän vuoksi. Sen sijaan tiedonsiirto tapahtuu aktiiviteetin kautta. Aktiiviteetti toimii välikätenä, joka huolehtii fragmenttien välistä viestintää, ja tätä varten luodaan yleensä rajapinta (interface), joka mahdollistaa tietojen välittämisen fragmenttien ja aktiiviteetin välillä. Näin voidaan välttää suoraa riippuvuutta fragmenttien välillä, mikä tekee sovelluksesta joustavamman ja helpommin ylläpidettävän.

Käytännön esimerkki on tilanne, jossa listan elementti valitaan yhdestä fragmentistä ja valittu elementti avautuu yksityiskohtien tarkasteluun toisessa fragmentissä. Tämä edellyttää viestintää fragmenttien välillä. Koska fragmentit itsessään eivät ole itsenäisiä sovelluksen osia ilman aktiiviteettia, niiden välinen kommunikointi on pakko kulkea aktiiviteetin kautta.

Kaiken kaikkiaan fragmenttien käyttö Android-sovelluksissa tarjoaa monia etuja, mutta niiden hallinta vaatii tarkkaa suunnittelua ja toteutusta. Fragmenttien välinen siirtyminen ja tiedonsiirto ovat keskeisiä elementtejä, jotka tekevät sovelluksesta responsiivisen ja käyttäjäystävällisen. Samalla on tärkeää ymmärtää, että fragmentit eivät ole erillisiä osia, vaan niiden toiminta perustuu aktiiviteettien ja fragmenttien yhteistyöhön.

Miten käyttää oletuskamerasovellusta Androidissa kuvan ottamiseen ja tallentamiseen

Kuvien ottaminen ja niiden käsittely Android-laitteilla on olennainen osa monia sovelluksia. Android tarjoaa monia tapoja käsitellä valokuvia, mutta yksi yksinkertaisimmista ja helpoimmista tavoista on käyttää laitteen oletuskamera-sovellusta. Tässä artikkelissa tarkastellaan, miten voidaan käyttää Androidin oletuskameraa kuvien ottamiseen ja tallentamiseen suoraan sovellukseen ilman, että käyttäjä tarvitsee erillisiä toimintoja. Tämä on kätevä lähestymistapa, kun halutaan hyödyntää laitteen sisäänrakennettuja ominaisuuksia ilman monimutkaisempia koodauksia.

Aloita luomalla uusi projekti Android Studioon ja nimeä se esimerkiksi "UsingTheDefaultCameraApp". Käytä oletusasetuksia ja valitse tyhjä aktiviteetti (Empty Activity). Tämä yksinkertainen projekti mahdollistaa sen, että käyttäjä voi napata valokuvan ja tallentaa sen julkiseen kansioon, josta se voidaan ladata tai näyttää myöhemmin.

Yksinkertaisen sovelluksen luominen

Ensimmäinen vaihe on luoda käyttöliittymä, joka sisältää kaksi pääkomponenttia: ImageView ja Button. Painike aktivoi kameran käynnistämisen ja valokuvan ottamisen. Kun kamera on ottanut kuvan, sovellus vastaanottaa palautteen ja näyttää kuvan ImageView-komponentissa.

  1. Android Manifestiin lisättävät oikeudet:
    Ensimmäiseksi täytyy lisätä tarvittavat oikeudet Android Manifestiin, jotta sovellus voi käyttää kameran toimintoa. Tässä tapauksessa tarvitaan vain kameraoikeus.

  2. Layoutin määrittäminen:
    Seuraavaksi avaa activity_main.xml ja vaihda olemassa oleva TextView seuraaviin komponentteihin:

    xml
    <ImageView
    android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Take Photo" android:onClick="takePicture"/>
  3. Globaalit muuttujat pääaktiviteetissa:
    MainActivity.java-tiedostossa tulee määritellä muutama globaali muuttuja, kuten PHOTO_RESULT ja URI, joka tallentaa otetun kuvan polun:

    java
    final int PHOTO_RESULT = 1;
    private Uri mLastPhotoURI = null;
  4. URI:n luominen kuvalle:
    Seuraavaksi määritellään menetelmä, joka luo URI:n valokuvan tallentamista varten. Tässä käytetään aikaleimaa tiedoston nimeämisessä, jotta vältetään nimikonfliktit.

    java
    private Uri createFileURI() { String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(System.currentTimeMillis());
    String fileName = "PHOTO_" + timeStamp + ".jpg";
    return Uri.fromFile(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), fileName)); }
  5. Valokuvan ottaminen:
    Seuraavaksi lisätään toiminto, joka käynnistää kameran. Tässä käytetään Intent-objektia, joka kutsuu laitteen oletuskameraa ja tallentaa kuvan määriteltyyn URI:in.

    java
    public void takePicture(View view) {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(getPackageManager()) != null) { mLastPhotoURI = createFileURI(); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mLastPhotoURI); startActivityForResult(takePictureIntent, PHOTO_RESULT); } }
  6. Kuvan käsittely ja näyttäminen:
    Kun kuva on otettu, se palautetaan sovellukseen onActivityResult()-menetelmän kautta. Tässä tarkistetaan, että käyttäjä on todella ottanut kuvan (ja ei ole perunut toimintoja) ja että kuva voidaan näyttää.

    java
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == PHOTO_RESULT && resultCode == RESULT_OK) { mImageView.setImageBitmap(BitmapFactory.decodeFile(mLastPhotoURI.getPath())); } }

Kuvaus ilman ulkoista tiedostoa

Jos ei ole väliä, mihin kuva tallennetaan, voi valokuvan ottaa ilman, että määritetään tiedoston sijaintia. Tällöin onActivityResult()-menetelmä palauttaa kuvan pikkukuvan (thumbnail), jonka voi näyttää seuraavasti:

java
if (data != null) {
imageView.setImageBitmap((Bitmap) data.getExtras().get("data")); }

Jos taas haluat ladata täyden resoluution kuvan, voit käyttää seuraavaa koodia:

java
if (data != null) { try { imageView.setImageBitmap(MediaStore.Images.Media.getBitmap(getContentResolver(), Uri.parse(data.toUri(Intent.URI_ALLOW_UNSAFE)))); } catch (IOException e) { e.printStackTrace(); } }

Oletusvideotallennus

Kameran lisäksi voidaan käyttää myös oletusvideotallennussovellusta. Tämä on melkein sama prosessi kuin kuvan ottaminen, mutta tässä käytetään MediaStore.ACTION_VIDEO_CAPTURE-intentiä videon tallentamiseksi. Videon URI saadaan samoin kuin kuvan URI.

java
Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

Kameran API:t: Vanha ja uusi

Vaikka edellinen esimerkki käyttää oletuskameraa, joskus saattaa olla tarpeen käyttää Androidin Camera API:ta. Tämä voi olla tarpeen, jos haluat enemmän kontrollia kameran toiminnoista. Android tarjoaa kaksi API:a: vanhan Camera API:n (API 1) ja uuden Camera2 API:n (API 21), joka tuli käyttöön Android 5.0:ssa.

Jos sovelluksessa halutaan tukea sekä vanhoja että uusia laitteita, kannattaa käyttää molempia API:ita. Androidin TextureView, joka tuli käyttöön API 14:ssa, mahdollistaa kameran esikatselun sekä vanhalla että uudella API:lla samalla tavalla.

Tärkeät huomiot

Androidin kameran käytön aikana on tärkeää huomioida, että käyttöoikeudet täytyy määritellä oikein sekä Manifestissa että mahdollisesti myös sovelluksen pyynnöissä käyttäjältä. Muista myös, että käyttöliittymän elementit, kuten ImageView ja Button, tarvitsevat oikeat tapahtumahandlerit ja resurssit, jotta sovellus toimii luotettavasti.

Jos sovelluksessa otetaan kuvia tai videoita, on suositeltavaa käsitellä myös mahdollisia virheitä ja käyttäjän peruutuksia (esimerkiksi jos kamera ei ole käytettävissä tai jos käyttäjä sulkee sovelluksen kesken toiminnon). Tämä parantaa käyttökokemusta ja varmistaa, että sovellus toimii luotettavasti eri tilanteissa.