2010-11-09 59 views
10

有没有什么方法可以显示一个无模式对话框 - 一个对话框允许用户在对话框之前与屏幕上的任何内容进行交互,但也允许用户在按下时与对话框交互?定时非模态对话框

我知道Toasts,但他们不允许与弹出窗口进行交互。

我知道对话框,但它们是模态的,不允许与背景交互。

我知道通知,但我想要在屏幕上可见的东西。

我基本上想要能够玩一个游戏什么的,弹出式窗口显示我有一封新邮件或其他东西。我可以点击它查看我的电子邮件,但如果我只想继续玩我的游戏,我可以等待它离开。这在Android中可能吗?

+0

你想让你的通知只出现在你的活动或你想它可能出现在其他的活动? – 2010-11-09 10:51:50

+0

只有我的活动 – 2010-11-13 03:17:52

回答

12

是的,创建一个活动,样式为Theme.Dialog。这是一个正常的活动,看起来像一个对话框,同时是无模式的并接受事件。

一个例子:

<activity android:name=".activity.dialog.PhotoDialog" 
      android:label="@string/photo_dialog_title" 
      android:theme="@android:style/Theme.Dialog"/> 

编辑

事实上Theme.Dialog模糊底层活动并使其不可访问。我有一个类似的要求,我不得不显示带文本和取消按钮的上传进度对话框。主要的问题是设置WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL并重置WindowManager.LayoutParams.FLAG_DIM_BEHIND

创建一个对话框,使用自定义内容:

if (progressDialog == null) { 
      progressDialog = new Dialog(activityRequestingProgressDialog); 
      progressDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
      progressDialog.setContentView(R.layout.progress_upload); 
      progressBar = (ProgressBar) progressDialog.findViewById(R.id.progressBar); 
      progressText = (TextView) progressDialog.findViewById(R.id.progressText); 
      progressText.setText("0 %"); 
      progressText.setTextSize(18); 
      Button buttonCancel = (Button) progressDialog.findViewById(R.id.btnCancel); 
      buttonCancel.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View view) { 
        cancelProgressDialog(); 
        stopUpload("Upload cancelled."); 
       } 
      }); 
      Window window = progressDialog.getWindow(); 
      window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 
        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); 
      window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 
      window.setGravity(Gravity.BOTTOM); 
      progressDialog.show(); 
     } 

     progressText.setText(text); 
     progressBar.setProgress(percent); 

这是此对话框的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/progressDialog" 
      android:orientation="vertical" 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      android:layout_centerVertical="true"> 

<TextView android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:textSize="18sp" 
      android:padding="10dp" 
      android:text="@string/progress_title"/> 

<LinearLayout android:id="@+id/progressDialog" 
       android:orientation="horizontal" 
       android:layout_height="wrap_content" 
       android:layout_width="wrap_content" 
       android:padding="10dp" 
       android:layout_centerVertical="true"> 

    <ProgressBar android:id="@+id/progressBar" 
       android:layout_width="150dp" 
       android:layout_height="34dp" 
       android:paddingRight="10dp" 
       android:max="100" 
       android:progress="0" 
       android:fadingEdge="vertical" 
       style="?android:attr/progressBarStyleHorizontal"/> 

    <TextView android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center" 
       android:id="@+id/progressText" 
       android:paddingRight="10dp"/> 

    <Button android:layout_height="40dp" 
      android:layout_width="80dp" 
      android:id="@+id/btnCancel" 
      android:text="@string/dialog_cancel"/> 

</LinearLayout> 
</LinearLayout> 
+0

这仍然允许与它后面的活动进行交互? – 2010-11-13 03:18:34

+0

是的,它允许它 – 2010-11-13 08:17:29

+0

真棒!我会试试这个! – 2010-11-14 11:18:21

0

我实现这是一个多一点的hackish,但也允许捕获按钮按下通过背景窗口

_wm = this.getWindowManager(); 
LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
_view = layoutInflater.inflate(R.layout.notification, null); 

_params = new WindowManager.LayoutParams(); 
_params.height = android.view.ViewGroup.LayoutParams.WRAP_CONTENT; 
_params.width = android.view.ViewGroup.LayoutParams.WRAP_CONTENT; 
_params.flags = 
    // this is to keep button presses going to the background window 
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 
    // this is to enable the notification to recieve touch events 
    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; 
// background transparant 
_params.format = PixelFormat.TRANSLUCENT; 
_gravity = Gravity.TOP;//Gravity.BOTTOM; 

_wm.addView(_view, _params); 
+0

可以正常工作...但我有这个对话框后面的列表视图,我不能选择任何listview elt ...任何建议,使listview元素可点击? – fvisticot 2013-02-22 17:59:01

4

只需加上FLAG_NOT_TOUCH _MODAL标志到您的对话框

dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);