Android 对话框 (AlertDialog)
Android 提供了 AlertDialog 类可通过其内部类 Builder 轻松创建对话框窗口,但是没法对这个对话框窗口进行定制,为了修改 AlertDialog 窗口显示的外观,解决的办法就是创建一个指定的 AlertDialog 和 AlertDialog.Builder 类。
定义外观
我们希望将上面默认的对话框外观修改为如下图所示的新对话框风格:
该对话框将支持下面特性:
- 可从资源或者字符串直接指定对话框标题
- 可从资源、字符串和自定义布局来设置对话框内容
- 可设置按钮和相应的事件处理
编写布局、样式和主题
该对话框使用一个定制的布局来输出内容,布局定义的id将用于访问标题 TextView,下面是定义文件:
- <?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:minWidth="280dip"
- android:layout_height="wrap_content">
- <LinearLayout
- android:orientation="vertical"
- android:background="@drawable/header"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <TextView
- style="@style/DialogText.Title"
- android:id="@+id/title"
- android:paddingRight="8dip"
- android:paddingLeft="8dip"
- android:background="@drawable/title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- </LinearLayout>
- <LinearLayout
- android:id="@+id/content"
- android:orientation="vertical"
- android:background="@drawable/center"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <TextView
- style="@style/DialogText"
- android:id="@+id/message"
- android:padding="5dip"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"/>
- </LinearLayout>
- <LinearLayout
- android:orientation="horizontal"
- android:background="@drawable/footer"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <Button
- android:id="@+id/positiveButton"
- android:layout_marginTop="3dip"
- android:layout_width="0dip"
- android:layout_weight=""
- android:layout_height="wrap_content"
- android:singleLine="true"/>
- <Button
- android:id="@+id/negativeButton"
- android:layout_marginTop="3dip"
- android:layout_width="0dip"
- android:layout_weight=""
- android:layout_height="wrap_content"
- android:singleLine="true"/>
- </LinearLayout>
- </LinearLayout>
根节点 LinearLayout 的宽度设置为 fill_parent 而最小的宽度是 280dip ,因此对话框的宽度将始终为屏幕宽度的 87.5%
自定义的主题用于声明对话框是浮动的,而且使用自定义的背景和标题视图:
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <style name="Dialog" parent="android:style/Theme.Dialog">
- <item name="android:windowBackground">@null</item>
- <item name="android:windowNoTitle">true</item>
- <item name="android:windowIsFloating">true</item>
- </style>
- </resources>
接下来我们需要定义对话框的标题和消息的显示:
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <style name="DialogText">
- <item name="android:textColor">#FF000000</item>
- <item name="android:textSize">12sp</item>
- </style>
- <style name="DialogText.Title">
- <item name="android:textSize">16sp</item>
- <item name="android:textStyle">bold</item>
- </style>
- </resources>
编写对话框和 Builder 类
最好我们要提供跟 AletDialog.Builder 类一样的方法:
- package net.androgames.blog.sample.customdialog.dialog;
- import net.androgames.blog.sample.customdialog.R;
- import android.app.Dialog;
- import android.content.Context;
- import android.content.DialogInterface;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup.LayoutParams;
- import android.widget.Button;
- import android.widget.LinearLayout;
- import android.widget.TextView;
- /**
- *
- * Create custom Dialog windows for your application
- * Custom dialogs rely on custom layouts wich allow you to
- * create and use your own look & feel.
- *
- * Under GPL v3 : http://www.gnu.org/licenses/gpl-3.0.html
- *
- * @author antoine vianey
- *
- */
- public class CustomDialog extends Dialog {
- public CustomDialog(Context context, int theme) {
- super(context, theme);
- }
- public CustomDialog(Context context) {
- super(context);
- }
- /**
- * Helper class for creating a custom dialog
- */
- public static class Builder {
- private Context context;
- private String title;
- private String message;
- private String positiveButtonText;
- private String negativeButtonText;
- private View contentView;
- private DialogInterface.OnClickListener
- positiveButtonClickListener,
- negativeButtonClickListener;
- public Builder(Context context) {
- this.context = context;
- }
- /**
- * Set the Dialog message from String
- * @param title
- * @return
- */
- public Builder setMessage(String message) {
- this.message = message;
- return this;
- }
- /**
- * Set the Dialog message from resource
- * @param title
- * @return
- */
- public Builder setMessage(int message) {
- this.message = (String) context.getText(message);
- return this;
- }
- /**
- * Set the Dialog title from resource
- * @param title
- * @return
- */
- public Builder setTitle(int title) {
- this.title = (String) context.getText(title);
- return this;
- }
- /**
- * Set the Dialog title from String
- * @param title
- * @return
- */
- public Builder setTitle(String title) {
- this.title = title;
- return this;
- }
- /**
- * Set a custom content view for the Dialog.
- * If a message is set, the contentView is not
- * added to the Dialog...
- * @param v
- * @return
- */
- public Builder setContentView(View v) {
- this.contentView = v;
- return this;
- }
- /**
- * Set the positive button resource and it's listener
- * @param positiveButtonText
- * @param listener
- * @return
- */
- public Builder setPositiveButton(int positiveButtonText,
- DialogInterface.OnClickListener listener) {
- this.positiveButtonText = (String) context
- .getText(positiveButtonText);
- this.positiveButtonClickListener = listener;
- return this;
- }
- /**
- * Set the positive button text and it's listener
- * @param positiveButtonText
- * @param listener
- * @return
- */
- public Builder setPositiveButton(String positiveButtonText,
- DialogInterface.OnClickListener listener) {
- this.positiveButtonText = positiveButtonText;
- this.positiveButtonClickListener = listener;
- return this;
- }
- /**
- * Set the negative button resource and it's listener
- * @param negativeButtonText
- * @param listener
- * @return
- */
- public Builder setNegativeButton(int negativeButtonText,
- DialogInterface.OnClickListener listener) {
- this.negativeButtonText = (String) context
- .getText(negativeButtonText);
- this.negativeButtonClickListener = listener;
- return this;
- }
- /**
- * Set the negative button text and it's listener
- * @param negativeButtonText
- * @param listener
- * @return
- */
- public Builder setNegativeButton(String negativeButtonText,
- DialogInterface.OnClickListener listener) {
- this.negativeButtonText = negativeButtonText;
- this.negativeButtonClickListener = listener;
- return this;
- }
- /**
- * Create the custom dialog
- */
- public CustomDialog create() {
- LayoutInflater inflater = (LayoutInflater) context
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- // instantiate the dialog with the custom Theme
- final CustomDialog dialog = new CustomDialog(context,
- R.style.Dialog);
- View layout = inflater.inflate(R.layout.dialog, null);
- dialog.addContentView(layout, new LayoutParams(
- LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
- // set the dialog title
- ((TextView) layout.findViewById(R.id.title)).setText(title);
- // set the confirm button
- if (positiveButtonText != null) {
- ((Button) layout.findViewById(R.id.positiveButton))
- .setText(positiveButtonText);
- if (positiveButtonClickListener != null) {
- ((Button) layout.findViewById(R.id.positiveButton))
- .setOnClickListener(new View.OnClickListener() {
- public void onClick(View v) {
- positiveButtonClickListener.onClick(
- dialog,
- DialogInterface.BUTTON_POSITIVE);
- }
- });
- }
- } else {
- // if no confirm button just set the visibility to GONE
- layout.findViewById(R.id.positiveButton).setVisibility(
- View.GONE);
- }
- // set the cancel button
- if (negativeButtonText != null) {
- ((Button) layout.findViewById(R.id.negativeButton))
- .setText(negativeButtonText);
- if (negativeButtonClickListener != null) {
- ((Button) layout.findViewById(R.id.negativeButton))
- .setOnClickListener(new View.OnClickListener() {
- public void onClick(View v) {
- negativeButtonClickListener.onClick(
- dialog,
- DialogInterface.BUTTON_NEGATIVE);
- }
- });
- }
- } else {
- // if no confirm button just set the visibility to GONE
- layout.findViewById(R.id.negativeButton).setVisibility(
- View.GONE);
- }
- // set the content message
- if (message != null) {
- ((TextView) layout.findViewById(
- R.id.message)).setText(message);
- } else if (contentView != null) {
- // if no message set
- // add the contentView to the dialog body
- ((LinearLayout) layout.findViewById(R.id.content))
- .removeAllViews();
- ((LinearLayout) layout.findViewById(R.id.content))
- .addView(contentView,
- new LayoutParams(
- LayoutParams.WRAP_CONTENT,
- LayoutParams.WRAP_CONTENT));
- }
- dialog.setContentView(layout);
- return dialog;
- }
- }
- }
使用自定义的 Builder
使用方法很简单:
- /**
- * Build the desired Dialog
- * CUSTOM or DEFAULT
- */
- @Override
- public Dialog onCreateDialog(int dialogId) {
- Dialog dialog = null;
- switch (dialogId) {
- case CUSTOM_DIALOG :
- CustomDialog.Builder customBuilder = new
- CustomDialog.Builder(CustomDialogActivity.this);
- customBuilder.setTitle("Custom title")
- .setMessage("Custom body")
- .setNegativeButton("Cancel",
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- CustomDialogActivity.this
- .dismissDialog(CUSTOM_DIALOG);
- }
- })
- .setPositiveButton("Confirm",
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- }
- });
- dialog = customBuilder.create();
- break;
- case DEFAULT_DIALOG :
- AlertDialog.Builder alertBuilder = new
- AlertDialog.Builder(CustomDialogActivity.this);
- alertBuilder.setTitle("Default title")
- .setMessage("Default body")
- .setNegativeButton("Cancel",
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- }
- })
- .setPositiveButton("Confirm",
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- CustomDialogActivity.this
- .dismissDialog(DEFAULT_DIALOG);
- }
- });
- dialog = alertBuilder.create();
- break;
- }
Android 对话框 (AlertDialog)的更多相关文章
- 少走弯路——Android对话框AlertDialog.Builder使用方法简述
android的自定义对话框,不需要通过继承的方式来实现,因为android已提供了相应的接口Dialog Builder ,下面就是 样例: new AlertDialog.Builder(this ...
- Android对话框
这周过的实在是艰辛,自打这周二起我的本本就开始闹"罢工",最后还是重装系统了事. . . 只是可怜了我的那些被格了的软件(悲伤辣么大)! 往事不要再提,人生几度风雨... 简 ...
- 11.Android之常用对话框AlertDialog学习
(1)首先我们写个简单的AlertDialog对话框,要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法,然后创建对话框可以设置对话框的属性,比如 ...
- Android:AlertDialog对话框
1.简单的ALertDialog: Dialog alertDialog = new AlertDialog.Builder(this) .setTitle("标题") .setM ...
- 【转】【Android】对话框 AlertDialog -- 不错不错
原文网址:http://blog.csdn.net/feng88724/article/details/6171450 本讲介绍一下Android基本组件:对话框AlertDialog. API: j ...
- Android中的对话框AlertDialog使用技巧合集-转载
Android中的对话框AlertDialog使用技巧合集 文章来自:http://blog.csdn.net/blue6626/article/details/6641105 今天我用自 ...
- Android——用对话框做登陆界面(自定义对话框AlertDialog,多线程,进度条ProgressDialog,ListView,GridView,SharedPreferences存,读数据,存取文本,assets文件)
效果: 1.点击图标进入页面二 2.页面2图片暂停显示5秒进入页面三 3.点击页面三登陆按钮,打开登陆对话框,输入密码进入页面四 点击下载按钮,显示水平进度条 点击保存和获取用户名和密码 进入页面六 ...
- android中提示&对话框----AlertDialog
AlertDialog(对话框) 一.对话框的基本使用流程 step1:创建AlertDialog.Buider; step2:调用setIcon()设置图标,setTitle()或者setCusto ...
- 【Android】Android中AlertDialog对话框的使用实例
package com.ceac.deng; import android.R.string; import android.support.v7.app.ActionBarActivity; imp ...
随机推荐
- python 查找字符串中字母的个数
2017.6.17 更新:好像知道错在哪里了.以第一个为例,输入应该是“AHHaaBBa”,因为直接输入AHHaaBBa时,系统不知到这是一个变量还是字符串,所以必须输入的时候申明定义.既然这样的话, ...
- Java之集合(十一)IdentityHashMap
转载请注明源出处:http://www.cnblogs.com/lighten/p/7381905.html 1.前言 查看JDK源码总是能发现一些新东西,IdentityHashMap也是Map的一 ...
- Eclipse打不开 提示an error has occurred.see the log file
有时由于Eclipse卡死,强制关闭之后会出现打不开的情况.弹窗提示: 查看log文件,发现有这样的信息: !MESSAGE The workspace exited with unsaved ch ...
- Flow类
JLS参考:https://docs.oracle.com/javase/specs/jls/se7/html/jls-16.html This pass implements dataflow an ...
- switch开关
1.开关按钮 效果如下图 2.css代码 .form-switch{ display: inline-block; } .form-switch input[type="checkbox&q ...
- php的$GLOBALS例子
<?php $test = "test"; function show1($abc){//直接把参数传入函数,函数能用 echo $abc.'<br>'; } f ...
- 关于 AXI协议的学习解释说明
AXI(Advanced eXtensible Interface)是一种总线协议,该协议是ARM公司提出的AMBA(Advanced Microcontroller Bus Architecture ...
- jenkins自动化部署
目录 typora-copy-images-to: pic Jenkins部署文档 一.安装环境 1.CentOs下安装JDK 2.CentOS安装Maven 3.CentOS安装git 4.Cent ...
- Fiddler——PC上实现手机的抓包(转载 http://www.jianshu.com/p/13f8a81d7c7c)
Fiddler是15年初,在千牛中做超级促销插件时,发现没有root的Android机和没有越狱的iPhone无法修改host,因此没办法测试.为了让我这个磨人的PD也能看到,开发推荐了Fiddler ...
- 使用 Nginx + Tomcat 搭建负载均衡
负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性. 负载均衡,英文名称为Load Balance, ...