Релакс от активности к фрагменту - PullRequest
0 голосов
/ 08 января 2019

У меня BaseActivity , который имеет следующий поток: FragmentA -> Fragment B -> FinalActivity . Теперь я хочу backpress с нажатием кнопки возврата от FinalActivity до FragmentA .

С Базовая активность Я звоню Фрагмент A Как,

Fragment selectedFragment = FragmentA .newInstance();
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container_fragment, selectedFragment);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.addToBackStack("Some String");
transaction.commit();

С Фрагмент A Я звоню Фрагмент B Как,

Fragment selectedFragment = FragmentB.newInstance();
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container_fragment, selectedFragment);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.addToBackStack("Some String");
transaction.commit();

От Фрагмент B до FinalActivity Я звоню вот так

startActivityForResult(FinalActivity.newIntent(getActivity()), 1);

Теперь из FinalActivity кнопка возврата, которую я хочу показать FragmentA

Помогите мне, как ориентироваться.

Ответы [ 2 ]

0 голосов
/ 09 января 2019
Fragment selectedFragment = FragmentB.newInstance();
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container_fragment, selectedFragment);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.commit();

Если вы хотите вернуться к фрагменту A , вам не нужно добавлять строку, приведенную ниже
Когда отрывок фрагмента формы Фрагмент A К Фрагмент B Просто удалите данную строку формы из вашего кода

transaction.addToBackStack("Some String");

и поменяйте код начала активности Вот так

startActivity(getActivity(),FinalActivity.class);
0 голосов
/ 08 января 2019

Правильный способ сделать это, и поскольку у вас есть startActivityForResult(), это установить результат для действия и при его завершении передать информацию FragmentB. В вашем onBackPressed() методе вы можете добавить это:

Intent resultIntent = new Intent();
String dataString = "Some info you might want to return to the fragment...";
resultIntent.setData(Uri.parse(dataString));
setResult(RESULT_OK, resultIntent);
finish();

Затем в вашем FragmentB вы должны переопределить метод onActivityResult():

public void onActivityResult(int requestCode, int resultCode, Intent data) {
     if (requestCode == request_Code) {
        if (resultCode == RESULT_OK) {
            //here you can pop the FragmentB
        }
    }
}

Приведенный выше код завершит FinalActivity -> и передаст RESULT_OK методу onActivityResult() (который будет вызван в FragmentB ), а затем извлечет FragmentB, чтобы получить результат в отображаемом фрагменте.

РЕДАКТИРОВАТЬ: Обратите внимание, что вам потребуется код запроса из startActivityForResult(), чтобы он был таким же, как в onActivityResult(), в противном случае фрагмент не будет знать, какое действие вы пытаетесь получить , Вы можете добавить статическое глобальное значение, если хотите.

EDIT2: теперь, когда я вижу, в вашем коде у вас есть что-то вроде:

transaction.addToBackStack("Some String");

эта "какая-то строка" должна быть на самом деле Fragment.getName(), так что в backstack можно отследить, какие фрагменты там.

...