Как показать фрагмент внутри определенного контейнера фрагментов в Android

#android #android-fragments

Вопрос:

Всякий раз, когда я хочу изменить фрагмент в зависимости от выбранного элемента, я использую: getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();

Но теперь я хочу сделать это, так что я могу просто показать разные фрагменты, вместо того чтобы создавать новые каждый раз, когда я повторно выбрать их, так что я нашел .show взамен .replace , но проблема .show заключается в том, что я не могу объявить, куда я хочу, что фрагмент будет показан… или, возможно, я, возможно, делаю это неправильно:

getSupportFragmentManager().beginTransaction().show(fragment).commit();

Ответ №1:

Если вы хотите использовать метод показать/скрыть, вам нужно добавить фрагмент перед этим, как вы можете видеть, контейнер доступен здесь. Я только что показал пример того, как показать или скрыть один фрагмент. Если у вас много фрагментов, вы можете, например, сохранить список, а затем скрыть другие в цикле. Если вам интересно, я добавил снизу.

 public void showFragment(Fragment fragment) {  FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();  if (fragment.isAdded()) {  fragmentTransaction.show(fragment);  } else {  fragmentTransaction.add(R.id.container, fragment);  }  fragmentTransaction.commit();  }   public void hideFragment(Fragment fragment) {  FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();  if (fragment.isAdded()) {  fragmentTransaction.hide(fragment);  }  fragmentTransaction.commit(); }  

Если есть много фрагментов

 public class MainActivity extends AppCompatActivity {   HashMaplt;String, Fragmentgt; fragments = new HashMaplt;gt;();   @Override  protected void onCreate(@Nullable Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  }   /*  * call this method when you want to add a new fragment  * Example: addFragment(new A(), "TAG_A")  * */  public void addFragment(Fragment fragment, String fragmentTag) {  FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();   /*Before add fragment we hide others*/  for (String fTag : fragments.keySet()) {  Fragment fragmentInStack = fragments.get(fTag);  if (fragmentInStack.isAdded() amp;amp; !fragmentInStack.isHidden()) {  fragmentTransaction.hide(fragmentInStack);  }  }   if (!fragment.isAdded()) {  fragments.put(fragmentTag, fragment);  fragmentTransaction.add(R.id.container, fragment, fragmentTag);  } else {  fragmentTransaction.show(fragment);  }   fragmentTransaction.commit();  }   /*  * call this method when you want to show fragment which are on the list  * Example: We have current fragment C and you want to show fragment A, that to call showFragment("TAG_A")  * */  public void showFragment(String fragmentTag) {  FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();   /*hide others fragment besides the one we need to show*/  for (String fTag : fragments.keySet()) {  Fragment fragmentInStack = fragments.get(fTag);  if (!fTag.equals(fragmentTag) amp;amp; fragmentInStack.isAdded()) {  fragmentTransaction.hide(fragmentInStack);  }  }   Fragment fragment = fragments.get(fragmentTag);  if (fragment != null amp;amp; fragment.isAdded()) {  fragmentTransaction.show(fragment);  }  fragmentTransaction.commit();  } }