onBackPressed не вызывается, когда отображается PopupWindow

Эй, ребята,

Итак, в настоящее время я использую PopupWindow для отображения в браузере приложений. Однако при нажатии кнопки «Назад» ничего не происходит. Я использую PopupWindow в другом фрагменте, затем я использую оператор для установки PopupWindow в моем FragmentActivity, а затем, когда я нажимаю кнопку «Назад», он должен проверить, установлен ли PopupWindow или нет, и отклонить его или нет. Однако он даже не проходит через onBackPressed.

PopupWindow во фрагменте:

--> здесь я указываю строку, которая гарантирует, что FragmentActivity также получит PopupWindow.

// Use webview for icons and website link.
public void inAppBrowser(String url){
    mCursor.moveToFirst();
    // Inflate View
    LayoutInflater layoutInflater = (LayoutInflater) ((MainActivity) MainActivity.getContext()).getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final View inflatedView = layoutInflater.inflate(R.layout.browser_window, null, false);

    // Control View Childs.
    LinearLayout header = (LinearLayout) inflatedView.findViewById(R.id.filter_header);
    header.setBackgroundColor(Color.parseColor(color));
    Button cancel = (Button) inflatedView.findViewById(R.id.cancel);
    Button done = (Button) inflatedView.findViewById(R.id.done);

    // Set PopupWindow position.
    Display display = ((MainActivity) MainActivity.getContext()).getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);

    // Control PopupWindow.
    final PopupWindow popWindow = new PopupWindow(inflatedView, size.x, size.y, true);
    popWindow.setAnimationStyle(android.R.anim.fade_in);
    popWindow.setFocusable(true);
    popWindow.setOutsideTouchable(true);

    popWindow.showAtLocation(v, Gravity.BOTTOM, 0, 150);
    --> MainActivity.setPopupWindow(popWindow);

    // Control WebView
    WebView myWebView = (WebView) inflatedView.findViewById(R.id.webview);
    myWebView.setWebViewClient(new WebViewClientAdapter());
    myWebView.clearCache(true);
    myWebView.clearHistory();
    myWebView.getSettings().setJavaScriptEnabled(true);
    myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    MainActivity.setWebView(myWebView);
    if (url != null) {
        if (url.contains("http://") || url.contains("https://")) {

        } else {
            url = "http://" + url;
        }
        myWebView.loadUrl(url);
    } else {
        popWindow.dismiss();
        MainActivity.setPopupWindow(null);
        MainActivity.setWebView(null);
    }

    cancel.setVisibility(View.INVISIBLE);
    done.setText("Close");

    done.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            popWindow.dismiss();
        }
    });
}

Мой код onBackPressed:

@Override
public void onBackPressed() {
    // TODO Auto-generated method stub
    //check if popupwindow is open
    Log.e(TAG, "Check if it runs through this section");
    if (popWindow != null) {
        if (myWebView != null && myWebView.canGoBack()) {
            myWebView.goBack();
        } else {
            popWindow.dismiss();
            popWindow = null;
            myWebView = null;
        }
    }
}

Пока игнорируйте WebView. Это может быть вопрос в будущем, но я хочу, чтобы PopupWindow сначала закрывался. Любая помощь приветствуется.


person Jordi Sipkens    schedule 07.01.2015    source источник


Ответы (4)


Сделайте ваш PopupWindow не фокусируемым:

final PopupWindow popWindow = new PopupWindow(inflatedView, size.x, size.y, false);

Также удалите эту строку, которая была избыточной:

popWindow.setFocusable(true);
person Simas    schedule 07.01.2015
comment
Потрясающие! ты спас мой день - person Ramesh Akula; 18.09.2016
comment
Не работает на Android 4.4.2, с new PopupWindows(Context); popupWindow.setFocusable(false); - person Jemshit Iskenderov; 23.02.2017
comment
Мне пришлось установить фон на ненулевой рисунок, по крайней мере, popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); - person Jemshit Iskenderov; 23.02.2017
comment
Но теперь клавиатура не отображается при нажатии EditText ): - person Stav Bodik; 22.05.2017

Я думаю, вам следует определить статический метод removePopupWindow(view v) в MainActivity и вызвать его внутри onBackPressed() как MainActivity.removePopupWindow(popWindow); Надеюсь, это поможет вам.

person SAM    schedule 07.01.2015
comment
Мой onBackPressed уже находится в MainActivity (FragmentActivity) и не вызывается. Это моя проблема прямо сейчас, когда мой PopupWindow показывает, что он не вызывает onBackPressed. - person Jordi Sipkens; 07.01.2015
comment
поставить super.onBackPressed(); теперь попробуй - person SAM; 07.01.2015
comment
Если onBackPressed не вызывается, вызов суперметода внутри него ничего не изменит. - person Simas; 07.01.2015
comment
Господин выше меня получил правильный ответ! Спасибо, в любом случае. - person Jordi Sipkens; 07.01.2015

Итак, этот вопрос был задан давно, но я думаю, что у меня есть лучшее решение. Что я сделал, так это добавил OnDismissListener в свое всплывающее окно. В этом слушателе я добавил код, который я хотел выполнить, когда всплывающее окно было закрыто. Таким образом, Android все еще может управлять открытием и закрытием всплывающего окна, и я просто добавил одну строку, чтобы она работала.

Это способ добавить один:

yourAwesomePopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
        @Override
        public void onDismiss() {
            // Your code on dismiss here
        }
});
person jobbert    schedule 08.02.2017

Вы можете использовать это.

Dialog dialog = new Dialog(ActivityMain.this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);   dialog.setContentView(R.layout.mydialog);
dialog.setCancelable(true);

dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
   @Override
   public void onDismiss(DialogInterface dialog) {
      try {
         if (mScannerView!=null) {
            mScannerView.stopCamera();
         }
      } catch(Exception e){
         e.printStackTrace();
      }
   }
});
person Sagittarius    schedule 05.02.2020