Учитывая, что этот вопрос имеет более 2 КБ. Ответ может все еще помочь новым читателям, поэтому здесь он идет:
- Вы действительно не хотите, чтобы FragmentManager и FragmentTransactions происходили внутри фрагментов, чтобы не иметь броскии потенциальные вредные ссылки на ваши действия
Итак, что я делаю и отлично работаю, так это установил интерфейс для фрагмента и дал метод, скажем needsHide ():
public class MyFrag extends Fragment {
public interface MyFragInterface {
public void needsHide();
}
Затем реализуйте это в своей Деятельности:
public class MainActivity extends FragmentActivity implements MyFrag.MyFragInterface {
public void needsHide() {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
//find the fragment by View or Tag
MyFrag myFrag = (MyFrag)fragmentManager.findFragmentByTag(SOME_TAG);
fragmentTransaction.hide(myFrag);
fragmentTransaction.commit();
//do more if you must
}}
Единственная часть, которая требует обдумывания, - это когда нужно вызвать needsHide (), это вы можете сделать в onViewCreated вашего Фрагмента, поскольку вы уверены, что это не слишкомрано для вашей MainActivity совершать транзакции.Если вы поместите его в функцию Create (), он может не работать в зависимости от того, что вы делаете с другими фрагментами:
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
// Making sure Main activity implemented interface
try {
if (USE_A_CONDITION) {
((MyFragInterface)this.getActivity()).needsHide();
}
} catch (ClassCastException e) {
throw new ClassCastException("Calling activity must implement MyFragInterface");
}
super.onViewCreated(view, savedInstanceState);
}