在我们的日常项目中很多地方会用到对话框,但是Android系统为我们提供的对话框样子和我们精心设计的界面很不协调,在这种情况下我们想很自由的定义对话框,或者有的时候我们的对话框是一个图片,没有标题和按钮,例如这样的一系列需求,这一篇文章我们来给大家介绍一下如何像使用Activity一样来自定义我们的对话框。

一般自定义对话框有下面几种办法:

1、重写Dialog来实现。

2、获取Dialog的Window对象实现。

3、使用WindowManager来实现。

4、使用DialogTheme来实现。

下面我们来介绍一下第二种和第四种方式,并且将封装好的代码贴出,第三种方式待后面对WindowManager进行介绍的时候再说。

转载请说明出处:http://blog.csdn.net/dawanganban

一、自定义Dialog

主界面布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/dialog_custom_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="自定义对话框"/>
<Button
android:id="@+id/dialog_activity_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Activity对话框"/>
</LinearLayout>

用两个按钮来分别弹出两种类型的对话框

public class MainActivity extends Activity implements OnClickListener{

	@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.dialog_custom_button).setOnClickListener(this);
findViewById(R.id.dialog_activity_button).setOnClickListener(this);
} @Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.dialog_custom_button:
DialogCustom dc = new DialogCustom(MainActivity.this, R.layout.dialog);
dc.setDismissButtonId(R.id.close_dialog);
break;
case R.id.dialog_activity_button:
Intent intent = new Intent(MainActivity.this, DialogActivity.class);
startActivity(intent);
break;
default:
break;
}
}
}

对自定义对话框的方法进行了简单封装,方便使用,可以依据你的项目需求进行封装。

package com.example.testcustomdialog;

import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window; /**
* 公用的自定义对话框
* @author Administrator
*
*/
public class DialogCustom{ private android.app.AlertDialog.Builder builder;
private int layout;
private AlertDialog dialog;
private Window window; public DialogCustom(Context context, int layout){
builder = new AlertDialog.Builder(context);
this.layout = layout;
} public DialogCustom(Context context, int theme, int layout){
builder = new AlertDialog.Builder(context, theme);
this.layout = layout;
} public Builder getBuilder(){
return builder;
} /**
* 获取对话框的Window对象
* @return
*/
public Window getWindow(){
dialog = builder.create();
dialog.show();
window = dialog.getWindow();
window.setContentView(layout);
return window;
} /**
* 通过ID获取对应的View
* @param id
* @return
*/
public View getViewById(int id){
if(window == null) getWindow();
return window.findViewById(id);
} /**
* 设置需要添加关闭事件的按钮ID
* @param id
*/
public void setDismissButtonId(int id){
View view = getViewById(id);
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
} /**
* 关闭对话框
*/
public void dismiss(){
if(dialog != null){
dialog.dismiss();
}
}
}

然后创建Dialog对象添加监听View就可以了,主要工作在布局文件中,也就是你的对话框的内容。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:paddingBottom="30dip"
android:background="#ffffff">
<TextView
android:layout_width="260dip"
android:layout_height="40dip"
android:layout_margin="30dip"
android:gravity="center"
android:text="这是ActivityDialog"/>
<Button
android:id="@+id/close_dialog"
android:layout_width="100dip"
android:layout_height="30dip"
android:text="点击关闭"
android:background="@drawable/close_butten_p"/>
</LinearLayout>
</LinearLayout>

二、使用DialogTheme

    <style name="DialogActivityTheme" parent="android:style/Theme.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:width">1px</item>
<item name="android:height">1px</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
<item name="android:backgroundDimEnabled">true</item>
</style>

在ActivityManifest.xml中注册DialogActivity

        <activity
android:name="com.example.testcustomdialog.DialogActivity"
android:theme="@style/DialogActivityTheme"
android:screenOrientation="portrait"></activity>

这样我们就可以像使用普通Activity一样创建一个对话框了,是不是很简单。

三、两种对话框总结

运行起来看似一样的对话框却有很大区别,使用第二种方式创建的对话框其实是一个Activity,所以具有Activity的生命周期和所有特性。它会影响到栈中的其他Activity的生命周期。而且如果在对话框中有需要输入的输入框,建议使用这种方式,可以自动调出输入法并使屏幕自动适应,而第一种方式的对话框创建特别方便,在需要显示一段提示信息的时候建议使用。(源代码下载:http://download.csdn.net/detail/lxq_xsyu/8315023

CSDN博客之星活动开始了,为我投上一票吧:http://vote.blog.csdn.net/blogstar2014/details?username=lxq_xsyu#content

Android自定义组件系列【13】——Android自定义对话框如此简单的更多相关文章

  1. Android自定义组件系列【5】——进阶实践(2)

    上一篇<Android自定义组件系列[5]--进阶实践(1)>中对任老师的<可下拉的PinnedHeaderExpandableListView的实现>前一部分进行了实现,这一 ...

  2. Android自定义组件系列【7】——进阶实践(4)

    上一篇<Android自定义组件系列[6]--进阶实践(3)>中补充了关于Android中事件分发的过程知识,这一篇我们接着来分析任老师的<可下拉的PinnedHeaderExpan ...

  3. Android自定义组件系列【6】——进阶实践(3)

    上一篇<Android自定义组件系列[5]--进阶实践(2)>继续对任老师的<可下拉的PinnedHeaderExpandableListView的实现>进行了分析,这一篇计划 ...

  4. Android自定义组件系列【4】——自定义ViewGroup实现双侧滑动

    在上一篇文章<Android自定义组件系列[3]--自定义ViewGroup实现侧滑>中实现了仿Facebook和人人网的侧滑效果,这一篇我们将接着上一篇来实现双面滑动的效果. 1.布局示 ...

  5. Android自定义组件系列【3】——自定义ViewGroup实现侧滑

    有关自定义ViewGroup的文章已经很多了,我为什么写这篇文章,对于初学者或者对自定义组件比较生疏的朋友虽然可以拿来主义的用了,但是要一步一步的实现和了解其中的过程和原理才能真真脱离别人的代码,举一 ...

  6. Android自定义组件系列【17】——教你如何高仿微信录音Toast

    一.Toast介绍 平时我们在Android开发中会经常用到一个叫Toast的东西,官方解释如下 A toast is a view containing a quick little message ...

  7. Android自定义组件系列【8】——遮罩文字动画

    遮罩文字的动画我们在Flash中非常常见,作为Android的应用开发者你是否也想将这种动画做到你的应用中去呢?这一篇文章我们来看看如何自定义一个ImageView来实现让一张文字图片实现文字的遮罩闪 ...

  8. Android自定义组件系列【5】——进阶实践(1)

    接下来几篇文章将对任老师的博文<可下拉的PinnedHeaderExpandableListView的实现>分步骤来详细实现,来学习一下大神的代码并记录一下. 原文出处:http://bl ...

  9. Android自定义组件系列【2】——Scroller类

    在上一篇中介绍了View类的scrollTo和scrollBy两个方法,对这两个方法不太了解的朋友可以先看<自定义View及ViewGroup> scrollTo和scrollBy虽然实现 ...

随机推荐

  1. 一个icon的选中与不选中

    页面的样式展示 1.页面中选中的状态 2.页面中未选中的状态 3.俩个icon代表的状态 页面的布局展示 <label> <i class="iconfont icon-d ...

  2. Linux Shell脚本编程-函数

    函数介绍  定义:把一段独立功能的的代码当做一个整体,并为之一个名字,命名的代码段,此即为函数:  功能:函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程.  注意: ...

  3. Java基础学习总结(21)——数组

    一.数组的基本概念 数组可以看成是多个相同类型数据组合,对这些数据的统一管理. 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量. 数组的元素可以是任何数据类型,包括基 ...

  4. svn 的使用(二)

    这篇主要介绍下 svn 钩子的使用,svn 的安装以及配置等能够查看svn 的使用(一) 我们能够在svn创建的仓库目录下看到 hooks 目录. 这里面就存放这个各种svn操作同一时候会运行的脚本文 ...

  5. How to test Heat (by quqi99)

    作者:张华  发表于:2015-12-19版权声明:能够随意转载.转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 (http://blog.csdn.net/quqi99 ) Heat ...

  6. 封装html代码块到js函数中

    有时候想把公共的html封装起来,怎么处理呢? 好多页面都用到,不可能每个页面都写,这样就会有冗余,并且不好统一处理. 那就用js来重构html吧. 代码案例如下: <footer class= ...

  7. scikit-learn的线性回归

    scikit-learn的线性回归预测Google股票 这是机器学习系列的第一篇文章. 本文将使用Python及scikit-learn的线性回归预测Google的股票走势.请千万别期望这个示例能够让 ...

  8. POJ 3189 二分+Dinic

    题意: 思路: 二分跨度 枚举最低座次 建图:源点向每头牛连边权为1的边 每头牛向当前枚举的B的区间这段连上边权为1的边 所有座次向汇点连边权为牛棚容量的边 判判流量是不是等于n 一开始写得是直接枚举 ...

  9. 使用INSERT…SELECT语法插入记录(三十二)

    前面,我们在谈INSERT语句时,使用两种语句:INSERT…SELECT  和  INSERT…VALUES. INSERT…SELECT可以使用子查询.因为在写SELECT时.  ***  =   ...

  10. 远程带参数POST访问接口,返回数据

    1. string token = GetRequest.GetString("token"); int customer_id = GetRequest.GetInt(" ...