правильный способ сделать транзакцию фрагмента

Я разрабатываю приложение для Android с одним действием и несколькими фрагментами. Мое приложение содержит навигационный ящик. Его макет содержит список. Нажав на его элементы, я динамически меняю фрагменты с помощью ft.replace(R.id.my_placehodler, new MyFragment()) и добавляю транзакции к backstack ft.addToBackstack(null). когда я делаю новую транзакцию каждый раз, когда создаю новый фрагмент. Мне кажется, это не очень хороший подход. Можете ли вы дать мне предложения о правильном способе выполнения фрагментных транзакций?


person user3816018    schedule 03.12.2014    source источник
comment
Вы смотрели FragmentManager для переключения между фрагментами?   -  person epsilondelta    schedule 03.12.2014
comment
Нет, я не делал. Вы имеете в виду, что я должен отслеживать количество фрагментов в менеджере фрагментов?   -  person user3816018    schedule 03.12.2014


Ответы (2)


Просто вызовите метод setFragment(FragmentClassObject,false,"fragment");.

public void setFragment(Fragment fragment, boolean backStack, String tag) {
    manager = getSupportFragmentManager();
    fragmentTransaction = manager.beginTransaction();
    if (backStack) {
        fragmentTransaction.addToBackStack(tag);
    }
    fragmentTransaction.replace(R.id.content_frame, fragment, tag);
    fragmentTransaction.commit();
}
person Jaydeep    schedule 03.12.2014

Если вы хотите избежать создания нескольких экземпляров для одного и того же класса фрагментов, то есть вы хотите иметь один экземпляр для каждого класса фрагментов, вы можете распознавать каждый фрагмент с помощью тегов.

@Override
public void onNavigationDrawerItemSelected(int position) {
    String tag = "";
    switch (position) {
    case 0:
        tag = "fragment_0";
        break;
    case 1:
        tag = "fragment_1";
        break;
    case 2:
        tag = "fragment_2";
        break;
    }

    FragmentManager fragmentManager = getFragmentManager();
    Fragment fragment = fragmentManager.findFragmentByTag(tag);
    if (fragment == null) {
        // Only in case there is no already instaciated one,
        // a new instance will be instanciated.
        switch (position) {
        case 0:
            fragment = new Fragment_class_0();
            break;
        case 1:
            fragment = new Fragment_class_1();
            break;
        case 2:
            fragment = new Fragment_class_2();
            break;
        }
    }

    fragmentManager.beginTransaction().replace(R.id.container, fragment, tag).commit();
}
person hata    schedule 03.12.2014
comment
как я понял из вашего ответа, мне нужно просто установить тег для фрагмента, чтобы получить его из диспетчера фрагментов, если он уже создан. я прав? - person user3816018; 03.12.2014
comment
Не только настройка. Во-первых, установка тега для одного и того же класса (например, fragment_0 для Fragment_Class_1, fragment_1 для Fragment_Class_2 и т. д.). Во-вторых, поиск уже созданного объекта фрагмента, если он существует (findFragmentByTag). Если уже нет экземпляра объекта, будет создан новый объект класса. - person hata; 03.12.2014