如何在触摸窗口外部时取消类似Activity主题的对话框?

50

我有一个使用对话框主题的活动,当有人在此活动窗口之外的任何地方触摸屏幕时,我想关闭(结束)这个活动。我该如何实现?


Android 并没有真正支持这个功能。我不确定是否有任何方法可以实现,而且对于 Android 用户来说也不自然。这就是返回按钮的作用。 - Falmarri
2
对于一个对话框类来说,setCanceledOnTouchOutside方法是很自然的。那么为什么一个对话框主题的Activity不能有这个方法呢? - Alex
17个回答

0

使用方法setFinishOnTouchOutside来启用/禁用外部是否可触摸。

这适用于活动。

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_yoptions);
    /* your code here */

    // set outside touchable
    this.setFinishOnTouchOutside(true);
}

0

对于那些希望在触摸对话框外部时不关闭对话框应用程序的人。请添加此行。

this.setFinishOnTouchOutside(false);

它不会关闭对话框


0

只需将此项添加到styles.xml中:

<style name="alert_dialog" parent="android:Theme.Dialog">
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowFullscreen">false</item>
    <item name="android:windowBackground">@color/float_transparent</item>
    <item name="android:windowAnimationStyle">@null</item>
    <item name="android:backgroundDimEnabled">true</item>
    <item name="android:backgroundDimAmount">0.4</item>
</style>

onCreate()setContentView之前:

setTheme(R.style.alert_dialog);

0

一个Activity有dispatchTouchEvent方法,可以使用它

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    // TODO Auto-generated method stub
    finish();
    return super.dispatchTouchEvent(ev);

}

0

只需使用此主题。点击屏幕外部即可关闭该活动。

<style name="DialogTheme" parent="Theme.MaterialComponents.DayNight.Dialog">
    <item name="android:windowIsTranslucent">true</item>
</style>

0

Kotlin 版本适合我

alert.setOnDismissListener(DialogInterface.OnDismissListener() {
    it.dismiss()
})

-2
如果没有API支持,您应该使用FrameLayout来填充屏幕,并手动构建一个弹出框。然后,您可以在屏幕上的任何位置接收焦点,并相应地显示/隐藏视图。

很抱歉,我不熟悉FrameLayout,有没有示例可以参考一下? - Alex
这里有一个例子: http://www.curious-creature.org/2009/03/01/android-layout-tricks-3-optimize-part-1/ 看看图片上方的小文本框...你可以让它看起来像一个弹出窗口,而且你仍然可以在窗口的其他部分收到所有通知。 - Matt
Gregory的答案对我有用,不知道FrameLayout在这种情况下如何有帮助。 - Tosa
@vabanagas的答案对我很有用。因为触摸事件无法传递到后台活动。 - moallemi
2
我实际上不同意这个答案收到的许多负投票。它是没有 API 支持的唯一合理选择。所以不赞成的人可以解释一下为什么这是“如此错误”吗? - user458577

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接