【问题标题】:Prevent "Dialog" Activity from interacting with background activity when clicking outside bounds单击外部边界时防止“对话框”活动与后台活动交互
【发布时间】:2014-04-17 07:07:51
【问题描述】:

我正在创建一个看起来像对话框的活动。

风格如下:

<style name="TablesDialogActivity" parent="@android:style/Theme.Holo.Dialog">
    <item name="android:windowBackground">@drawable/frame_background_left</item>
</style>

这里是 onCreate() 活动:

protected void onCreate(Bundle savedInstanceState) {
        getWindow().setFlags(LayoutParams.FLAG_NOT_TOUCH_MODAL, LayoutParams.FLAG_NOT_TOUCH_MODAL);
        getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
        super.onCreate(savedInstanceState);
}

还有在活动触摸拦截器内部:

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
        finish();
        return true;
    }
    return false;
}

它几乎可以工作,活动在对话框边界之外的触摸完成,但它也与背景活动上的按钮交互,这是不好的。 onTouchEvent 上的文档说,如果您使用了触摸事件,则应该返回 true。我返回 true,但似乎并非如此。

【问题讨论】:

标签: android android-activity android-styles


【解决方案1】:

嗯..有趣)
在我的应用程序中,我使用片段,所以我使用 DialogFragment 而不是 Dialog。
我创建了安全显示对话框方法

private static void showDialog(FragmentManager fragmentManager, String dialogTag, BeamDialogData data) {

        FragmentTransaction ft = fragmentManager.beginTransaction();
        ft.commit();
        fragmentManager.executePendingTransactions();
        Fragment prev = fragmentManager.findFragmentByTag(dialogTag);
        if (prev != null) {
            ft.remove(prev);
        }
        ft.addToBackStack(null);

        BeamDialog beamDialog = new BeamDialog();
        beamDialog.setData(data);
        beamDialog.show(fragmentManager, dialogTag);
    }

    public static void showDialogSafe(final FragmentManager fragmentManager, final String dialogTag, 
            final BeamDialogData data, Handler handler) {
        handler.post(new Runnable() {
            @Override
            public void run() {
                    showDialog(fragmentManager, dialogTag, data);
            }           
        });     
    }

BeamDialog 是我的自定义 DialogFragment
所以没有背景点击) 我希望这对你有用)

【讨论】:

  • 整个事情是在活动中而不是在DialogFragment中进行
【解决方案2】:

请注意,您也需要问题中的完整代码。

除了我的解决方案在后台活动中(或只是您的应用程序的基本活动)之外,我还添加了:

private FrameLayout touchInterceptor;

@Override
protected void onPause() {
    if (touchInterceptor.getParent() == null) {
        ((ViewGroup) findViewById(android.R.id.content)).addView(touchInterceptor);
    }
    super.onPause();
}

@Override
protected void onResume() {
    ((ViewGroup) findViewById(android.R.id.content)).removeView(touchInterceptor);
    super.onResume();
}

而在onCreate()

    // For intercepting clicks from dialog like activities
    touchInterceptor = new FrameLayout(this);
    touchInterceptor.setClickable(true);

现在就像一个魅力! :)

【讨论】:

    猜你喜欢
    • 2012-08-19
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多