Android用PopupWindow实现自定义Dailog
android的popupwindow是个很有用的widget,利用它可以实现悬浮窗体的效果,比如实现一个悬浮的菜单,最常见的应用就是在视频播放界面里,做一个工具栏,用来控制播放进度。本文利用popupwindow来实现一个通用的dailog,类似android系统的alertdailog,从中学习和掌握有关popupwindow和dailog的使用和实现细节。
界面效果如图所示,点击 click 按钮后,弹出对话框提示。
(1). customdailog的布局
首先定义 custdailog的布局文件,由系统的alertdailog可以知道,一个对话框包含了三个要素,一个是title,即标题,一个是message,即主体内容,还有一个是button,即确定和取消的按钮,用来与用户交互。因此,布局设计如下:
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:background="@drawable/shape_bg" android:layout_margin="10dp"> <textview android:id="@+id/customdlgtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:textstyle="bold" android:textsize="20sp" android:layout_margin="10dp" android:gravity="center"/> <view android:layout_width="match_parent" android:layout_height="1dp" android:background="@android:color/darker_gray"/> <linearlayout android:id="@+id/customdlgcontentview" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_margin="5dp" /> <textview android:id="@+id/customdlgcontenttext" android:layout_width="match_parent" android:layout_height="wrap_content" android:textsize="15sp" android:layout_margin="5dp" android:paddingleft="5sp"/> <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_margin="5dp" > <button android:id="@+id/customdlgbuttonok" android:layout_width="0dp" android:layout_weight="0.5" android:layout_height="wrap_content" android:visibility="gone"/> <button android:id="@+id/customdlgbuttoncancel" android:layout_width="0dp" android:layout_weight="0.5" android:layout_height="wrap_content" android:visibility="gone"/> </linearlayout> </linearlayout>
其中,shap_bg.xml 是dailog的背景的定义文件,你可以修改此文件,来改变dailog的背景:
<?xml version="1.0" encoding="utf-8"?> <shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#e6ecee" /> <stroke android:width="1.0dip" android:color="@android:color/darker_gray" /> <corners android:radius="8.0dip" /> </shape>
(2). customdailog的定义
customdailog的接口,可以类比alertdailg的接口定义,主要包括如下一些方法:
1. settitle 设置标题
2. setmessage 设置主体内容
3. setpositivebutton 设置 “确定” 按钮
4. setnegativebutton 设置 “取消” 按钮
5. show 显示
6. dimiss 消失
其定义如下:
package com.ticktick.popdailog; import android.content.context; import android.view.gravity; import android.view.layoutinflater; import android.view.view; import android.view.view.onclicklistener; import android.view.viewgroup.layoutparams; import android.widget.button; import android.widget.linearlayout; import android.widget.popupwindow; import android.widget.textview; public class customdailog { private view mparent; private popupwindow mpopupwindow; private linearlayout mrootlayout; private layoutparams mlayoutparams; //popupwindow必须有一个parentview,所以必须添加这个参数 public customdailog(context context, view parent) { mparent = parent; layoutinflater minflater = (layoutinflater)context.getsystemservice(context.layout_inflater_service); //加载布局文件 mrootlayout = (linearlayout)minflater.inflate(r.layout.custom_dailog, null); mlayoutparams = new layoutparams(layoutparams.wrap_content,layoutparams.wrap_content); } //设置dailog的标题 public void settitle(string title) { textview mtitle = (textview)mrootlayout.findviewbyid(r.id.customdlgtitle); mtitle.settext(title); } //设置dailog的主体内容 public void setmessage(string message) { textview mmessage = (textview)mrootlayout.findviewbyid(r.id.customdlgcontenttext); mmessage.settext(message); } //设置dailog的“确定”按钮 public void setpositivebutton(string text,onclicklistener listener ) { final button buttonok = (button)mrootlayout.findviewbyid(r.id.customdlgbuttonok); buttonok.settext(text); buttonok.setonclicklistener(listener); buttonok.setvisibility(view.visible); } //设置dailog的“取消”按钮 public void setnegativebutton(string text,onclicklistener listener ) { final button buttoncancel = (button)mrootlayout.findviewbyid(r.id.customdlgbuttoncancel); buttoncancel.settext(text); buttoncancel.setonclicklistener(listener); buttoncancel.setvisibility(view.visible); } //替换dailog的“主体”布局 public void setcontentlayout(view layout) { textview mmessage = (textview)mrootlayout.findviewbyid(r.id.customdlgcontenttext); mmessage.setvisibility(view.gone); linearlayout contentlayout = (linearlayout)mrootlayout.findviewbyid(r.id.customdlgcontentview); contentlayout.addview(layout); } //设置dailog的长宽 public void setlayoutparams(int width, int height) { mlayoutparams.width = width; mlayoutparams.height = height; } //显示dailog public void show() { if(mpopupwindow == null) { mpopupwindow = new popupwindow(mrootlayout, mlayoutparams.width,mlayoutparams.height); mpopupwindow.setfocusable(true); } mpopupwindow.showatlocation(mparent, gravity.center, gravity.center, gravity.center); } //取消dailog的显示 public void dismiss() { if(mpopupwindow == null) { return; } mpopupwindow.dismiss(); } }
(3). 在activity中的使用方法
由于 popupwindow 的显示必须给一个parentview,在activity中使用的话,最简单的方法就是将整个activity的“根view”传递给这个popupwindow,这样就可以在整个屏幕的正*来显示dailog,获取acitivity的根view的方法如下:
findviewbyid(android.r.id.content)).getchildat(0);
因此,上面定义的 cunstomdailog的使用方法如下所示:
final customdailog dailog = new customdailog(this,getrootlayout()); dailog.settitle("warning"); dailog.setmessage("this is ticktick's blog!"); dailog.setpositivebutton("ok", new onclicklistener() { @override public void onclick(view v) { dailog.dismiss(); } }); dailog.setnegativebutton("cancel", new onclicklistener() { @override public void onclick(view v) { dailog.dismiss(); } }); dailog.show();
到此为止,整个dailog的实现就介绍到这里了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
Android自定义View实现水波纹引导动画
-
Android编程实现自定义输入法功能示例【输入密码时防止第三方窃取】
-
Android-自定义控件之ListView下拉刷新的实现
-
Android开发实现popupWindow弹出窗口自定义布局与位置控制方法
-
Android开发实现自定义水平滚动的容器示例
-
Android自定义GestureDetector实现手势ImageView
-
Android自定义ScrollView实现放大回弹效果
-
android通过自定义toast实现悬浮通知效果的示例代码
-
Android编程实现自定义title功能示例
-
Android自定义ViewGroup实现堆叠头像的点赞Layout