Корисні шаблони дизайну для роботи з FragmentManager на Android


10

Працюючи з фрагментами, я використовував клас, що складається зі статичних методів, що визначають дії на фрагменти. У будь-якому проекті у мене може бути клас під назвою FragmentActions, який містить методи, подібні до наступного:

public static void showDeviceFragment(FragmentManager man){
    String tag = AllDevicesFragment.getFragmentTag();

    AllDevicesFragment fragment = (AllDevicesFragment)man.findFragmentByTag(tag);

    if(fragment == null){
        fragment = new AllDevicesFragment();
    }

    FragmentTransaction t = man.beginTransaction();
    t.add(R.id.main_frame, fragment, tag);

    t.commit();
}

Зазвичай у мене є один метод на екрані програми. Я щось подібне роблю, коли працюю з невеликими локальними базами даних (як правило, SQLite), тому застосовую його до фрагментів, які, схоже, мають аналогічний робочий процес; Я не одружений з цим, хоча.

Як ви організували свої програми для взаємодії з API Fragments, і які (якщо такі є) шаблони дизайну, на вашу думку, застосовують до цього?


1
Чому у вас є один клас, який відповідає за показ усіх видів фрагментів? Чи не повинен бути статичний метод всередині класу Fragment всередині?
Пьотр

Відповіді:


3

Прийнята модель полягає у встановленні заводського методу у вашому користувальницькому класі фрагментів (зазвичай його називають newInstance (), але вибору дилера). Отже ваш клас фрагментів повинен виглядати приблизно так:

public class MyFragment extends Fragment
{
    public static MyFragment newInstance()
    {
        MyFragment newFragment = new MyFragment();
        // add any bundle arguments here if needed
        return newFragment;
    }
    // rest of fragment class...
}

Потім, коли ви створюєте фрагмент і додаєте його в backstack, замість того, щоб сказати:

Фрагмент MyFragment = новий MyFragment ();

Ви можете використовувати заводський метод замість "нового" ключового слова.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.