Android Academy · Oppitunti

Fragmentit

Rakentakaa modulaarisia käyttöliittymiä Fragmenteilla. Tutustukaa fragmentin elinkaareen, ViewBindingin käyttöön fragmenteissa, argumenttien välittämiseen, paluupinon hallintaan ja fragmentin sekä Activityn väliseen viestintään.

Oppitunti 6/713 vaihetta

Fragmentit on ilmainen Android Academy-oppitunti CoddyKitissä. Tämä on oppitunti 6/7. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Android Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Android Academy-kurssilla on yhteensä 7 oppituntia.

Mitä Fragmentit ovat?

Fragment on uudelleenkäytettävä käyttöliittymämoduuli, joka sijaitsee Activityn sisällä. Voit ajatella sitä alitoimintona, jolla on oma asettelu, elinkaari ja logiikka.

Miksi Fragmentteja käytetään?

  • Käyttöliittymän uudelleenkäyttö useissa Activityissä
  • Eri asettelujen käsittely puhelimille ja tableteille
  • Moninäyttöisten toimintoketjujen rakentaminen ilman useita Activityjä
  • Luonteva yhteensopivuus Navigation Componentin kanssa

Fragmentin elinkaari

Fragmenteilla on oma elinkaarensa, joka kulkee Activityn elinkaaren rinnalla. Tärkeät callback-metodit ovat:

  • onAttach — Fragment liitetään Activityyn
  • onCreate — Fragment luodaan (näkymää ei vielä ole)
  • onCreateView — asettelu muunnetaan näkymäksi
  • onViewCreated — näkymä on valmis; määritä käyttöliittymä tässä
  • onDestroyView — näkymä tuhotaan (tyhjennä näkymäviittaukset)
  • onDetach — Fragment irrotetaan

Fragmentin luominen

Luo Fragment-luokasta periytyvä luokka ja ylikirjoita onCreateView asettelun muuntamiseksi näkymäksi:

import androidx.fragment.app.Fragment
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup

class HomeFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_home, container, false)
    }
}

ViewBinding Fragm enteissa

Käytä ViewBindingia Fragmenteissa, mutta vapauta sidonta onDestroyView-metodissa muistivuotojen välttämiseksi:

class HomeFragment : Fragment() {

    private var _binding: FragmentHomeBinding? = null
    private val binding get() = _binding!!

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        _binding = FragmentHomeBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding.tvTitle.text = "Welcome!"
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null   // prevent memory leak
    }
}

Fragmentin asettelun XML

Luo res/layout/fragment_home.xml samalla tavalla kuin Activityn asettelu. Juurinäkymästä tulee Fragmentin näkymä:

<!-- res/layout/fragment_home.xml -->
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:text="Home" />

</LinearLayout>

Fragmentin lisääminen Activityyn

Fragmentin voi lisätä Activityyn kahdella tavalla:

  • Staattisesti (XML) — määritä se asettelussa <fragment>-tagilla. Kiinteä ajon aikana.
  • Dynaamisesti (koodilla) — käytä FragmentManager-luokkaa ja transaktioita. Fragmentin voi vaihtaa ajon aikana.
<!-- Static: in activity_main.xml -->
<fragment
    android:id="@+id/homeFragment"
    android:name="com.example.HomeFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Dynaamiset Fragment-transaktiot

Käytä supportFragmentManager-ominaisuutta Fragmenttien lisäämiseen, korvaamiseen tai poistamiseen ajon aikana:

// In Activity:
class MainActivity : AppCompatActivity(R.layout.activity_main) {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        if (savedInstanceState == null) {
            supportFragmentManager.beginTransaction()
                .add(R.id.fragmentContainer, HomeFragment())
                .commit()
        }
    }

    fun showDetail(id: Int) {
        supportFragmentManager.beginTransaction()
            .replace(R.id.fragmentContainer, DetailFragment.newInstance(id))
            .addToBackStack(null)  // allow back navigation
            .commit()
    }
}

Argumenttien välittäminen Fragmenteille

Välitä tietoja Bundle-olion avulla companion object -tehdasmallia käyttäen. Älä koskaan käytä parametreja sisältävää Fragment-konstruktoria – Android luo Fragmentit uudelleen parametrityhjiä konstruktoreita käyttäen määritysmuutosten jälkeen:

class DetailFragment : Fragment() {

    companion object {
        private const val ARG_ID = "item_id"

        fun newInstance(itemId: Int): DetailFragment {
            return DetailFragment().apply {
                arguments = Bundle().apply {
                    putInt(ARG_ID, itemId)
                }
            }
        }
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val itemId = requireArguments().getInt(ARG_ID)
        // use itemId to load data
    }
}

Fragmentin ja Activityn välinen viestintä

Käytä Fragmentissa määritettyä interfacea, jonka Activity toteuttaa. Fragment saa siihen viitteen onAttach-metodissa:

class ListFragment : Fragment() {

    interface OnItemSelected {
        fun onItemSelected(id: Int)
    }

    private var listener: OnItemSelected? = null

    override fun onAttach(context: Context) {
        super.onAttach(context)
        listener = context as? OnItemSelected
    }

    private fun handleClick(id: Int) {
        listener?.onItemSelected(id)
    }

    override fun onDetach() {
        super.onDetach()
        listener = null
    }
}

Takaisinpino

Kun kutsut transaktiossa addToBackStack(null)-metodia, Takaisin-painikkeen painaminen poistaa Fragmentin pinosta:

  • Ilman addToBackStack-metodia Takaisin poistuu Activitystä
  • addToBackStack-metodin kanssa Takaisin palaa edelliseen Fragmentiin
  • Käytä popBackStack()-metodia ohjelmalliseen paluuseen

Fragment säilössä

Activityn asettelu tarvitsee vain säilönäkymän – yleensä tunnisteella varustetun FrameLayout-näkymän. Fragment täyttää tämän säilön:

<!-- activity_main.xml -->
<FrameLayout
    android:id="@+id/fragmentContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Pikatarkistus

Miksi Fragmentille ei pitäisi koskaan välittää konstruktoriargumentteja, vaan käyttää companion factory -mallin kautta välitettyä Bundle-oliota?

Kertaus: Fragmentit

Fragmentit ovat modernien Android-käyttöliittymien rakennuspalikoita:

  • Periytä Fragment-luokasta ja muunna asettelu näkymäksi onCreateView-metodissa
  • Määritä käyttöliittymä onViewCreated-metodissa
  • Vapauta ViewBinding onDestroyView-metodissa
  • Välitä tietoja Bundle-olion ja companion factory -mallin avulla (newInstance)
  • Käytä addToBackStack-metodia paluunavigointiin
  • Viestitä Activityn kanssa interfacen avulla

Seuraavaksi: pyydä vaarallisia käyttöoikeuksia ajon aikana.

Aloita maksutta

Opi Kotlin tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
36
Oppitunnit
152

Usein kysytyt kysymykset

Onko oppitunti ”Fragmentit” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Android Academy-oppimispolun 3 oppituntia, myös oppitunnin “Fragmentit”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Android Academy-kurssilla on yhteensä 7 oppituntia.

Mitä opin oppitunnilla ”Fragmentit”?

Rakentakaa modulaarisia käyttöliittymiä Fragmenteilla. Tutustukaa fragmentin elinkaareen, ViewBindingin käyttöön fragmenteissa, argumenttien välittämiseen, paluupinon hallintaan ja fragmentin sekä Ac… Harjoittelet Android Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Android Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Android Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 6/7.

Kuinka kauan ”Fragmentit”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Android Academy-oppitunnilla?

Kyllä. Jokainen Android Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Projektin rakenne ja manifesti
  2. Aktiviteetit ja elinkaari
  3. Asettelu ja näkymät
  4. Käyttäjän syötteen käsittely
  5. Intentit ja navigointi
  6. Fragmentit
  7. Käyttöoikeudet ja ajonaikaiset pyynnöt
← Takaisin: Android Academy