Specializované třídy fragmentů

Rozhraní API fragmentů poskytuje další podtřídy, které zapouzdřují některé běžné funkce, které se v aplikacích nacházejí. Tyto podtřídy jsou:

  • ListFragment – tento fragment slouží k zobrazení seznamu položek vázaných na zdroj dat, jako je pole nebo kurzor.

  • DialogFragment – tento fragment se používá jako obálka kolem dialogového okna. Fragment zobrazí dialogové okno nad aktivitou.

  • PreferenceFragment – tento fragment slouží k zobrazení objektů Preference jako seznamů.

Objekt ListFragment

v konceptu a funkčnosti je velmi podobný ; jedná se ListFragment o obálku, ListActivity která hostuje v ListView fragmentu. Následující obrázek ukazuje ListFragment běžící na tabletu a telefonu:

Snímky obrazovky s objektem ListFragment na tabletu a na telefonu

Vytvoření vazby dat s objektem ListAdapter

Třída ListFragment již poskytuje výchozí rozložení, takže není nutné přepsat k zobrazení obsahu OnCreateViewListFragment . Objekt ListView je svázán s daty pomocí ListAdapter implementace. Následující příklad ukazuje, jak to lze provést pomocí jednoduchého pole řetězců:

public override void OnActivityCreated(Bundle savedInstanceState)
{
    base.OnActivityCreated(savedInstanceState);
    string[] values = new[] { "Android", "iPhone", "WindowsMobile",
                "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
                "Linux", "OS/2" };
    this.ListAdapter = new ArrayAdapter<string>(Activity, Android.Resource.Layout.SimpleExpandableListItem1, values);
}

Při nastavování ListAdapter objektu je důležité použít vlastnost , a ne vlastnost ListFragment.ListAdapterListView.ListAdapter . Použití ListView.ListAdapter příkazu způsobí vynechání důležitého inicializačního kódu.

Reakce na výběr uživatele

Aby bylo možné reagovat na výběry uživatelů, musí aplikace přepsat OnListItemClick metodu . Následující příklad ukazuje jednu takovou možnost:

public override void OnListItemClick(ListView l, View v, int index, long id)
{
    // We can display everything in place with fragments.
    // Have the list highlight this item and show the data.
    ListView.SetItemChecked(index, true);

    // Check what fragment is shown, replace if needed.
    var details = FragmentManager.FindFragmentById<DetailsFragment>(Resource.Id.details);
    if (details == null || details.ShownIndex != index)
    {
        // Make new fragment to show this selection.
        details = DetailsFragment.NewInstance(index);

        // Execute a transaction, replacing any existing
        // fragment with this one inside the frame.
        var ft = FragmentManager.BeginTransaction();
        ft.Replace(Resource.Id.details, details);
        ft.SetTransition(FragmentTransit.FragmentFade);
        ft.Commit();
    }
}

Když uživatel ve výše uvedeném kódu vybere položku v objektu , zobrazí se v aktivitě hostování nový fragment, který zobrazí další podrobnosti o vybrané ListFragment položce.

DialogFragment

DialogFragment je fragment, který slouží k zobrazení objektu dialogového okna uvnitř fragmentu, který bude plovoucí nad oknem aktivity. Má nahradit rozhraní API spravovaných dialogů (počínaje Androidem 3.0). Následující snímek obrazovky ukazuje příklad DialogFragment :

Snímek obrazovky dialogového oknaFragmentace zobrazující pole Pro úpravy nových vozidel

Zajistí, že stav mezi fragmentem a dialogem DialogFragment zůstane konzistentní. Všechny interakce a ovládání objektu dialogového okna by měly pro dojít prostřednictvím rozhraní API a neměly by být provedeny pomocí přímých volání DialogFragment objektu dialogového okna. Rozhraní DialogFragment API poskytuje každé instanci Show() metodu, která slouží k zobrazení fragmentu. Fragment se můžete zbavit dvěma způsoby:

  • Volejte DialogFragment.Dismiss() na DialogFragment instanci .

  • Zobrazí další DialogFragment .

Chcete-li DialogFragment vytvořit , třída dědí z a potom Android.App.DialogFragment, přepíše jednu z následujících dvou metod:

  • OnCreateView – vytvoří a vrátí zobrazení.

  • OnCreateDialog – tím se vytvoří vlastní dialogové okno. Obvykle se používá k zobrazení alertDialog. Při přepisování této metody není nutné přepsat OnCreateView .

Jednoduchý dialogFragment

Následující snímek obrazovky ukazuje jednoduchý DialogFragment snímek obrazovky, který má a TextView dva Button y:

Příklad dialogové fragmentace s objektem TextView a dvěma tlačítky

Se zobrazí počet, kolikrát uživatel klikl na jedno tlačítko v , zatímco kliknutí na druhé tlačítko TextViewDialogFragment zavře fragment. Kód pro DialogFragment je:

public class MyDialogFragment : DialogFragment
{
    private int _clickCount;
    public override void OnCreate(Bundle savedInstanceState)
    {
        _clickCount = 0;
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState)
        
        var view = inflater.Inflate(Resource.Layout.dialog_fragment_layout, container, false);
        var textView = view.FindViewById<TextView>(Resource.Id.dialog_text_view);
            
        view.FindViewById<Button>(Resource.Id.dialog_button).Click += delegate
            {
                textView.Text = "You clicked the button " + _clickCount++ + " times.";
            };

        // Set up a handler to dismiss this DialogFragment when this button is clicked.
        view.FindViewById<Button>(Resource.Id.dismiss_dialog_button).Click += (sender, args) => Dismiss();
        return view;
        }
    }
}

Zobrazení fragmentu

Podobně jako všechny DialogFragment fragmenty se v kontextu objektu FragmentTransaction zobrazí .

Metoda Show() u přebírá jako vstup a DialogFragmentFragmentTransactionstring . Dialogové okno bude přidáno do aktivity a FragmentTransaction potvrzeno.

Následující kód ukazuje jeden z možných způsobů, jak může aktivita Show() pomocí metody zobrazit DialogFragment :

public void ShowDialog()
{
    var transaction = FragmentManager.BeginTransaction();
    var dialogFragment = new MyDialogFragment();
    dialogFragment.Show(transaction, "dialog_fragment");
}

Zavření fragmentu

Volání na instanci objektu způsobí odebrání fragmentu z aktivity Dismiss() a potvrdí tuto DialogFragment transakci. Budou volány standardní metody životního cyklu fragmentů, které jsou součástí zničení fragmentu.

Dialogové okno výstrahy

Místo přepsání OnCreateView může přepsat DialogFragmentOnCreateDialog . To umožňuje aplikaci vytvořit AlertDialog, který je spravován fragmentem. Následující kód je příklad, který používá AlertDialog.Builder k vytvoření Dialog :

public class AlertDialogFragment : DialogFragment
{
    public override Dialog OnCreateDialog(Bundle savedInstanceState)
    {
        EventHandler<DialogClickEventArgs> okhandler;
        var builder = new AlertDialog.Builder(Activity)
            .SetMessage("This is my dialog.")
            .SetPositiveButton("Ok", (sender, args) =>
                                         {
                                             // Do something when this button is clicked.
                                         })
            .SetTitle("Custom Dialog");
        return builder.Create();
    }
}

PreferenceFragment

Rozhraní API fragmentů poskytuje podtřídu, která pomáhá se spravovat PreferenceFragment předvolby. PreferenceFragmentSe podobá PreferenceFragment – zobrazí hierarchii předvoleb pro uživatele v fragmentu. Když uživatel komunikuje s předvolbami, automaticky se uloží do SharedPreferences. V aplikacích pro Android 3.0 nebo vyšších použijte k řešení PreferenceFragment předvoleb v aplikacích . Následující obrázek ukazuje příklad PreferenceFragment :

Příklad PreferencesFragment s vloženými, dialogy a předvolbou spuštění

Vytvoření fragmentu předvoleb z prostředku

Předvolbu Fragment lze nafouknout ze souboru prostředků XML pomocí metody PreferenceFragment.AddPreferencesFromResource. Logické místo pro volání této metody v životním cyklu fragmentu by bylo v OnCreate metodě .

Výše PreferenceFragment uvedený obrázek byl vytvořen načtením prostředku z XML. Soubor prostředků je:

<?xml version="1.0" encoding="utf-8"?>

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

  <PreferenceCategory android:title="Inline Preferences">
    <CheckBoxPreference android:key="checkbox_preference"
                        android:title="Checkbox Preference Title"
                        android:summary="Checkbox Preference Summary" />

  </PreferenceCategory>

  <PreferenceCategory android:title="Dialog Based Preferences">

    <EditTextPreference android:key="edittext_preference"
                        android:title="EditText Preference Title"
                        android:summary="EditText Preference Summary"
                        android:dialogTitle="Edit Text Preferrence Dialog Title" />

  </PreferenceCategory>

  <PreferenceCategory android:title="Launch Preferences">

    <!-- This PreferenceScreen tag serves as a screen break (similar to page break
             in word processing). Like for other preference types, we assign a key
             here so it is able to save and restore its instance state. -->
    <PreferenceScreen android:key="screen_preference"
                      android:title="Title Screen Preferences"
                      android:summary="Summary Screen Preferences">

      <!-- You can place more preferences here that will be shown on the next screen. -->

      <CheckBoxPreference android:key="next_screen_checkbox_preference"
                          android:title="Next Screen Toggle Preference Title"
                          android:summary="Next Screen Toggle Preference Summary" />

    </PreferenceScreen>

    <PreferenceScreen android:title="Intent Preference Title"
                      android:summary="Intent Preference Summary">

      <intent android:action="android.intent.action.VIEW"
              android:data="http://www.android.com" />

    </PreferenceScreen>

  </PreferenceCategory>

</PreferenceScreen>

Kód pro předvolbu Fragment je následující:

public class PrefFragment : PreferenceFragment
{
    public override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        AddPreferencesFromResource(Resource.Xml.preferences);
    }
}

Dotazování aktivit pro vytvoření fragmentu předvoleb

Další technika pro vytvoření PreferenceFragment zahrnuje dotazování aktivit. Každá aktivita může používat atribut METADATA_KEY_PREFERENCE, který bude odkazovat na soubor prostředků XML. V Xamarin.Android se to provádí tak, že se k aktivitě přidá a pak se určí soubor prostředků, který MetaDataAttribute se má použít. Třída PreferenceFragment poskytuje metodu PreferenceFragment kterou lze použít k dotazování aktivity k vyhledání tohoto prostředku XML a nafouknutí hierarchie předvoleb pro něj.

Příklad tohoto procesu je k dispozici v následujícím fragmentu kódu, který používá AddPreferencesFromIntent k vytvoření PreferenceFragment :

public class MyPreferenceFragment : PreferenceFragment
{
    public override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        var intent = new Intent(this.Activity, typeof (MyActivityWithPreferences));
        AddPreferencesFromIntent(intent);
    }
}

Android se podívá na třídu MyActivityWithPreference . Třída musí být uvedená jako , MetaDataAttribute, jak je znázorněno v následujícím fragmentu kódu:

[Activity(Label = "My Activity with Preferences")]
[MetaData(PreferenceManager.MetadataKeyPreferences, Resource = "@xml/preference_from_intent")]
public class MyActivityWithPreferences : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        // This is deliberately blank
    }
}

MetaDataAttributeDeklaruje soubor prostředků XML, PreferenceFragment který bude používat k nafouknutí hierarchie předvoleb. Pokud MetatDataAttribute není k dispozici, bude vyvolána výjimka za běhu. Při spuštění tohoto kódu se PreferenceFragment zobrazí jako na následujícím snímku obrazovky:

Snímek obrazovky s ukázkou aplikace se zobrazenou předvolbou PreferenceFragment