2014-02-14 40 views
0

所以这在过去的几个小时里一直困扰着我。如何让对话在外部触摸打开并捕捉外部触动?

我有一个扩展对话框,你猜对了,Dialog。当用户点击对话框外部时,我不想关闭对话框。这很容易,因为我可以简单地使用这一行:dialog.setCanceledOnTouchOutside(false)。但是,当用户触摸对话框之外时,我确实想要执行某些操作。该对话框不关闭也很容易(How to cancel an Dialog themed like Activity when touched outside the window?):

getWindow().setFlags(LayoutParams.FLAG_NOT_TOUCH_MODAL, LayoutParams.FLAG_NOT_TOUCH_MODAL); 
getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH); 

然后实现自定义onTouchEvent(MotionEvent event)

但是,这不仅不会消除对话框,还会对底层的按钮等执行操作。我已经在帖子中尝试了一些其他潜在的答案(空的,在根视图上返回onTouchListener,检查对话框内是否有触摸等),但无济于事。

现在我的问题是:如何创建一个Dialog不关闭在外面点击,也不会在底层布局/活动执行这样的按钮操作和,但不会告诉我/捕获当一个事件用户在对话框外单击?

回答

0

我宁愿在自定义布局中使用DialogFragment。在布局创建视图组将填充用户界面,并将是透明的(该布局将捕获外部点击)。把你的对话框放在这个布局中。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:id="@+id/background" 
       android:gravity="center" 
       android:background="@color/transparent"> 
... 
</LinearLayout> 

然后在onCreateView:

View view = inflater.inflate(R.layout.popup_exit, container, false); 

LinearLayout background = (LinearLayout) view.findViewById(R.id.background); 
background.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
    Log.d("ExitDialogFragment", "onBackground click"); 
    } 
}); 

和的onCreate:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setStyle(DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_Translucent_NoTitleBar); 
} 

测试,它的工作原理。

+0

@stealthjong是否适合你? – czajna666

相关问题