Android悬浮对话框(即点即关对话框)实现代码
activity是android系统的4个应用程序组件之一。通过传统方法显示的activity都是充满整个屏幕,也就是全屏的activity。事实上,activity不仅可以全屏显示,还可以象对话框一样直接显示在屏幕上。而且可以通过单击屏幕的任何位置(包括activity内部和activity外部)来关闭activity。 activity的传统风格 activity是学习android的入门技术。几乎所有的初学者都会从activity学起。因此,activity这个组件对于android的开发人员是再熟悉不过了。下面来看一下activity的基本配置。
<activity android:name=".main" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity>
上面的配置代码是一个典型的activity配置。在这个配置中主要指定了action和category。按着这个配置显示的activity会充满整个屏幕。在android中也内置了很多程序,大多数都会包含activity,例如,图1是一个时钟程序,也是一个典型的activity。
悬浮activity
所谓悬浮activity,就是悬浮在桌面上,看起来象一个对话框。如图2所示。
事实上,实现上面的效果并不复杂,只需要在androidmanifest.xml文件中定义activity的<activity>标签中添加一个android:theme属性,并指定对话框主题即可,代码如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="net.blogjava.mobile" android:versioncode="1" android:versionname="1.0"> <application android:icon="@drawable/date" android:label="@string/app_name"> <activity android:name=".main" android:label="@string/app_name" android:theme="@android:style/theme.dialog"> <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> </application> <uses-sdk android:minsdkversion="3" /> </manifest> <?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <textview android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="这是一个悬浮对话框" android:layout_marginleft="20dp" android:layout_marginright="20dp" /> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:layout_margintop="20dp"> <button android:id="@+id/btncurrentdate" android:layout_width="100dp" android:layout_height="wrap_content" android:text="当前日期" /> <button android:id="@+id/btnfinish" android:layout_width="80dp" android:layout_height="wrap_content" android:text="关闭" /> </linearlayout> </linearlayout>
这两个按钮的单击事件代码如下:
public void onclick(view view) { switch (view.getid()) { case r.id.btncurrentdate: // 显示当前日期对话框 simpledateformat simpledateformat = new simpledateformat( "yyyy-mm-dd"); datedialog.seticon(r.drawable.date); datedialog.settitle("当前日期:" + simpledateformat.format(new date())); datedialog.setbutton("确定", new onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { } }); datedialog.setondismisslistener(new ondismisslistener() { @override public void ondismiss(dialoginterface dialog) { new datedialog.builder(main.this).setmessage( "您已经关闭的当前对话框.").create().show(); } }); datedialog.show(); break; case r.id.btnfinish: // 关闭悬浮activity finish(); break; } }
单击“显示日期”按钮后,效果如图4所示。
触摸任何位置都可以关闭的对话框
通常需要单击“关闭”或其他类似的按钮来关闭activity或对话框。但有时需要单击(触摸)屏幕的任何位置来关闭activity或对话框。关闭activity很好处理,只需要处理activity的触摸事件即可,代码如下:
@override public boolean ontouchevent(motionevent event) { finish(); return true; }
如果是对话框,也同样可以使用ontouchevent事件方法。不过一般使用了alertdialog对话框都是封装好的。因此,要使用ontouchevent事件方法,就需要继承alertdialog类。在上一节给出的onclick方法中弹出当前显示对话框的代码中使用了一个datedialog类,该类是alertdialog的子类,代码如下:
package net.blogjava.mobile; import android.app.alertdialog; import android.content.context; import android.view.motionevent; public class datedialog extends alertdialog { public datedialog(context context) { super(context); } @override public boolean ontouchevent(motionevent event) { // 关闭显示日期对话框 dismiss(); return super.ontouchevent(event); } }
在上面的代码中也使用了ontouchevent事件方法。在该方法中调用了dismiss方法来关闭对话框。读者可以运行本文的例子,看看是否能通过单击屏幕的任何位置来关闭对话框和悬浮activity。
总结
本文介绍了悬浮activity和触摸任何位置都可以关闭的对话框的实现。悬浮activity只需要在<activity>元素中添加android:theme="@android:style/theme.dialog"即可。要想触摸任何位置关闭对话框或activity,需要使用触摸事件(ontouchevent方法)。如果是对话框,需要通过继承alertdialog类的方式来使用ontouchevent方法。
当使用上面的配置代码时,显示的activity就会如图2所示。在本例中向activity添加了两个按钮,分别用来显示当前日期和关闭对话框。