2014-06-17 4 views
0

Я использую библиотеку поддержки Android и у меня есть 3 фрагмента активности. И у меня есть проблема: замена фрагмента удаляет другой фрагментAndroid: Замена фрагмента удаляет другой фрагмент

Моя активность:

public class MainActivity extends FragmentActivity { 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Add 3 fragments: 

     if (savedInstanceState == null) { 

      getFragmentManager().beginTransaction() 
        .add(R.id.container1, new A(), A.class.getCanonicalName()) 
        .commit(); 
      getFragmentManager().beginTransaction() 
        .add(R.id.container2, new B(), B.class.getCanonicalName()) 
        .commit(); 
      getFragmentManager().beginTransaction() 
        .add(R.id.container3, new C(), C.class.getCanonicalName()) 
        .commit(); 
     } 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     int id = item.getItemId(); 
     if (id == R.id.test) { 

      Fragment fragment = getFragmentManager(). 
        findFragmentByTag(A.class.getCanonicalName()); 
      if (fragment == null) 
       fragment = new A(); 

      // Replace fragment A again 
       getFragmentManager() 
         .beginTransaction() 
         .replace(R.id.container1, fragment, fragment.getClass().getCanonicalName()) 
         .commit(); 
      // After this fragment B disappears 


      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

} 

я использую findFragmentByTag, чтобы избежать утечки памяти. Вы можете мне помочь?

+0

Попробуйте добавить это к транзакции фрагмента, прежде чем совершить '// Добавить эту транзакцию в задний стек .addToBackStack()' –

+0

Не уверен, что ваш вопрос ясен, потому что вы делаете .replace так, как ожидалось, заменяемый предыдущий фрагмент , Теперь, когда @IonutNegru говорит, что проблема в том, что вы не можете вернуться назад, используйте addToBackStack, но вопрос не ясен. – HpTerm

+0

@HpTerm также прав, вы должны использовать add, чтобы избежать замены текущего фрагмента. Я пропустил это. Вы можете проверить официальную документацию на фрагменты. Также есть примеры для вашего случая. –

ответ

0

попробовать этот способ:

сделать общий Mathod добавить фрагменты в контейнере, просто поместите этот код в ваш метод и передать свой фрагмент в этом mehod, как:

public void _LoadFragment(Fragment _frag){ 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.add(R.id.container, _frag); 
    fragmentTransaction.addToBackStack(null); 
    fragmentTransaction.commit(); 
} 
1
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 

// Replace whatever is in the fragment_container view with this fragment, 
// and add the transaction to the back stack so the user can navigate back 
transaction.replace(R.id.fragment_container, newFragment); 
transaction.addToBackStack(null); 

// Commit the transaction 
transaction.commit(); 

Попробуйте этот код, чтобы заменить какой-либо фрагмент

0
public class MainActivity extends FragmentActivity { 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Add 3 fragments: 

     if (savedInstanceState == null) { 

      getFragmentManager().beginTransaction() 
        .add(R.id.container1, new A(), A.class.getCanonicalName()) 
        .commit(); 
      getFragmentManager().beginTransaction() 
        .add(R.id.container2, new B(), B.class.getCanonicalName()) 
        .commit(); 
      getFragmentManager().beginTransaction() 
        .add(R.id.container3, new C(), C.class.getCanonicalName()) 
        .commit(); 
     } 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     int id = item.getItemId(); 
     if (id == R.id.test) { 

      Fragment fragment = getFragmentManager(). 
        findFragmentByTag(A.class.getCanonicalName()); 
      if (fragment == null) 
       fragment = new A(); 

      // Replace fragment A again 

      // After this fragment B disappears 
FragmentManager fm = getFragmentManager(); 
      FragmentTransaction fragmentTransaction = fm.beginTransaction(); 
      fragmentTransaction.replace(R.id.container1, fragment); 
fragmentTransaction.addToBackStack(null); 
      fragmentTransaction.commit(); 

      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

} 

Попробуйте это

Смежные вопросы