#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);
}
}
Попробуйте это