onBackPressed tidak dipanggil saat PopupWindow ditampilkan

hai teman-teman,

Jadi saat ini saya menggunakan PopupWindow untuk menampilkan browser dalam aplikasi. Namun saat menekan tombol kembali tidak menghasilkan apa-apa. Saya menggunakan PopupWindow di Fragmen lain, lalu saya menggunakan pernyataan untuk menyetel PopupWindow di FragmentActivity saya dan kemudian ketika saya menekan tombol kembali, ia akan memeriksa apakah PopupWindow disetel atau tidak dan mengabaikannya atau tidak. Namun itu bahkan tidak berjalan melalui onBackPressed.

Jendela Popup dalam fragmen:

--> di sinilah saya menunjukkan baris yang memastikan FragmentActivity mendapatkan PopupWindow juga.

// 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();
        }
    });
}

Kode onBackPressed saya:

@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;
        }
    }
}

Abaikan WebView untuk saat ini. Itu mungkin menjadi pertanyaan di kemudian hari, tapi saya ingin PopupWindow ditutup terlebih dahulu. Bantuan apa pun dihargai.


person Jordi Sipkens    schedule 07.01.2015    source sumber


Jawaban (4)


Jadikan PopupWindow Anda tidak dapat fokus:

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

Hapus juga baris ini yang berlebihan:

popWindow.setFocusable(true);
person Simas    schedule 07.01.2015
comment
luar biasa! kamu selamatkan hariku - person Ramesh Akula; 18.09.2016
comment
Tidak berfungsi di Android 4.4.2, dengan new PopupWindows(Context); popupWindow.setFocusable(false); - person Jemshit Iskenderov; 23.02.2017
comment
Saya harus mengatur latar belakang ke drawable non null, setidaknya popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); - person Jemshit Iskenderov; 23.02.2017
comment
Tapi sekarang keyboard tidak akan muncul saat diklik EditText ): - person Stav Bodik; 22.05.2017

Saya pikir Anda harus mendefinisikan metode statis removePopupWindow(view v) di MainActivity, dan memanggilnya di dalam onBackPressed() seperti MainActivity.removePopupWindow(popWindow); Semoga ini bisa membantu Anda.

person SAM    schedule 07.01.2015
comment
OnBackPressed saya sudah ada di MainActivity (FragmentActivity) dan tidak dipanggil. Itulah masalah saya saat ini, ketika PopupWindow saya ditampilkan, onBackPressed tidak dapat dipanggil. - person Jordi Sipkens; 07.01.2015
comment
masukkan super.onBackPressed(); sekarang coba - person SAM; 07.01.2015
comment
Jika onBackPressed tidak dipanggil, memanggil metode super di dalamnya tidak akan mengubah apa pun. - person Simas; 07.01.2015
comment
Tuan di atas saya mendapat jawaban yang benar! Terima kasih. - person Jordi Sipkens; 07.01.2015

Oke, jadi pertanyaan ini sudah lama ditanyakan, tapi saya rasa saya punya solusi yang lebih baik. Apa yang saya lakukan adalah menambahkan OnDismissListener ke popup saya. Di pendengar ini saya telah menambahkan kode yang ingin saya jalankan ketika popup ditutup. Dengan cara ini Android masih bisa mengatur pembukaan dan penutupan popup dan saya hanya menambahkan satu baris untuk membuatnya berfungsi.

Ini adalah cara untuk menambahkannya:

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

Anda dapat menggunakan ini.

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