Как получить фрагмент, чтобы удалить его, т.е. Его эквивалент 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() отделка().