Android: замена фрагмента удаляет другой фрагмент

#android #android-fragments

#Android #android-фрагменты

Вопрос:

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

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

 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, чтобы избежать утечки памяти.
Вы можете мне помочь?

Комментарии:

1. Попробуйте добавить это в транзакцию фрагмента перед фиксацией // Add this transaction to the back stack .addToBackStack()

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

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

Ответ №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(); 
  

Попробуйте этот код для замены любого фрагмента

Ответ №2:

попробуйте этот способ:

создайте общий метод для добавления фрагментов в ваш контейнер, просто поместите этот код в свой метод и передайте свой фрагмент в этом методе, например:

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

Ответ №3:

 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);
    }

}
  

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