【发布时间】:2014-11-19 08:14:40
【问题描述】:
我目前正在使用带有 Backstack 的 Fragment。 在其中一个片段中,例如“Menu”,当用户点击后退按钮时,我想提示一个警报对话框。但我在实现这一目标时遇到了一些问题。我在下面列出了我尝试过的两种情况。
场景 1:
我在“Menu”片段中添加了一个KeyListener,当用户点击返回按钮时会触发。
我在“Menu”之上添加了另一个名为“Report”的片段。当我在“Report”片段中按下返回按钮时,它仍然会提示在“Menu”片段中使用的alertDialog。 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:
在 MainActivity 类上使用 onBackPressed 方法。这将在“Menu”片段中提示一个 alertDialog。但是当它提示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,并且对其他片段没有任何影响。 请就这种方法提出建议。如果需要任何其他信息,请告诉我。
【问题讨论】:
-
请看一下我提供的解决方案stackoverflow.com/a/36475957/2753436
标签: android fragment back-stack onbackpressed