簡體   English   中英

android.view.WindowLeaked 警告對話框的錯誤原因

[英]android.view.WindowLeaked error cause of alert dialog

我是 android 新手,我有一個警告對話框的問題。 有一種方法是這樣的:

private void deletSelected(){
    AlertDialog.Builder dialog = new AlertDialog.Builder(this);
    dialog.setTitle("are you sure?");
    dialog.setPositiveButton("Yes" , new DialogInterface.OnClickListener(){
        @Override
        public void onClick(DialogInterface dialog, int which) {
            int deletedRow = getContentResolver().delete(
                    ContentUris.withAppendedId(CONTENT_URI , selectedRow) , null , null);

            if (deletedRow == -1){
                Toast.makeText(EditorActivity.this , "not deleted!" , Toast.LENGTH_SHORT).show();
            }else {
                Toast.makeText(EditorActivity.this , "deleted successfully" , Toast.LENGTH_SHORT).show();
            }
            if (dialog != null){
                dialog.dismiss();
            }    
        }
    });
    dialog.setNegativeButton("no" , new DialogInterface.OnClickListener(){
        @Override
        public void onClick(DialogInterface dialog, int which) {
            if (dialog != null){
                dialog.dismiss();
            }
        }
    });
    // Create and show the AlertDialog
    AlertDialog alertDialog = dialog.create();
    alertDialog.show();
}

和第二種方法是這樣的:

 @Override
public boolean onOptionsItemSelected(MenuItem item) {
    // User clicked on a menu option in the app bar overflow menu
    switch (item.getItemId()) {
        // Respond to a click on the "Save" menu option
        case R.id.action_save:
            save();
            finish();
            return true;
        // Respond to a click on the "Delete" menu option
        case R.id.action_delete:
            deletSelected();
            finish(); // if i remove this line app will work correctly
            return true;
    }
    return super.onOptionsItemSelected(item);
}

我的問題是,如果我在 onOptionsItemSelected 方法中刪除 finish() ,我的應用程序將正常運行,但它仍保留在我不想要的當前活動中。 我想在用戶在確認對話框中按 yes 后刪除數據庫中的選定行並返回主活動,但沒有此行,選定的行將刪除但應用程序不會返回 mainActivity 。

如果我添加完成()確認對話框在單擊刪除后立即消失,應用程序將返回主活動而不刪除任何內容。 並且在邏輯上顯示以下錯誤:

08-04 21:57:02.630 28064-28064/com.example.android.pets E/WindowManager: android.view.WindowLeaked: Activity com.example.android.pets.EditorActivity has leaked window android.widget.PopupWindow$PopupDecorView{652e345 V.E...... ......ID 0,0-588,144} that was originally added here
                                                                         at android.view.ViewRootImpl.<init>(ViewRootImpl.java:394)
                                                                         at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:330)
                                                                         at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
                                                                         at android.widget.PopupWindow.invokePopup(PopupWindow.java:1279)
                                                                         at android.widget.PopupWindow.showAsDropDown(PopupWindow.java:1118)
                                                                         at android.support.v7.widget.AppCompatPopupWindow.showAsDropDown(AppCompatPopupWindow.java:105)
                                                                         at android.support.v4.widget.PopupWindowCompatKitKat.showAsDropDown(PopupWindowCompatKitKat.java:33)
                                                                         at android.support.v4.widget.PopupWindowCompat$KitKatPopupWindowImpl.showAsDropDown(PopupWindowCompat.java:129)
                                                                         at android.support.v4.widget.PopupWindowCompat.showAsDropDown(PopupWindowCompat.java:206)
                                                                         at android.support.v7.widget.ListPopupWindow.show(ListPopupWindow.java:721)
                                                                         at android.support.v7.view.menu.StandardMenuPopup.tryShow(StandardMenuPopup.java:160)
                                                                         at android.support.v7.view.menu.StandardMenuPopup.show(StandardMenuPopup.java:187)
                                                                         at android.support.v7.view.menu.MenuPopupHelper.showPopup(MenuPopupHelper.java:290)
                                                                         at android.support.v7.view.menu.MenuPopupHelper.tryShow(MenuPopupHelper.java:175)
                                                                         at android.support.v7.widget.ActionMenuPresenter$OpenOverflowRunnable.run(ActionMenuPresenter.java:803)
                                                                         at android.os.Handler.handleCallback(Handler.java:743)
                                                                         at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                         at android.os.Looper.loop(Looper.java:150)
                                                                         at android.app.ActivityThread.main(ActivityThread.java:5546)
                                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
                                                                         at     com.android.internal.os.ZygoteInit.main(ZygoteInit.java:682)
 08-04 21:57:02.631 28064-28064/com.example.android.pets E/WindowManager:      android.view.WindowLeaked: Activity com.example.android.pets.EditorAc

有什么想法嗎?

編輯:刪除finish() 並將其放入onClick 方法后。 現在一切都是正確的。 但我不明白這兩種方式有什么區別?

嘗試將您想要完成的活動傳遞到deletSelected()方法並從onClick()調用activity.finish() onClick() ,而不是從您當前擁有的位置調用finish()

發生這種情況是因為當您單擊 optionmenuitemselected 時出現對話框后,您正在終止活動而不解除 AlertDialog。 因此,用戶不能如他所願地選擇或按“是”或“否”。

您需要做的就是將 onBackPressed() 放在警報對話框的肯定按鈕中,或者如果您願意的話。

private void deletSelected(){
    AlertDialog.Builder dialog = new AlertDialog.Builder(this);
    dialog.setTitle("are you sure?");
    dialog.setPositiveButton("Yes" , new DialogInterface.OnClickListener(){
        @Override
        public void onClick(DialogInterface dialog, int which) {
            int deletedRow = getContentResolver().delete(
                    ContentUris.withAppendedId(CONTENT_URI , selectedRow) , null , null);

            if (deletedRow == -1){
                Toast.makeText(EditorActivity.this , "not deleted!" , Toast.LENGTH_SHORT).show();
            }else {
                Toast.makeText(EditorActivity.this , "deleted successfully" , Toast.LENGTH_SHORT).show();
            }
            if (dialog != null){
                dialog.dismiss();
            }

            **// after performing all you task put this
            onBackPressed();

           // or if you wish to pass some data to previous activity try onActivityResult way.**
        }
    });
    dialog.setNegativeButton("no" , new DialogInterface.OnClickListener(){
        @Override
        public void onClick(DialogInterface dialog, int which) {
            if (dialog != null){
                dialog.dismiss();
            }
        }
    });
    // Create and show the AlertDialog
    AlertDialog alertDialog = dialog.create();
    alertDialog.show();
}

new AlertDialog.Builder(this)替換為
new AlertDialog.Builder(EditorActivity.this); 或使用 getApplicationContext()

在我的情況下,使用此解決方案成功完成:使用 dialog.dismiss() 將“your_activity.this.finish()”放入處理程序中以等待空閑時間。

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
      @Override
      public void run() {
          your_activity.this.finish();
      }
},500);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM