Работа с фрагментами в Android (перегрузка)

plesser

Есть программа которая использует DrawerLayout, в которой из меню загружаются фрагменты (в зависимости от того куда нажмет пользователь).

Сам код загрузки фрагмента следующий:

public void loadFragment(Fragment fragmentTarget, String title) {
    if (fragmentTarget == null){
        return;
    }

    Log.d(TAG, "load fragment " + title);

    FragmentManager fm = getSupportFragmentManager();

    Fragment fragment = fm.findFragmentById(R.id.content_frame);
    if (fragment == null){
        fm.beginTransaction().add(R.id.content_frame, fragmentTarget).commit();
    } else {
        fm.beginTransaction().replace(R.id.content_frame, fragmentTarget)
                .addToBackStack(null).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).commit();
    }
    title = getString(R.string.app_name) + " " + title;

    getSupportActionBar().setTitle(title);

Собственно вопрос: Как избежать ситуации что бы пользователь нажав два раза подряд на один и тот же пункт меню не перезагрузжал фрагмент (сама по себе перезагрузка не так страшна, но то что этот фрагмент добавится в стэк не очень хорошо с точки зрения юзабилити)

update Я конечно могу в главной активности в переменной хранить имя загруженной текущего фрагмента, но мне кажется это не совсем правильно

1 ответ

plesser

Если вы так сильно боитесь перезагрузки фрагментов, то можете их скрывать и показывать, когда вам нужно, используя FragmentManager и название фрагмента(или иной определитель).

public void hideFragment(FragmentManager fragmentManager,String tag){
             fragmentManager.beginTransaction().hide(fragmentManager.findFragmentByTag(tag)).commit();     
}
public void showFragment(FragmentManager fragmentManager,String tag){
    fragmentManager.beginTransaction().show(fragmentManager.findFragmentByTag(tag)).commit();
}
public boolean isFound(FragmentManager fragmentManager,String tag){
    if (fragmentManager != null) {
        List<fragment> fragments = fragmentManager.getFragments();
        if (fragments != null) {
            for (int i = fragments.size() - 1; i >= 0; i--) {
                Fragment fragment = fragments.get(i);
                    if (fragment.getTag().equals(tag))
                        return true;
                }
            }
    }
    return false;
}
</fragment>

licensed under cc by-sa 3.0 with attribution.