Fragment je posebna klasa koja predstavlja aktivnost u korisničkom interfejsu. Fragmenti se koriste da se jedna velika aktivnost razbije na više manjih aktivnosti. Ovo može biti korisno iz raznih razloga. Jednom napisan Fragment može da se koristi više puta u aplikaciji. Osim toga, kada se korisnički interfejs razloži na logične celine, lakše se njima upravlja. Recimo, u situaciji kada bismo želeli da raspoređujemo određene sekcije u zavisnosti od veličine ekrana, lakše je to uraditi ako se te sekcije podele na logičke celine. Korisnički interfejs je lakše uređivati tokom izvršavanja programa ako je podeljen na fragmente.
Da bi fragmenti mogli da se koriste, moramo ih prvo uključiti u Gradle skriptu. Otvoriti build.gradle skript u direktorijumu app i dodati sledeće linije koda tako da skript sada ima ovu formu:
buildscript { ... repositories { google() ... } } allprojects { repositories { google() ... } }
Kada to uradimo, moramo pronaći deo dependencies i dodati sledeće:
def fragment_version = "1.4.0" // Kotlin implementation "androidx.fragment:fragment-ktx:$fragment_version"
Za kreiranje fragmenta su potrebne dve stvari: opis našeg fragmenta u XML-u i potklasa klase Fragment koja će definisati ponašanje našeg fragmenta. Postoje razni načini da se napravi klasa, a to zavisi i od upotrebe fragmenta. Jednostavnosti radi, prikazaćemo kako bi to izgledalo na jednostavnom fragmentu koji izdvaja naslov aplikacije. Sledeći kod definiše klasu TitleFragment sa metodom onCreateView.
class TitleFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val binding = DataBindingUtil.inflate(inflater, R.layout.fragment_title,container,false) naredbe... return binding.root } }
U opštem slučaju, glavnom konstruktoru natklase smo mogli proslediti XML fajl u kojem je definisan fragment. Pošto ćemo naš fragment definisati unutar activity_main.xml, nema potrebe za tim. Metod inflate radi sličnu stvar kao i setContentView. Pošto je fragment u pitanju, onda se koristi metod inflate. Taj metod prima četiri argumenta: inflater, XML resurs sa kojeg uzima podatke o fragmentu, container koji nosi roditeljski ViewGroup (ovaj parametar je opcioni) i vrednost attachToParent koja je tipa Boolean. Vrednost binding.root je ono što se dobija nakon što se izvrši metod inflate i njega vraćamo kao povratnu vrednost. Moguće je u delu naredbe... definisati ponašanje fragmenta.
Nakon što se napravi klasa, potrebno je definisati fragment u XML-u. Dakle, pozicioniramo se na naš activity_main.xml i onda unutar njega definišemo fragment na sledeći način:
<fragment android:id="@+id/titleFragment" android:name="com.example.android.navigation.TitleFragment" android:layout_width="..." android:layout_height="..." .... />
Ovde je ključni argument android:name. Njegova vrednost je ime klase (sa sve paketima u kojima se nalazi) koja se vezuje za fragment. Na ovaj način je fragment povezan sa glavnim prozorom. Kada treba dodati novu funkcionalnost, dovoljno je samo dodati novi fragment ili izmeniti postojeće, dok će glavni prozor izgledati isto. Takođe, ovo nam omogućava da i u drugim prozorima isti fragment koristimo samo ako ga navedemo u XML fajlu tog prozora.