2013-08-23 3 views
3

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

Я попытался

public void displayFragment(Fragment fragment){ 
    FragmentManager fm = getSupportFragmentManager(); 
    Fragment currentFragment = fm.findFragmentById(R.id.content_frame); 
    if(!currentFragment.equals(fragment)) 
     getSupportFragmentManager().beginTransaction().addToBackStack(null).replace(R.id.content_frame, fragment).commit(); 
} 

, но он не работает, и фрагмент будет изменен, даже если новый один такой же

раствор? Благодаря

EDIT

Решение:

public void displayFragment(Fragment fragment){ 
    FragmentManager fm = getSupportFragmentManager(); 
    Fragment currentFragment = fm.findFragmentById(R.id.content_frame); 
    if(!fragment.getClass().toString().equals(currentFragment.getTag())){ 
     getSupportFragmentManager() 
     .beginTransaction() 
     .addToBackStack(null) 
     .replace(R.id.content_frame, fragment, fragment.getClass().toString()) // add and tag the new fragment 
     .commit(); 
    } 
} 
+0

, если он находится в одном классе ?? – Piyush

ответ

6

Один из способов идентификации фрагментов, чтобы дать им метки:

public void displayFragment(Fragment fragment, String tag){ 
    FragmentManager fm = getSupportFragmentManager(); 
    Fragment currentFragment = fm.findFragmentById(R.id.content_frame); 
    if(!tag.equals(currentFragment.getTag()) 
     getSupportFragmentManager() 
     .beginTransaction() 
     .addToBackStack(null) 
     .replace(R.id.content_frame, fragment, tag) // add and tag the new fragment 
     .commit(); 
} 

редактирования: альтернативная версия от PSV ' s, используя имена классов как тег:

public void displayFragment(Fragment fragment){ 
    FragmentManager fm = getSupportFragmentManager(); 
    Fragment currentFragment = fm.findFragmentById(R.id.content_frame); 
    if(!fragment.getClass().toString().equals(currentFragment.getTag())) 
    { 
     getSupportFragmentManager() 
     .beginTransaction() 
     .addToBackStack(null) 
     .replace(R.id.content_frame, fragment, fragment.getClass().toString()) // add and tag the new fragment 
     .commit(); 
    } 
} 
+1

Да! Большое спасибо ! И чтобы не помещать тег каждый раз, когда я меняю фрагмент, я изменил ваш код в public void displayFragment (фрагмент фрагмента) { \t FragmentManager fm = getSupportFragmentManager(); \t Фрагмент currentFragment = fm.findFragmentById (R.id.content_frame); \t если (! Fragment.getClass(). ToString(). Равно (currentFragment.getTag())) { \t getSupportFragmentManager() \t .beginTransaction() \t .addToBackStack (нуль) \t .Надеть (R. id.content_frame, фрагмент, фрагмент.getClass(). toString()) // добавляет и помещает новый фрагмент \t .commit(); \t} \t} – psv

+0

Или вы могли бы просто использовать 'instanceof'? Будь проще. –

0

на основе @ Alex-фу комментарий, код должен быть что-то вроде этого:

public void displayFragment(Fragment fragment){ 

    FragmentManager fm = getSupportFragmentManager(); 
    Fragment currentFragment = fm.findFragmentById(R.id.content_frame); 

    if(!(fragment instanceof currentFragment)) { 
     getSupportFragmentManager() 
      .beginTransaction() 
      .addToBackStack(null) 
      .replace(R.id.content_frame, fragment, fragment.getClass().toString()) // add and tag the new fragment 
      .commit(); 
    } 
} 
Смежные вопросы