Uygulamam için özel bir iletişim kutusu uyguladım. Kullanıcı iletişim kutusunun dışına tıkladığında iletişim kutusunun kapatılacağını uygulamak istiyorum. Bunun için ne yapmam gerekiyor?
Uygulamam için özel bir iletişim kutusu uyguladım. Kullanıcı iletişim kutusunun dışına tıkladığında iletişim kutusunun kapatılacağını uygulamak istiyorum. Bunun için ne yapmam gerekiyor?
Yanıtlar:
dialog.setCanceledOnTouchOutside(true);
İletişim kutusunun dışına dokunursanız iletişim kutusunu kapatacak olanı kullanabilirsiniz .
Gibi bir şey,
Dialog dialog = new Dialog(context)
dialog.setCanceledOnTouchOutside(true);
Veya modelinizdeki İletişim Kutunuz yoksa,
1 - FLAG_NOT_TOUCH_MODAL
İletişim kutusunun pencere özelliği için işaret - belirleme
Window window = this.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
2 - Windows özelliklerine başka bir bayrak ekleyin ,, FLAG_WATCH_OUTSIDE_TOUCH
- bu, diyalogun görünür bölgesinin dışında dokunma olayı alması içindir.
3 - onTouchEvent()
İletişim kutusunu geçersiz kılın ve eylem türünü kontrol edin. eylem türü ' MotionEvent.ACTION_OUTSIDE
' ise, kullanıcı iletişim bölgesinin dışında etkileşim kuruyor demektir. Bu durumda, iletişim pencerenizi azaltabilir veya ne yapmak istediğinize karar verebilirsiniz. düzyazıyı görüntüle?
public boolean onTouchEvent(MotionEvent event)
{
if(event.getAction() == MotionEvent.ACTION_OUTSIDE){
System.out.println("TOuch outside the dialog ******************** ");
this.dismiss();
}
return false;
}
Daha fazla bilgi için Dokunma noktalarına dayalı özel bir iletişim kutusunu nasıl kapatabilirim? Konusuna bakın. ve Diyalog bölgesi dışına dokunduğunuzda modsuz diyalogunuzu nasıl kapatabilirsiniz?
Basitçe kullanın
dialog.setCanceledOnTouchOutside(true);
Bu onTouchEvent uygulamasını kullanabilirsiniz. Aktivitenin altında dokunma olayına tepki vermesini önler (howettl'den bahsedildiği gibi).
@Override
public boolean onTouchEvent ( MotionEvent event ) {
// I only care if the event is an UP action
if ( event.getAction () == MotionEvent.ACTION_UP ) {
// create a rect for storing the window rect
Rect r = new Rect ( 0, 0, 0, 0 );
// retrieve the windows rect
this.getWindow ().getDecorView ().getHitRect ( r );
// check if the event position is inside the window rect
boolean intersects = r.contains ( (int) event.getX (), (int) event.getY () );
// if the event is not inside then we can close the activity
if ( !intersects ) {
// close the activity
this.finish ();
// notify that we consumed this event
return true;
}
}
// let the system handle the event
return super.onTouchEvent ( event );
}
Kaynak: http://blog.twimager.com/2010/08/closing-activity-by-touching-outside.html
Veya, iletişim kutusunu xml stilinizde tanımlanan bir tema kullanarak özelleştiriyorsanız, bu satırı temanıza koyun:
<item name="android:windowCloseOnTouchOutside">true</item>
dialog.setCanceledOnTouchOutside(true);
harika çalışıyor.
Bu yöntem, tıklama alanlarını alan gri alanın altındaki etkinliklerden tamamen kaçınmalıdır.
Varsa bu satırı kaldırın :
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
Bunu oluşturulan etkinliğinize koyun
getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
ardından bununla touch olayını geçersiz kılın
@Override
public boolean onTouchEvent(MotionEvent ev)
{
if(MotionEvent.ACTION_DOWN == ev.getAction())
{
Rect dialogBounds = new Rect();
getWindow().getDecorView().getHitRect(dialogBounds);
if (!dialogBounds.contains((int) ev.getX(), (int) ev.getY())) {
// You have clicked the grey area
displayYourDialog();
return false; // stop activity closing
}
}
// Touch events inside are fine.
return super.onTouchEvent(ev);
}
Bu kod, kullanım süresi gizlenen iletişim kutusuna tıklandığında ve kullanıcı iletişim kutusunun dış tarafına tıkladığında, hem yumuşak giriş hem de iletişim kutusunun yakın olduğu zamanlar için kullanılır.
dialog = new Dialog(act) {
@Override
public boolean onTouchEvent(MotionEvent event) {
// Tap anywhere to close dialog.
Rect dialogBounds = new Rect();
getWindow().getDecorView().getHitRect(dialogBounds);
if (!dialogBounds.contains((int) event.getX(),
(int) event.getY())) {
// You have clicked the grey area
InputMethodManager inputMethodManager = (InputMethodManager) act
.getSystemService(act.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(dialog
.getCurrentFocus().getWindowToken(), 0);
dialog.dismiss();
// stop activity closing
} else {
InputMethodManager inputMethodManager = (InputMethodManager) act
.getSystemService(act.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(dialog
.getCurrentFocus().getWindowToken(), 0);
}
return true;
}
};
Başka bir çözüm, bu kod android kaynak kodundan alınmıştır Window
Sadece diyalog kaynak koduna bu iki yöntemi eklemelisiniz.
@Override
public boolean onTouchEvent(MotionEvent event) {
if (isShowing() && (event.getAction() == MotionEvent.ACTION_DOWN
&& isOutOfBounds(getContext(), event) && getWindow().peekDecorView() != null)) {
hide();
}
return false;
}
private boolean isOutOfBounds(Context context, MotionEvent event) {
final int x = (int) event.getX();
final int y = (int) event.getY();
final int slop = ViewConfiguration.get(context).getScaledWindowTouchSlop();
final View decorView = getWindow().getDecorView();
return (x < -slop) || (y < -slop)
|| (x > (decorView.getWidth()+slop))
|| (y > (decorView.getHeight()+slop));
}
Bu çözümün bu sorunu yok:
Bu, altındaki etkinliğin dokunma olayına da tepki göstermesi dışında harika çalışıyor. Bunu önlemenin bir yolu var mı? - howettl
Aşağıdaki benim için çalıştı:
myDialog.setCanceledOnTouchOutside(true);
İşte kod
dialog.getWindow().getDecorView().setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent ev) {
if(MotionEvent.ACTION_DOWN == ev.getAction())
{
Rect dialogBounds = new Rect();
dialog. getWindow().getDecorView().getHitRect(dialogBounds);
if (!dialogBounds.contains((int) ev.getX(), (int) ev.getY())) {
// You have clicked the grey area
UiUtils.hideKeyboard2(getActivity());
return false; // stop activity closing
}
}
getActivity().dispatchTouchEvent(ev);
return false;
}
});
Bunu dene . dışarıya dokunduğunuzda klavyeyi gizleyebilirsiniz