2017-01-19 3 views
0

私はアンドロイドでダイアログを実装しています。ユーザーがダイアログボックスの外をクリックしても、ダイアログが表示されたときのダイアログ。setCanceledOnTouchOutside(boolean)がfalseに設定されていてもダイアログボックスの外側をクリックする方法

+0

通常のダイアログまたはアクティビティをダイアログとして使用していますか? – shadygoneinsane

答えて

0

ダイアログのonTouchEvent()をオーバーライドし、アクションタイプを確認します。アクションタイプがMotionEvent.ACTION_OUTSIDEの場合、ユーザーがダイアログ領域外で対話していることを意味します。したがって、この場合には、あなたは、ダイアログを閉じたり、実行したいかを決めることができます。

public boolean onTouchEvent(MotionEvent event) 
{ 
    if(event.getAction() == MotionEvent.ACTION_OUTSIDE){ 
    System.out.println("Touched outside the dialog"); 
    } 
    return false; 
} 
0

あなたはタッチがダイアログまたはビューの外に起こったかどうかを確認したい場合は、活動にDispatchTouchEvent()をオーバーライドすることがあり、その方法でチェックインしてください。同様に:
は、以下のようなtouchOutSideをトリガするためのインタフェースを作成します。

/** 
* Interface definition for a callback to be invoked when a touch event has occurred outside a formerly specified view. 
* See {@link #setOnTouchOutsideViewListener(View, OnTouchOutsideViewListener)} 
*/ 
public interface OnTouchOutsideViewListener { 
    /** 
    * Called when a touch event has occurred outside a given view. 
    * 
    * @param view The view that has not been touched. 
    * @param event The MotionEvent object containing full information about the event. 
    */ 
    void onTouchOutside(View view, MotionEvent event); 
} 

は、基本アクティビティを持っている場合、あなたはそれにすべてのコードを入れて、または他の活動で使用することができたとします。
dispatchTouchEvent()をオーバーライドすると、画面上ですべてのタッチが発生したときにトリガーされます。ここではタッチされたxとyが画面に表示されるので、xとyのビューを取得し、このポイントがタッチ内にあるかどうかを確認する必要があります。リスナー外のタッチを設定し、それを除去するための

@Override 
public boolean dispatchTouchEvent(final MotionEvent ev) { 
    if (ev.getAction() == MotionEvent.ACTION_DOWN) { 
     // Notify touch outside listener if user tapped outside a given view 
     if (mOnTouchOutsideViewListener != null && mTouchOutsideView != null 
       && mTouchOutsideView.getVisibility() == View.VISIBLE) { 
      Rect viewRect = new Rect(); 
      mTouchOutsideView.getGlobalVisibleRect(viewRect); 
      if (!viewRect.contains((int) ev.getRawX(), (int) ev.getRawY())) { 
       mOnTouchOutsideViewListener.onTouchOutside(mTouchOutsideView, ev); 
       return false; 
      } 
     } 
    } 
    return super.dispatchTouchEvent(ev); 
} 

、以下のような活動のメソッドを作成します。

/** 
* Sets a listener that is being notified when the user has tapped outside a given view. To remove the listener, 
* call {@link #removeOnTouchOutsideViewListener()}. 
* <p/> 
* This is useful in scenarios where a view is in edit mode and when the user taps outside the edit mode shall be 
* stopped. 
* 
* @param view 
* @param onTouchOutsideViewListener 
*/ 
public void setOnTouchOutsideViewListener(View view, OnTouchOutsideViewListener onTouchOutsideViewListener) { 
    mTouchOutsideView = view; 
    mOnTouchOutsideViewListener = onTouchOutsideViewListener; 
} 

public void removeOnTouchOutsideViewListener() { 
    mTouchOutsideView = null; 
    mOnTouchOutsideViewListener = null; 
} 

だから、最終的にはあなたが何をすべきかのonCreate()setOnTouchOutsideViewListener()に一番上の親ビューを渡し、ありますあなたのケースではdialog.show()の後に、ダイアログの親のレイアウトを渡します。類似:

View detectTouchOutsideThisView = findViewById(R.id.parent_view); 
setOnTouchOutsideViewListener(detectTouchOutsideThisView, new OnTouchOutsideViewListener() { 
    void onTouchOutside(View view, MotionEvent event) { 
     //If touch outside this will be triggered 
    } 
}); 
+0

ありがとうございましたakhayそれは多くの助けた –

関連する問題