私は現在、バックスタックでフラグメントを使用しています。「メニュー」などのフラグメントの1つでは、ユーザーが戻るボタンをタップしたときにアラートダイアログを表示したいと考えていました。しかし、私はそれを達成するためにいくつかの問題を抱えています。以下に、私が試した2つのシナリオをリストしました。
シナリオ 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();
}
繰り返しますが、「Menu」フラグメントでのみ alertDialog を促し、他のフラグメントには影響を与えないようにしたいと考えました。この方法についてアドバイスをお願いします。他に必要な情報がある場合は、お知らせください。