使用 Handler.postDelayed() 排程關閉,任何使用者互動(點擊、觸摸、按鍵)時 removeCallbacks() 取消舊排程並重新排程。
public class AutoDismissDialog extends Dialog {
private static final long AUTO_DISMISS_DELAY = 5000; // 5 秒
private final Handler handler = new Handler(Looper.getMainLooper());
private final Runnable dismissRunnable = this::dismiss;
public AutoDismissDialog(@NonNull Context context) {
super(context);
}
@Override
public void show() {
super.show();
resetTimer();
}
@Override
public void onUserInteraction() {
super.onUserInteraction();
resetTimer(); // 使用者操作 → 重置倒數
}
private void resetTimer() {
handler.removeCallbacks(dismissRunnable);
handler.postDelayed(dismissRunnable, AUTO_DISMISS_DELAY);
}
@Override
public void dismiss() {
handler.removeCallbacks(dismissRunnable);
super.dismiss();
}
}
AutoDismissDialog dialog = new AutoDismissDialog(this);
dialog.setContentView(R.layout.my_dialog);
dialog.show();
若 onUserInteraction() 未觸發(如 Dialog 非全螢幕),可在 dispatchTouchEvent() 重置:
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
resetTimer();
return super.dispatchTouchEvent(ev);
}