Android 自定义AlertDialog对话框样式
作者:mrr 发布时间:2022-02-06 12:20:07
实际的项目开发当中,经常需要根据实际的需求来自定义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对话框,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言!


猜你喜欢
- 上周工作中遇到一个奇怪的问题,解决之后想想还是写出来和大家分享一下。故障描述:在A程序中使用Process.Start方法调用一个B.exe
- 下面还有投票,帮忙投个票👍前言最近在看某个开源项目代码并准备参与其中,代码过了一遍后发现多个自定义的配置文件用来装载业务配置代替数据库查询,
- 1、图的定义我们知道,前面讨论的数据结构都有一个框架,而这个框架是由相应的算法实现的,比如二叉树搜索树,左子树上所有结点的值均小于它的根结点
- FilterInputStream 介绍FilterInputStream 的作用是用来“封装其它的输入流,并为它们提供额外的功能”。它的常
- 本文实例讲述了Android使用GPS获取用户地理位置并监听位置变化的方法。分享给大家供大家参考,具体如下:LocationActivity
- 网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类。通过这个类可以连接到指定IP或域名的服务器上,并且可以和
- 目录1.搭建环境2.项目搭建3.配置maven4.项目结构5.配置 MapperScan 注解6.创建实体7.创建接口8.测试8.1 upd
- 什么是POM?POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示,名称叫做p
- 这两天学习了使用Path绘制贝塞尔曲线相关,然后自己动手做了一个类似QQ未读消息可拖拽的小气泡,效果图如下:最终效果图接下来一步一步的实现整
- 本文为大家分享了C#实现窗体全屏的具体代码,供大家参考,具体内容如下方法一:不过此方法有时候会出现莫名的bug//程序启动路径,与生成程序的
- java读取word文档时,虽然网上介绍了很多插件poi、java2Word、jacob、itext等等,poi无法读取格式(新的API估计
- 在进行C#程序设计时,用的最多的莫过于string了,但有些时候由于不仔细或者基础的不牢固等因素容易出错,今天本文就来较为详细的总结一下C#
- 通过下面代码在构造函数中调用方法 SetShadow();即可实现无边框窗体的阴影效果了需要添加命名空间 using System.Runt
- 前言在网络通信中,通信传输数据容易被截取或篡改,如果在传输用户隐私数据过程中,被不法分子截取或篡改,就可能导致用户受到伤害,比如被诈 骗,所
- 一、前言介绍:1.1 课题背景 互联网发展至今,无论是其理论还是技术都已经成熟,而且
- 一、带时区的时间1.获取当前时间对象(带时区)import java.time.ZonedDateTime;public class dem
- IntelliJ IDEA中实现跟eclipse一样的outline方法,查看文件内所有已经声明的方法。mac的可以在key map 里搜索
- 本文实例讲述了Java爬取豆瓣电影数据的方法。分享给大家供大家参考,具体如下:所用到的技术有Jsoup,HttpClient。Jsoupjs
- 1. 下载myeclipse版本对应的STS插件下载地址:https://spring.io/tools/sts/all2.在myeclip
- 目录生成器设计类图: 实现代码:优点:用途与缺点:责任链设计类图:实现代码:优点:用途和缺点:总结生成器生成器模式:封装一个产品的