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