Как правильно работать с фрагментами android

285
12 июня 2017, 20:44

Всем привет, сейчас пишу программу с большим количеством фрагментов и с одной активити. Суть в том, что в активити постоянно меняются местами фрагменты. Все это делается при помощи одного статического метода

MainPresenter.java

public static void changeFragmentWithInfo(Fragment fragment, boolean addToBackStack, boolean refresh,
                                      boolean hideToolbar, HashMap<String, Integer> info){
        String fragmentTag = fragment.getClass().toString();
        Log.d("mytag", "MainPresenter.changeFragmentWithInfo() fragmentTag = " + fragmentTag);
        if(!Settings.checkIfUserLogged()){
            if(fragmentTag.equals(DONATE_TAG)) {
                Toast.makeText(mainActivity, R.string.donate_first_register, Toast.LENGTH_LONG).show();
                Log.d("mytag", "MainPresenter.changeFragmentWithInfo() donate is blocked");
                return;
            }
        }
        if(!refresh){
            if(!backStackIsNull()) {
                FragmentManager.BackStackEntry lastEntry = fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount() - 1);
                currentFragmentTag = lastEntry.getName();
                Log.d("mytag", "MainPresenter.changeFragmentWithInfo() currentFragmentTag = " + currentFragmentTag);
                if(fragmentTag.equals(currentFragmentTag)){
                    Log.d("mytag", "MainPresenter.changeFragmentWithInfo() return in refresh check");
                    return;
                }
            }else{
                currentFragmentTag = null;
                Log.d("mytag", "MainPresenter.changeFragmentWithInfo() currentFragmentTag = null");
            }
        }

        fragmentTransaction = fragmentManager.beginTransaction();
        if(addToBackStack) {
            fragmentTransaction.addToBackStack(fragment.getClass().toString());
        }else {
            fragmentManager.popBackStack();
        }
        if(info != null) {
            Bundle args = new Bundle();
            args.putSerializable(ARG_INFO, info);
            fragment.setArguments(args);
        }
        changeToolbarVisibility(hideToolbar);
        fragmentTransaction.setTransition(TRANSIT_FRAGMENT_FADE);
        fragmentTransaction.replace(R.id.content, fragment);
        fragmentTransaction.commit();
    }
private static boolean backStackIsNull(){
    return fragmentManager.getBackStackEntryCount() == 0;
}

Settings.java

public static boolean checkIfUserLogged(){
    String userToken = UserTokenStorageFactory.instance().getStorage().get();
    return Backendless.UserService.CurrentUser() != null || userToken != null && !userToken.equals("");
}

Параметры входа на метод: fragment - новый фрагмент, который должен появиться вместо старого.

addToBackStack - Параметр, который определяет, будет ли добавлен новый фрагмент в backstack

refresh - Параметр, показывающий нужно ли в любом случае заменить старый фрагмент на новый, ведь фишка в том, что если новый фрагмент имеет тот же класс, что и старый, то замены не происходит. Однако, иногда нужно, чтобы фрагмент обновился. Если refresh == true то игнорируются все проверки схожести старого и нового фрагментов.

hideToolbar - Здесь все просто и без вопросов- если нужно, чтобы в новом фрагменте был спрятан тулбар- ставим true

info - Необходимая информация при передачи во фрагмент. Может быть null

В чем же проблема этого метода? Да в том, что все как-то очень геморно. Сейчас иногда возникает баг с наложением одного фрагмента на другой, не понимаю как фиксить. До этого уже несколько раз переписывал этот метод и все равно маялся. Как же это реализовано в профессиональных приложениях?

READ ALSO
Получить коды символов в строке

Получить коды символов в строке

Как у переменной типа string по индексу получить коды символов? Понятно что обращаться в цикле к индексуКак именно получить код и какой тип данных...

208
Скачать файл по прямой ссылке

Скачать файл по прямой ссылке

В android приложении по нажатию на кнопку должна начаться загрузка файла по прямой ссылке на загрузку файла( при открытии сразу предлагает сохранить...

632
Jenkins+(nexus\maven) через SSL

Jenkins+(nexus\maven) через SSL

Доброго времени сутокЕсть несколько Docker контейнеров с Jenkins, Nexus и Maven

257
Как ListIterator может участвовать во вставке элементов?

Как ListIterator может участвовать во вставке элементов?

Задание (part11task14) из книги "Talking in Java" B

289