2011-12-06 18 views
57

私はDialogFragmentを使用していますが、押したときにダイアログを閉じる(つまり閉じる)ように画像を設定している間に、ユーザーが外の場所をクリックしたときにダイアログを閉じる方法を見つけるのが苦労しています。それは通常のダイアログで動作します。ダイアログの外側を押すときにDialogFragmentを解除するにはどうすればいいですか?

dialogFragment.setCanceledOnTouchOutside(true); 

コールと思われますが、ドキュメントには表示されません。

DialogFragmentでこれは可能ですか?あるいは、間違った場所を探していますか?私は '親'活動でタッチイベントを傍受しようとしましたが、タッチイベントが発生していないことを除けば、それは私のようには思えませんでした。

答えて

136
DialogFragment.getDialog().setCanceledOnTouchOutside(true); 

(Apurv Guptaが指摘したように)onCreateViewで呼び出す必要があります。

+26

「onCreateView」で呼び出す必要があります –

+0

キャンセルするのではなく、ただ閉じたい場合はどうすればいいですか? – jjxtra

50
@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     ... 
     getDialog().setCanceledOnTouchOutside(true); 
     ... 
     } 
1
DialogFragment.getDialog().setCanceledOnTouchOutside(false); 

それはタイプミスされました。私も同じ問題がありました。これは次のようになりますアンドロイドモノのJavaとMonoのために正常に動作します:

this.getDialog().SetCanceledOnTouchOutside(false); 
18
/** The system calls this only when creating the layout in a dialog. */ 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     // The only reason you might override this method when using onCreateView() is 
     // to modify any dialog characteristics. For example, the dialog includes a 
     // title by default, but your custom layout might not need it. So here you can 
     // remove the dialog title, but you must call the superclass to get the Dialog. 
     Dialog dialog = super.onCreateDialog(savedInstanceState); 
     dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     dialog.setCanceledOnTouchOutside(true); 

     return dialog; 
    } 
+0

これは私のためには機能しませんでした。 @Apurvごとに 'onCreateView'で' setCanceledOnTouchOutside'を呼び出さなければなりませんでした。私は 'setCanceledOnTouchOutside(false)'と呼ばなければならないことを言及する必要があります – kimbaudi

0

私は上記の解決策を試した後、私の解決策を使用することをお勧めします。私の解答はhereです。要約すると、私はDialogFragment.getView()のタッチ範囲をチェックしています。タッチポイントがDialogFragmentの外にある場合は、ダイアログを閉じます。

0
  Dialog.SetCanceledOnTouchOutside(true); 

ダイアログが開いたときに私のため
私のここでの回答のコード

class dlgRegister : DialogFragment 
     { 
    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
      { 
    .... 
    .... 
    } 
    public override void OnActivityCreated(Bundle savedInstanceState) 
      { 
       Dialog.Window.RequestFeature(WindowFeatures.NoTitle); 
       Dialog.SetCanceledOnTouchOutside(true); 
       base.OnActivityCreated(savedInstanceState); 
       Dialog.Window.Attributes.WindowAnimations = Resource.Style.dialog_animation; 
      } 
    } 
+0

あなたは近くですが正しくありません! – sud007

2

ロットはなく、アプリのクラッシュ働きました。 onCreateViewの中にgetDialog().setCanceledOnTouchOutside(true);を書き込んでも機能せず、アプリケーションがクラッシュしました。

(私のBaseActivityとしてAppCompatActivity、私のフラグメントとしてandroid.app.DialogFragmentを使用しています)。 。(真)

getDialog()setCanceledOnTouchOutside;:どのような作品

は、2次の行のいずれかであります

OR

this.getDialog()setCanceledOnTouchOutside(TRUE)。

使用しないように何

@Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     //getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimationZoom; 
     //getDialog().getWindow().setDimAmount(0.85f); 
     getDialog().setCanceledOnTouchOutside(true);//See here is the code 
    } 

ようonActivityCreated内部

DialogFragment.getDialog()。setCanceledOnTouchOutside(false);

は、次のエラー

enter image description here

そしてonCreateViewクラッシュアプ​​リケーションでコードを記述をスローします! 何か問題が見つかった場合は、その答えを更新してください。