Saya telah menerapkan dialog khusus untuk aplikasi saya. Saya ingin menerapkan itu ketika pengguna mengklik di luar dialog, dialog akan diberhentikan. Apa yang harus saya lakukan untuk ini?
Saya telah menerapkan dialog khusus untuk aplikasi saya. Saya ingin menerapkan itu ketika pengguna mengklik di luar dialog, dialog akan diberhentikan. Apa yang harus saya lakukan untuk ini?
Jawaban:
Anda dapat menggunakan dialog.setCanceledOnTouchOutside(true);
yang akan menutup dialog jika Anda menyentuh di luar dialog.
Sesuatu seperti,
Dialog dialog = new Dialog(context)
dialog.setCanceledOnTouchOutside(true);
Atau jika Dialog Anda bukan model,
1 - Tetapkan flag- FLAG_NOT_TOUCH_MODAL
untuk atribut jendela dialog Anda
Window window = this.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
2 - Tambahkan bendera lain ke properti windows ,, FLAG_WATCH_OUTSIDE_TOUCH
- ini untuk dialog untuk menerima acara sentuh di luar wilayah yang terlihat.
3 - Ganti onTouchEvent()
dialog dan periksa jenis tindakan. jika jenis tindakan adalah ' MotionEvent.ACTION_OUTSIDE
' berarti, pengguna berinteraksi di luar wilayah dialog. Jadi dalam hal ini, Anda dapat mengabaikan dialog Anda atau memutuskan apa yang ingin Anda lakukan. lihat cetak polos?
public boolean onTouchEvent(MotionEvent event)
{
if(event.getAction() == MotionEvent.ACTION_OUTSIDE){
System.out.println("TOuch outside the dialog ******************** ");
this.dismiss();
}
return false;
}
Untuk info lebih lanjut, lihat Cara mengabaikan dialog khusus berdasarkan titik sentuh? dan Cara mengabaikan dialog non-modal Anda, ketika disentuh di luar wilayah dialog
Cukup gunakan
dialog.setCanceledOnTouchOutside(true);
Anda dapat menggunakan implementasi onTouchEvent ini. Ini mencegah dari bereaksi di bawah aktivitas ke acara sentuhan (seperti yang disebutkan howettl).
@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 );
}
Sumber: http://blog.twimager.com/2010/08/closing-activity-by-touching-outside.html
Atau, jika Anda menyesuaikan dialog menggunakan tema yang ditentukan dalam xml gaya Anda, masukkan baris ini dalam tema Anda:
<item name="android:windowCloseOnTouchOutside">true</item>
dialog.setCanceledOnTouchOutside(true);
bekerja dengan sangat baik.
Metode ini harus sepenuhnya menghindari aktivitas di bawah area abu-abu yang mengambil peristiwa klik.
Hapus baris ini jika Anda memilikinya:
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
Letakkan ini di aktivitas Anda yang dibuat
getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
kemudian timpa acara sentuh dengan ini
@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);
}
Kode ini digunakan untuk ketika menggunakan klik pada kotak dialog yang menyembunyikan input dan ketika pengguna mengklik sisi luar kotak dialog yang waktu softinput dan kotak dialog ditutup.
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;
}
};
Solusi lain, kode ini diambil dari kode sumber android. Window
Anda harus menambahkan kedua metode ini ke kode sumber dialog Anda.
@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));
}
Solusi ini tidak memiliki masalah ini:
Ini berfungsi baik kecuali bahwa aktivitas di bawahnya juga bereaksi terhadap peristiwa sentuhan. Apakah ada cara untuk mencegahnya? - howettl
Berikut ini berhasil bagi saya:
myDialog.setCanceledOnTouchOutside(true);
Ini kodenya
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;
}
});
Coba yang ini . Anda dapat menyembunyikan keyboard saat menyentuh di luar