В настоящее время я использую фрагмент с Backstack. В одном из фрагментов, например «» Меню «» «Я хотел вызвать подсказку, когда пользователь нажал кнопку« Назад ». Но у меня есть некоторые проблемы в достижении этого. Я перечислил два сценария ниже, которые я пробовал.Android Fragment onBackPressed display alertDialog
Сценарий 1:
Я добавил KeyListener в "меню" фрагмент, который срабатывает, когда пользователь постучал по задней кнопки.
Я добавляю еще один фрагмент сверху "Меню" под названием "Report". Когда я нажал кнопку «Report», фрагмент все равно запросит предупреждениеDialog, которое используется в «Menu». KeyListener по-прежнему активен в фоновом режиме.
Меню Фрагмент
rootView.setFocusableInTouchMode(true);
rootView.requestFocus();
rootView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction()!=KeyEvent.ACTION_DOWN)
return true;
switch (keyCode) {
case KeyEvent.KEYCODE_BACK :
Log.i("Menu", "onKey Back listener is working!!!");
new AlertDialog.Builder(getActivity())
.setTitle("Information")
.setMessage("Do you wish to exit from Menu Screen?")
.setNegativeButton("No", null)
.setPositiveButton("Yes",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
((MainActivity)getActivity()).selectItem(0, true);
}
}).create().show();
break;
}
return true;
}
});
Сценарий 2:
Использование onBackPressed метод на MainActivity класса. Это вызовет alertDialog в «Menu» фрагмент. Но в тот момент, когда он запрашивает alertDialog, этот фрагмент будет автоматически завершен, несмотря на то, что пользователю еще предстоит выбрать любую опцию alertDialog. Это может быть вызвано этим кодом getFragmentManager().addOnBackStackChangedListener(getListener());
. Но я не могу удалить этот код, поскольку он мне нужен для других фрагментов.
MainActivity.class
@Override
public void onBackPressed() {
FragmentManager manager = getFragmentManager();
if (manager != null) {
int backStackEntryCount = manager.getBackStackEntryCount();
Log.i(TAG, "backstackcount :"+backStackEntryCount);
FragmentManager fragmentManager = getFragmentManager();
if(getFragmentManager().getBackStackEntryCount()-1 >=0){
Fragment currentFragment = fragmentManager
.findFragmentByTag(fragmentManager.getBackStackEntryAt(getFragmentManager().getBackStackEntryCount()-1).getName());
Log.i(TAG, "class: "+currentFragment.getClass());
Log.i(TAG, "backstackCount: "+backStackEntryCount);
globalCurrentFragment = currentFragment;
if(currentFragment.getClass() == Master_Menu.class){
Log.i("currentFragment", "getClass = true");
new AlertDialog.Builder(MainActivity.this)
.setTitle("Information")
.setMessage("Do you wish to exit from Master Account session?")
.setNegativeButton("No", null)
.setPositiveButton("Yes",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
if (globalCurrentFragment != null) {
globalCurrentFragment.onResume();
}
}
}).create().show();
}
else{
if (globalCurrentFragment != null) {
globalCurrentFragment.onResume();
}
}
//if offer list
}else{
globalCurrentFragment = null;
selectItem(0, false);
}
}
super.onBackPressed();
}
Еще раз, я хотел подскажет alertDialog только в «Меню» фрагмента и не оказывают никакого влияния на другой фрагмент. Проконсультируйтесь с этим методом. Если есть какая-либо другая информация, пожалуйста, дайте мне знать.
Пожалуйста, посмотрите на решение я предусмотрел http://stackoverflow.com/a/36475957/2753436 – Praveen