Как получить фрагмент, чтобы удалить его, т.е. Его эквивалент finish()?
Я конвертирую приложение для использования фрагментов, используя библиотеку совместимости. Теперь в настоящее время у меня есть ряд действий (ABCD), которые связаны друг с другом, D имеет кнопку "ОК", которая при нажатии завершает вызовы, которая затем onActivityResult()
через onActivityResult()
чтобы дополнительно уничтожить C и B.
Для моей предварительной версии фрагмента Honycomb каждое действие фактически является оберткой для фрагментов Af Bf Cf Df. Все действия запускаются с помощью startActivityForResult()
и onActivityResult()
в каждом из фрагментов может getActivity().finish()
вызывать getActivity().finish()
Проблема, с которой я столкнулся, заключается в том, что в моей версии Honeycomb у меня есть только одно действие, A, и фрагменты Bf, Cf, Df загружаются с помощью FragmentManager
.
Что я не понимаю, что делать в Df, когда нажимается "OK" для удаления фрагментов Df, Cf и Bf?
Я попытался вытащить фрагмент из стека, но это привело к исключению. onActivityResult()
бесполезен, потому что я не загрузил фрагмент с помощью startActivityForResult()
.
Я думаю об этом совершенно неправильно? Должен ли я реализовать какой-то тип слушателя, который связывается с родительским фрагментом или действием, чтобы выполнить всплывающее окно с помощью диспетчера транзакций?
Ответы
Ответ 1
Я не понимаю, что делать в Df, когда нажата "ОК", чтобы удалить фрагменты Df, Cf и Bf?
Шаг # 1: Дайте Df сказать D "yo!, мы получили ОК нажмите!" посредством вызова метода, либо самого действия, либо экземпляра интерфейса, предоставленного активностью.
Шаг №2: Удалите D фрагменты с помощью FragmentManager
.
Хозяйственная деятельность (D) - это та, которая знает, какие другие фрагменты в действии (в отличие от других видов деятельности). Следовательно, события с фрагментами, которые могут повлиять на фрагмент-микс, должны быть переданы в действие, что приведет к соответствующим ходам оркестровки.
Ответ 2
Хотя это может быть не самый лучший подход, ближайший эквивалент, я могу думать о том, что это работает с помощью библиотеки поддержки/совместимости
getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();
или
getActivity().getFragmentManager().beginTransaction().remove(this).commit();
в противном случае.
Кроме того, вы можете использовать backstack и всплывать. Однако имейте в виду, что фрагмент, возможно, не находится в задней части (в зависимости от фрагментации, который получил его там.), Или это может быть не последний, который попал в стек, поэтому выталкивание стека может удалить неправильный...
Ответ 3
Вы можете использовать подход ниже, он отлично работает:
getActivity().getSupportFragmentManager().popBackStack();
Ответ 4
Вы должны позволить Управлению заниматься добавлением и удалением фрагментов, как говорит CommonsWare, использовать прослушиватель. Вот пример:
public class MyActivity extends FragmentActivity implements SuicidalFragmentListener {
// onCreate etc
@Override
public void onFragmentSuicide(String tag) {
// Check tag if you do this with more than one fragmen, then:
getSupportFragmentManager().popBackStack();
}
}
public interface SuicidalFragmentListener {
void onFragmentSuicide(String tag);
}
public class MyFragment extends Fragment {
// onCreateView etc
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
suicideListener = (SuicidalFragmentListener) activity;
} catch (ClassCastException e) {
throw new RuntimeException(getActivity().getClass().getSimpleName() + " must implement the suicide listener to use this fragment", e);
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Attach the close listener to whatever action on the fragment you want
addSuicideTouchListener();
}
private void addSuicideTouchListener() {
getView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
suicideListener.onFragmentSuicide(getTag());
}
});
}
}
Ответ 5
В Activity/AppCompatActivity:
@Override
public void onBackPressed() {
if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
// if you want to handle DrawerLayout
mDrawerLayout.closeDrawer(GravityCompat.START);
} else {
if (getFragmentManager().getBackStackEntryCount() == 0) {
super.onBackPressed();
} else {
getFragmentManager().popBackStack();
}
}
}
а затем вызовите фрагмент:
getActivity().onBackPressed();
или, как указано в других ответах, вызовите это в фрагменте:
getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();
Ответ 6
Посмотрите, удовлетворяются ли ваши потребности с помощью DialogFragment. DialogFragment имеет метод увольнения(). На мой взгляд, гораздо чище.
Ответ 7
Я создаю простой метод для этого
popBackStack(getSupportFragmentManager());
Разместите его в классе ActivityUtils
public static void popBackStack(FragmentManager manager){
FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0);
manager.popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
Он отлично работает, получайте удовольствие!
Ответ 8
Если вы используете новый компонент навигации, это просто, как
findNavController().popBackStack()
Он выполнит всю транзакцию FragmentTransaction за вами.
Ответ 9
Если вам нужно вернуться с четвертого фрагмента в истории backstack к первому, используйте теги !!!
Когда вы добавляете первый фрагмент, вы должны использовать что-то вроде этого:
getFragmentManager.beginTransaction.addToBackStack("A").add(R.id.container, FragmentA).commit()
или же
getFragmentManager.beginTransaction.addToBackStack("A").replace(R.id.container, FragmentA).commit()
И когда вы хотите показать фрагменты B, C и D, вы используете это:
getFragmentManager.beginTransaction.addToBackStack("B").replace(R.id.container, FragmentB, "B").commit()
и другие письма....
Чтобы вернуться к Fragment
A, просто вызовите popBackStack(0, "A")
, да, используйте флаг, который вы указали при его добавлении, и обратите внимание, что это должен быть тот же флаг в команде addToBackStack()
, а не тот, который используется в команде заменить или добавить.
Пожалуйста ;)
Ответ 10
OnCreate:
//Add comment fragment
container = FindViewById<FrameLayout>(Resource.Id.frmAttachPicture);
mPictureFragment = new fmtAttachPicture();
var trans = SupportFragmentManager.BeginTransaction();
trans.Add(container.Id, mPictureFragment, "fmtPicture");
trans.Show(mPictureFragment); trans.Commit();
Вот как я скрываю фрагмент в событии клика 1
//Close fragment
var trans = SupportFragmentManager.BeginTransaction();
trans.Hide(mPictureFragment);
trans.AddToBackStack(null);
trans.Commit();
Затем показывает его обратно в событии 2
var trans = SupportFragmentManager.BeginTransaction();
trans.Show(mPictureFragment); trans.Commit();
Ответ 11
Закрыть фрагмент внутри того же фрагмента
getActivity().onBackPressed();
Ответ 12
Почему бы просто:
getActivity() отделка().