2013-08-16 21 views
39

外setOnCancelListenerとsetOnDismissListenerバックボタンにAlertDialogのために呼び出されていない押さやタッチ戻るボタンでダイアログ領域外

  • タッチ
  • 押し

私はonDismiss(または期待していonCancel)が呼び出されます。ただし、どちらも呼び出されません。私は行方不明のものがあることを知っていますか? AlertDialog setOnDismissListener not workingから、戻るボタンを押したときにonCancelが呼び出されると思いました。しかし、それは私のためには機能しません。私が逃したものは何か知っていますか?

public class RateAppDialogFragment extends SherlockDialogFragment { 
    public static RateAppDialogFragment newInstance() { 
     RateAppDialogFragment rateAppDialogFragment = new RateAppDialogFragment(); 
     return rateAppDialogFragment; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     // Get the layout inflater 
     LayoutInflater inflater = getActivity().getLayoutInflater(); 
     View view = inflater.inflate(R.layout.rate_app_dialog_fragment, null); 

     Utils.setCustomTypeFace(view, Utils.ROBOTO_LIGHT_TYPE_FACE); 

     final AlertDialog dialog = new AlertDialog.Builder(this.getSherlockActivity())    
     .setTitle("Love JStock?") 
     .setView(view) 
     // Add action buttons 
     .setPositiveButton("Rate 5 stars \u2605", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int id) { 
       Utils.showShortToast("Rate"); 
      } 
     }) 
     .setNegativeButton("No", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       Utils.showShortToast("No"); 
      } 
     }) 
     .setNeutralButton("Later", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       Utils.showShortToast("Later"); 
      } 
     }) 
     .create(); 

     dialog.setCanceledOnTouchOutside(true); 

     dialog.setOnCancelListener(new DialogInterface.OnCancelListener() { 

      @Override 
      public void onCancel(DialogInterface dialog) { 
       Utils.showShortToast("Back button pressed?"); 
      } 
     }); 

     dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { 

      @Override 
      public void onDismiss(DialogInterface dialog) { 
       // TODO Auto-generated method stub 
       Utils.showShortToast("Back button pressed?"); 
      } 
     }); 

     return dialog; 
    } 

} 

FragmentManager fm = fragmentActivity.getSupportFragmentManager(); 
    if (fm.findFragmentByTag(RATE_APP_DIALOG_FRAGMENT) != null) { 
     return; 
    } 

    RateAppDialogFragment rateAppDialogFragment = RateAppDialogFragment.newInstance(); 
    rateAppDialogFragment.show(fm, RATE_APP_DIALOG_FRAGMENT); 
+0

@pskinkあなたがテストしてくださいコードを実行しますか?それは本当にあなたのためにうまくいくのですか? –

+0

私はLog.dを使用します。何ら変わりありません。トーストもログメッセージも表示されません。 –

+0

私は最小限のセットアップでそれを実行します - 肯定と否定のボタンだけのBuilder、2.2 avd – pskink

答えて

106

あなたがを使用しているときに問題が発生しました210 http://developer.android.com/reference/android/app/DialogFragment.htmlによるとDialog

を表示するためには、解決策がhttp://developer.android.com/reference/android/app/DialogFragment.html#onCreateDialog(android.os.Bundle)からDialogFragment

てくださいノートでonCancelをオーバーライドすることで、あまりにも

注:DialogFragmentはDialog.setOnCancelListenerと Dialog.setOnDismissListenerコールバックを所有。自分で設定してはいけません。 これらのイベントについては、onCancel(DialogInterface)と onDismiss(DialogInterface)を上書きしてください。あなたのDialogFragmentで

// This is DialogFragment, not Dialog 
@Override 
public void onCancel(DialogInterface dialog) { 
} 
+1

すてきな解決策!実際には、DialogFragmentのCancelを使用して作業する方法です。 – sud007

4

あなたは、このトピックをお読みくださいbackPressedキーイベントに

dialog.setOnKeyListener(new Dialog.OnKeyListener() { 
    @Override 
    public boolean onKey(DialogInterface arg0, int keyCode, KeyEvent event) { 
     // TODO Auto-generated method stub 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
      finish(); 
     } 
     return true; 
    } 
}); 
+1

しかし、ダイアログボックス領域の外側に触れることはどうですか?また、あなたはsetOnCancelListenerとsetOnDismissListenerがうまくいかない理由も知っていますか?彼らはうまくいくはずですね。 –

+0

あなたは解決策を得ています。私はそれが大きくて愚かな間違いだったと言うでしょう:あなたがデフォルトのメソッドをオーバーライドしている場合は、その上に '@ override'を置かなければならないという強制です。 – SilentKiller

0

、あなたがAlertDialogを使用している場合

builder.setOnCancelListener(new DialogInterface.OnCancelListener() { 
    @Override 
    public void onCancel(DialogInterface dialog) { 
     // dialog dismiss without button press 
    } 
}); 

dialog.setCanceledOnTouchOutside(true)を参照してください、

@Override 
public void onStop() { 
    super.onStop(); 
    if (mListener != null) { 
     // do something here 
    } 
} 
4

を上書き(感謝@LeosLiterak)

+0

とdialog.setCanceledOnTouchOutside(true)も追加してください。 –

+0

@LeosLiterakありがとうございました。 –

+0

java.lang.IllegalStateException:ダイアログのOnCancelListenerまたはOnDismissListenerを設定できません – Joe

関連する問題