Как реализовать onBackPressed во Фрагменте?
В своем приложении использую архитектуру Single Activity.
Есть два фрагмента. Во втором фрагменте, если были внесены изменения в полях, при нажатии на кнопку "Назад" в ToolBar, необходимо вызвать AlertDialog.
Я попытался реализовать это через onOptionsItemSelected, но данный код не возымел результата:
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == android.R.id.home) {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext())
.setMessage("Были внесены изменения.")
.setCancelable(false)
.setPositiveButton("Да", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//действия, если да
}
});
builder.setNegativeButton("Нет", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//действия, если нет
}
}).create().show();
}
}
Немного почитав по этому поводу, я наткнулся на один вариант. В нем говорится, что нужно создать интерфейс IOnBackPressed, затем переопределить метод onBackPressed в Activity и в завершении реализовать метод интерфейса во фрагменте. Первые два пункта не вызвали затруднений, в отличии от последнего.
Создание интерфейса:
public interface IOnBackPressed {
boolean onBackPressed();
}
Переопределение onBackPressed в Activity
public class MyActivity extends Activity {
@Override public void onBackPressed() {
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.main_container);
if (!(fragment instanceof IOnBackPressed) || !((IOnBackPressed) fragment).onBackPressed()) {
super.onBackPressed();
}
} ...
}
Реализация метода интерфейса во Фрагменте:
Никак не могу понять, что за загадочное myCondition.
public class MyFragment extends Fragment implements IOnBackPressed{
@Override
public boolean onBackPressed() {
if (myCondition) {
//action not popBackStack
return true;
} else {
return false;
}
}
}
Помогите, пожалуйста, разобраться в сложившейся ситуации или подскажите другое решение задачи. Спасибо!
Ответы (2 шт):
Вы должны вернуть true или false из вашего метода onBackPressed().
если вы вернете
trueтоonBackPressed()обработает фрагмент и тот код который будет вActivityвonBackPressed()не выполнится.если вы вернете
falseто тот код который будет у вас в фрагменте проигнорируется. А выполнится код изActivity.
myCondition - это просто любой ваш предикат по которому функция поймет стоит ли обрабатывать это действие во фрагменте. Вы можете и не вызывать никаких if(myCondition), а всегда возвращать true, но если вам нужна какая-то логика которую должна в каких-то случаях обрабатывать Activity, то вы должны вернуть false.
Можно вот так обрабатывать OnBackPressed во фрагменте. Добавить в onViewCreated.
Kotlin:
val callback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
// обработайте здесь
}
}
activity?.onBackPressedDispatcher?.addCallback(viewLifecycleOwner, callback)
Java:
OnBackPressedCallback callback = new OnBackPressedCallback(true ) {
@Override
public void handleOnBackPressed() {
// обработайте здесь
}
};
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), callback);