ポップアップウィンドウが表示されたときにバックプレスを処理したい。注意してそれを却下したい場合もあれば、ポップアップウィンドウでいくつかのタスクを実行したくない場合もあります。
ポップアップ ウィンドウが表示されている場合、Activity onBackPress は呼び出されません。では、ポップアップ ウィンドウが表示されたときにバック プレス イベントをキャプチャするにはどうすればよいでしょうか。
ポップアップウィンドウが表示されたときにバックプレスを処理したい。注意してそれを却下したい場合もあれば、ポップアップウィンドウでいくつかのタスクを実行したくない場合もあります。
ポップアップ ウィンドウが表示されている場合、Activity onBackPress は呼び出されません。では、ポップアップ ウィンドウが表示されたときにバック プレス イベントをキャプチャするにはどうすればよいでしょうか。
final PopupWindow popup = new PopupWindow(context);
...
popup.setFocusable(false); //Setting this to true will prevent the events to reach activity below
popup.setBackgroundDrawable(new BitmapDrawable()); //Or anything else, not null!
次に、アクティビティで:
@Override
public void onBackPressed() {
//your code
}
あなたが検討するかもしれないより簡単な代替案を提案します。他のアプローチは私にはうまくいきませんでした。
ソリューションの原則: ポップアップ ウィンドウの近くのすべてのボタン クリックは傍受されますが、[戻る] ボタンは傍受されません。そのため、アクションを実行する popupwindow に何かがある場合は、dismiss() を呼び出す直前に指示を設定します。setOnDismissListener() で追加のアクション (getActivity().popupBackStack() など) を実行します。
このソリューションの利点は、独自の CustomPopupWindow を作成してこの戦略を実装できることです。カスタム ポップアップ ウィンドウでこの実装を非表示にすることができます。
ステップ 1: ポップアップ ウィンドウのインスタンス化に near を追加します。
boolean isClickHandled = false;
popupWindow.setOutsideTouchable(true);
popupWindow.setBackgroundDrawable(new ShapeDrawable());
popupWindow.setTouchInterceptor(new View.OnTouchListener() { // or whatever you want
@Override
public boolean onTouch(View v, MotionEvent event) {
isClickHandled = true;
return false;
}
});
popupWindow 内にボタンがある場合は、setOnClickListener.onClick に isClickHandled = true を設定し、dismiss() を設定します。
onDismissListener で次のようにします。
popupWindow.setOnDismissListener(() -> {
popupWindow.dismiss();
if ( !isClickHandled) {
MainActivity.mainActivity.getSupportFragmentManager().popBackStack();
}
});