2015-06-28 7 views
1

У меня есть два fragment классов и две кнопки в панели приложений - каждая кнопка делает одно из следующих действий:Как переключить два фрагмента в одном действии?

  1. проверки если fragment от других классов существует
  2. если существует, замените контейнер с новым экземпляр его fragment класса
  3. , если не существует создать новый экземпляр своего fragment класса

Вот пример кода:

private void openReader() { 

    FragmentManager fragmentManager = getFragmentManager(); 

    ArticleListFragment fragmentList = (ArticleListFragment) fragmentManager.findFragmentById(R.id.action_list); 
    ArticleReaderFragment fragmentReader = (ArticleReaderFragment) fragmentManager.findFragmentById(R.id.action_reader); 

    if (fragmentReader==null || ! fragmentReader.isInLayout()) { 

     if (fragmentList==null || ! fragmentList.isInLayout()) { 

      FragmentTransaction ft = fragmentManager.beginTransaction(); 
      ft.add(R.id.container_id, new ArticleReaderFragment()); 
      //ft.addToBackStack(null); 
      ft.commit(); 

     } else { 

      FragmentTransaction ft = fragmentManager.beginTransaction(); 
      ft.replace(R.id.container_id, new ArticleReaderFragment()); 
      //ft.addToBackStack(null); 
      ft.commit(); 

     } 
    } 
    else { 
     // fragment.update(...); 
    } 

} 

и вот activity XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/welcome_page"> 

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/container_id"> 

    </FrameLayout> 

</LinearLayout> 

Вопрос заключается в том, что функция replace не destroying старый fragment класс - это добавляет все больше и больше фрагментов по сравнению друг с другом, как кнопки щелкают ,

Может ли кто-нибудь сказать, что я делаю неправильно?

ответ

0

Я сделал много ошибок:

  1. Я не указанный идентификатор фрагментов
  2. Поскольку я не в состоянии установить фрагмент ID динамически, мне нужно использовать тег вместо

    ft.replace(R.id.container_id, new ArticleListFragment(), "Action_list"); 
    

    или

    ft.add(R.id.container_id, new ArticleListFragment(), "Action_list"); 
    
  3. Мне нужно использовать только findFragmentByTag(), так как isInLayout() всегда дает мне ложь.

Вот рабочая версия функции:

private void openList() { 

     FragmentManager fragmentManager = getFragmentManager(); 

     ArticleListFragment fragmentList = (ArticleListFragment) fragmentManager.findFragmentByTag("Action_list"); 
     ArticleReaderFragment fragmentReader = (ArticleReaderFragment) fragmentManager.findFragmentByTag("Action_reader"); 

     if (fragmentList==null) { 

      if (fragmentReader==null) { 

       FragmentTransaction ft = fragmentManager.beginTransaction(); 
       ft.add(R.id.container_id, new ArticleListFragment(), "Action_list"); 
       //ft.addToBackStack(null); 
       ft.commit(); 

      } else { 

       FragmentTransaction ft = fragmentManager.beginTransaction(); 
       ft.replace(R.id.container_id, new ArticleListFragment(), "Action_list"); 
       //ft.addToBackStack(null); 
       ft.commit(); 

      } 
     } 
     else { 
      // fragment.update(...); 
     } 
    } 
Смежные вопросы