android-fragmentsAan de slag met Android-fragmenten


Opmerkingen

Fragmenten zijn zeer belangrijke componenten van de gebruikersinterface in Android-apps. Ze werden als eerste geïntroduceerd in de Android 3.0 (Honeycomb) API.


Inzicht in het ontwerpparadigma van fragmenten

Fragmenten werden geïntroduceerd voor het ondersteunen van voornamelijk modulaire en flexibele gebruikersinterface op apparaten met een groot scherm zoals tablets.

Fragmenten worden beheerd door een activiteit. Gewoonlijk vertegenwoordigt elk fragment een deel van een scherm. Er kan meer dan één fragment in een activiteit zijn. Fragmenten kunnen ook subactiviteiten worden genoemd. Wanneer u een fragment toevoegt als onderdeel van uw activiteitenlay-out, leeft het in een ViewGroup binnen de weergavehiërarchie van de activiteit en definieert het fragment zijn eigen weergave-indeling.


LEVENSCYCLUS

Net als een activiteit hebben fragmenten ook een levenscyclus. Een fragment krijgt een melding voor volgende evenementen.

  1. Word gehecht aan activiteit - onAttach (Activiteit)
  2. Fragment maken - onCreate (bundel)
  3. View maken - onCreateView (LayoutInflater, ViewGroup, Bundle)
  4. Activiteit maken - onActivityCreated (bundel)
  5. Weergavestatus hersteld - onViewStateRestored (bundel)
  6. Zichtbaar gemaakt voor gebruiker - onStart ()
  7. begin van gebruikersinteractie - onResume ()
  8. pauze van gebruikersinteractie - onPause ()
  9. Onzichtbaar gemaakt voor gebruiker - onStop ()
  10. On view vernietiging - onDestroyView ()
  11. Fragment vernietigen - onDestroy ()
  12. Ontkoppelen van een activiteit - onDetach ()

Als programmeur moet u verschillende callback-methoden tijdens de levenscyclus overschrijven, meestal implementeren we de methoden onCreate (), onCreateView () en onPause ().


Subklassen van Fragment

  1. DialogFragment - Voor het weergeven van het zwevende dialoogvenster
  2. ListFragment - Voor het weergeven van een lijst met items
  3. PreferenceFragment - Handig voor het maken van instellingenactiviteit

Referenties

  1. https://developer.android.com/guide/components/fragments.html
  2. https://developer.android.com/reference/android/app/Fragment.html

Fragmenten toevoegen

Een fragment statisch toevoegen

Bestand: activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent" >  
  
    <fragment  
        android:id="@+id/fragment2"  
        android:name="com.example.fragmentexample.Fragment2"  
        android:layout_width="0px"  
        android:layout_height="match_parent"   
        android:layout_weight="1"  
        />  
  
    <fragment  
        android:id="@+id/fragment1"  
        android:name="com.example.fragmentexample.Fragment1"  
        android:layout_width="0px"  
        android:layout_height="match_parent"  
        android:layout_weight="1"  
         />  
  
</LinearLayout>  
 

Bestand: fragment1.xml

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical"  
    android:background="#00ff00"  
     >  
  
    <TextView  
        android:id="@+id/textView1"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="fragment frist"  
        android:textAppearance="?android:attr/textAppearanceLarge" />  
  
</LinearLayout>  
 

Bestand: fragment2.xml

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical"  
    android:background="#0000ff"  
     >  
  
    <TextView  
        android:id="@+id/textView1"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="Second Fragment"  
        android:textAppearance="?android:attr/textAppearanceLarge" />  
  
</LinearLayout>
 

Bestand: MainActivity.java

package com.example.fragmentexample;  
  
import android.os.Bundle;  
import android.app.Activity;  
import android.view.Menu;  
public class MainActivity extends Activity {  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
    }  
}  
 

Bestand: Fragment1.java

package com.example.fragmentexample;  
  
import android.app.Fragment;  
import android.os.Bundle;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.ViewGroup;  
  
public class Fragment1 extends Fragment {  
    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container,  
            Bundle savedInstanceState) {  
        // TODO Auto-generated method stub  
        return inflater.inflate(R.layout.fragment1,container, false);  
    }  
  
}  
 

Bestand: Fragment2.java

package com.example.fragmentexample;  
  
import android.app.Fragment;  
import android.os.Bundle;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.ViewGroup;  
  
public class Fragment2 extends Fragment {  
      
    public View onCreateView(LayoutInflater inflater, ViewGroup container,  
            Bundle savedInstanceState) {  
        // TODO Auto-generated method stub  
        return inflater.inflate(R.layout.fragment2,container, false);  
    }  
  
}  
 

Dynamisch een fragment toevoegen

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent" >  
  
    <FrameLayout  
        android:id="@+id/container1"   
        android:layout_width="0px"  
        android:layout_height="match_parent"   
        android:layout_weight="1"  
        />  
  
    <FrameLayout  
        android:id="@+id/container2"   
        android:layout_width="0px"  
        android:layout_height="match_parent"  
        android:layout_weight="1"  
         />  
  
</LinearLayout>
 

FrameLayout fungeert als fragmentcontainer.

MainActivity-klasse

Bestand: MainActivity.java

package com.example.fragmentexample;  
  
import android.os.Bundle;  
import android.app.Activity;  
import android.view.Menu;  
public class MainActivity extends Activity {  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        loadFragment(this, R.id.container1,new Fragment1(),"fragment1");
        loadFragment(this, R.id.container2,new Fragment2(),"fragment2");    
    }  

    public static void loadFragment(Activity activity, int containerId, Fragment fragment, String tag)
    {
        activity.getSupportFragmentManager().beginTransaction().
            replace(containerId, fragment,tag).commitAllowingStateLoss();
    }
}