Android-Programmierung Fragment
Willemers Informatik-Ecke
Zurück zur Android-Hauptseite

Ein Fragment dient dazu, Activities zu untergliedern. Sie schreiben ein eigenes Fragment, indem Sie die Klasse Fragment erweitern.

Fragment anlegen

Das gleiche wiederholen wir für DownFragment.

Fragment-Java-Dateien

Das Java-Programm für ein Fragment wird zunächst auf die kleinstmögliche Größe reduziert.
public class TopFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_top, container, false);
    }
}

Fragment-Layout anpassen

Die automatisch erstellten XML-Dateien haben etwa folgendes Aussehen:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MeinFragment">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/hello_blank_fragment" />

</FrameLayout>
Über die values/strings.xml wird ein Text "Hello blank fragment" ausgegeben. Damit die beiden sichtbar unterscheidbar werden, tragen wir bei einem den Text ".Top", beim anderen ".Down" in das TextView ein.

Die Fragments haben unterschiedliche IDs, die unter tools:context zu sehen sind. Diese wurden bei der Erzeugung der Fragments erstellt: DownFragment und TopFragment.

Die Fragment-XML-Dateien werden in die Activity-XML eingebunden

In der Main-Activity-XML wird das Fragment als fragment eingetragen:
    <fragment
        android:id="@+id/.DownFragment"
        android:name="de.willemer.twofragments.DownFragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
Anschließend nörgelt der Designer, dass das fragment nicht mit Constraints an die Ränder angebunden wurde.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <fragment
        android:id="@+id/TopFragment"
        android:name="de.willemer.twofragments.TopFragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toTopOf="@id/DownFragment"
        />

    <fragment
        android:id="@+id/DownFragment"
        android:name="de.willemer.twofragments.DownFragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/TopFragment" />


Lifecycle eines Fragments

Fragmente nebeneinander im Landscape-Modus darstellen

Nun wollen wir erreichen, dass die Fragments beim Querlegen des Smartphones nicht mehr untereinander erscheinen, sondern nebeneinander und somit den Platz besser ausnutzen.

Dafür wird ein Main-XML-Layout benötigt, das aktiviert wird, wenn das Gerät im Landscape-Modus ist. Die Layouts für den Landscape-Modus werden statt im Verzeichnis res/layout im Verzeichnis res/layout-land abgelegt.

Das Verzeichnis bleibt im Projektbaum bei Android Studio unsichtbar, solange er im Android-Sicht ist. Wählen Sie aus der Klappbox über dem Projektbaum die Sicht Project Files aus. Nun ist das Verzeichnis res/layout-land zu sehen.

Erstellen Sie im Verzeichnis layout-land ein Layout, in dem die Fragmente nebeneinander stehen.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <fragment
        android:id="@+id/TopFragment"
        android:name="de.willemer.twofragments.TopFragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/DownFragment"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <fragment
        android:id="@+id/DownFragment"
        android:name="de.willemer.twofragments.DownFragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toEndOf="@id/TopFragment"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Fragments mit mehreren Elementen füllen

Wenn man die Fragment-XML mit der rechten Maustaste anklickt, kann man das automatisch erzeugte FrameLayout zu einem ConstraintLayout umwandeln lassen. Anschließend lassen sich leicht mehrere Kontrollelemente in dem Fragment ablegen.

Der Zugriff auf die Elemente in den Fragmenten können genauso von der Main-Activity bearbeitet werden, als lägen sie in der Layout-Datei der Main-Activity selbst.

Links