4

onBackPressed() イベントで Android にアラート ダイアログ ボックスを表示したい

DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {

    //@Override
    public void onClick(DialogInterface dialog, int which) {
        switch (which){
        case DialogInterface.BUTTON_POSITIVE:
            //Yes button clicked
            break;

        case DialogInterface.BUTTON_NEGATIVE:
            //No button clicked
            break;
        }
    }
};

しかし、 onBackPressed() イベントで実行するとエラーが発生します

@Override
public void onBackPressed() {
    super.onBackPressed();  
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Are you sure?").setPositiveButton("Yes", dialogClickListener)
        .setNegativeButton("No", dialogClickListener).show();

}

エラー: " com.java.mypkg は、最初にここに追加されたウィンドウ com.android.internal.policy.impl.PhoneWindow$DecorView@406c3798 をリークしました"

私は何かを逃したのですか?助けてください。

4

6 に答える 6

8

はい、以前のユーザーの応答に従ってそれを呼び出さないでください。Activity のsuper.onBackPressed();willメソッド。onStop代わりに、要件にonBackPressed();使用できonKeyDownます。AlertDialog戻るボタンを押したときに開く必要がある場合は、 KeyEventでそれを試すことができます

例えば ​​-

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub

    switch(keyCode)
    {
    case KeyEvent.KEYCODE_BACK:
        AlertDialog.Builder ab = new AlertDialog.Builder(AlertDialogExampleActivity.this);
        ab.setMessage("Are you sure?").setPositiveButton("Yes", dialogClickListener)
        .setNegativeButton("No", dialogClickListener).show();
        break;
    }

    return super.onKeyDown(keyCode, event);
}

DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        switch (which){
        case DialogInterface.BUTTON_POSITIVE:
            //Yes button clicked
            break;

        case DialogInterface.BUTTON_NEGATIVE:
            //No button clicked
            break;
        }
    }
};

メソッドをオーバーライドすると、 KEYCODE_BACKonKeyDownでバックキーが検出されます

これがお役に立てば幸いです。

于 2012-07-30T04:38:42.800 に答える
2
  1. この行に適切なコンテキストを与えるために進んでください::

    AlertDialog.Builder builder = new AlertDialog.Builder(ActivityName.this);     
    
  2. このように適切にアラートダイアログを閉じます。

    new AlertDialog.Builder(ActivityName.this)  
    .setMessage("You have to Login first to apply.\nWant to login ?")  
    .setCancelable(false)  
    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {  
        public void onClick(DialogInterface dialog, int which)   
        {  
              // Perform Your Task Here--When Yes Is Pressed.  
              dialog.cancel();  
        }  
    })    
    .setNegativeButton("No", new DialogInterface.OnClickListener() {  
          public void onClick(DialogInterface dialog, int which)   
          {  
         // Perform Your Task Here--When No is pressed    
             dialog.cancel();  
          }  
    }).show();  
    

このウィンドウリークのエラーは、次の場合に発生します::

  • コンテキストが異なるアクティビティで、コンテキストが異なる新しいウィンドウが開きます。

  • アクティビティの終了中にウィンドウまたはダイアログが正しく閉じられません。

于 2012-07-30T04:51:41.227 に答える
2

super.onBackPressed(); アクティビティの onStop メソッドを呼び出すため、呼び出さないでください。

また、終了したアクティビティの上にダイアログを表示すると、ウィンドウがリークします。

于 2012-07-30T04:28:27.087 に答える
2

私のアラートダイアログメソッド:

public void message_dialog_yes_no (Activity activity, String msg, DialogInterface.OnClickListener yesListener) {
    AlertDialog.Builder builder = new AlertDialog.Builder(activity);

    builder.setMessage(msg)
           .setCancelable(false)
           .setPositiveButton("Yes", yesListener) 
           .setNegativeButton("No",  new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   dialog.cancel();
              }})              
           .show();
}

このメソッドを宣言した後、次のように呼び出すことができます。

DialogInterface.OnClickListener yesListener;

        yesListener = new DialogInterface.OnClickListener() {               
            public void onClick(DialogInterface dialog, int which) {
//codes
        }
        };

message_dialog_yes_no(this, "Confirm delete?" , yesListener);
于 2012-08-02T18:28:13.537 に答える
1

super.onBackPressed()アクティビティにとどまりたい場合ではなく、デフォルトのアクションを実行する (つまり、実際に戻る) 場合にのみ呼び出す必要があります。

正しくオーバーライドする方法の例については、このリンクを参照してください。onBackPressed()

于 2012-07-30T04:33:02.200 に答える
1

onBackPressed() 通常、アクティビティを終了するときにいくつかの条件を実行するためにオーバーライドします。これは、バック プレス イベントの通常の実行を通過することによって、実際には何もないことを意味しsuper.onBackPressedます。したがって、オーバーライドされたメソッド内にあるということは、戻るキーが押されたときに実行されるデフォルトの実行にも従い、独自のメソッドも実行されることを意味します。

ただし、スーパークラスを呼び出した後に AlertDialog を表示しようとしているため、Activity コンテキストは使用できなくなります。これは、Alert Dialog 自体を表示するためのウィンドウがないため、リークされたウィンドウエラーが発生することを意味します。

この場合、スーパー クラスの呼び出しを削除しました。単純。

于 2012-07-30T04:33:34.030 に答える