Android 自定义AlertDialog对话框样式
实际的项目开发当中,经常需要根据实际的需求来自定义alertdialog。最近在开发一个wifi连接的功能,点击wifi需要弹出自定义密码输入框。在此权当记录
效果图
点击首页的button即跳出对话框,显示wifi信息(textview),密码输入框(edittext),取消和连接按钮(button)
实现
根据自己实际的需求,为alertdialog创建一个布局,在此我需要定义一个如图所示的wifi密码输入框,故在 res/layout 目录下建立一个 dialog_layout.xml 文件。
在该布局中,定义一个textview显示wifi名称,一条分割线,一个edittext用于密码输入,以及两个button用于取消与连接
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="300dp" android:layout_height="180dp" android:orientation="vertical"> <textview android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margintop="15dp" android:gravity="center" android:text="wifi" android:textsize="18sp" /> <view android:layout_width="match_parent" android:layout_height="2dp" android:layout_marginleft="20dp" android:layout_marginright="20dp" android:layout_margintop="10dp" android:background="#f5f5f5" /> <edittext android:id="@+id/et_passwd" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginleft="20dp" android:layout_marginright="20dp" android:layout_margintop="10dp" android:focusable="true" android:focusableintouchmode="true" android:hint="password" android:inputtype="numberpassword" /> <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margintop="10dp" android:orientation="horizontal"> <button android:id="@+id/btn_cancel" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:background="@null" android:text="取消" android:textcolor="#1965db" android:textsize="16sp" /> <button android:id="@+id/btn_connect" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:background="@null" android:text="连接" android:textcolor="#1965db" android:textsize="16sp" /> </linearlayout> </linearlayout>
新建 wifidialog.java 继承 alertdialog ,并引入刚刚所定义的 dialog_layout.xml 布局,并在这里做我们的逻辑操作
声明构造方法,传入 context
在 oncreate() 中加载布局,获取 view,为按钮设置点击事件
这边尤其要注意一个问题,在 dialog 中,定义 edittext 后,在弹出框中点击 edittext 弹不出键盘来进行输入,故这里要用 this.getwindow().clearflags(windowmanager.layoutparams.flag_alt_focusable_im)
保证键盘能弹出以用来输入密码
package com.example.test.dialogtest; import android.app.alertdialog; import android.content.context; import android.os.bundle; import android.text.textutils; import android.view.view; import android.view.windowmanager; import android.widget.button; import android.widget.edittext; import android.widget.toast; /** * created by aaronpasi on 2017/9/16. */ public class wifidialog extends alertdialog implements view.onclicklistener { edittext metpasswd; button mbtncancel, mbtnconnect; context mcontext; public wifidialog(context context) { super(context); mcontext = context; } @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.dialog_layout); metpasswd = (edittext) findviewbyid(r.id.et_passwd); //保证edittext能弹出键盘 this.getwindow().clearflags(windowmanager.layoutparams.flag_alt_focusable_im); this.setcancelable(false); mbtncancel = (button) findviewbyid(r.id.btn_cancel); mbtncancel.setonclicklistener(this); mbtnconnect = (button) findviewbyid(r.id.btn_connect); mbtnconnect.setonclicklistener(this); } @override public void onclick(view view) { switch (view.getid()) { case r.id.btn_cancel: this.dismiss(); break; case r.id.btn_connect: if (textutils.isempty(metpasswd.gettext())) { toast.maketext(mcontext, "密码不能为空", toast.length_short).show(); } else { this.dismiss(); toast.maketext(mcontext, metpasswd.gettext().tostring(), toast.length_short).show(); } break; default: break; } } }
调用的话就简单了,new 一个 wifidialog对象,并调用 show() 方法即可。这里在 mainactivity 简单声明一个 button,设置点击事件,弹出对话框。
package com.example.test.dialogtest; import android.support.v7.app.appcompatactivity; import android.os.bundle; import android.view.view; import android.widget.button; public class mainactivity extends appcompatactivity implements view.onclicklistener { private button mdialogbtn; private wifidialog mdialog; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mdialogbtn = (button) findviewbyid(r.id.btn_dialog); mdialogbtn.setonclicklistener(this); } @override public void onclick(view view) { if (view.getid() == r.id.btn_dialog) { mdialog = new wifidialog(this); mdialog.show(); } } }
总结
以上所述是小编给大家带来的android 自定义alertdialog对话框,希望对大家有所帮助