Android自定义组件系列【13】——Android自定义对话框如此简单

在我们的日常项目中很多地方会用到对话框,但是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

时间: 2024-12-28 01:29:30

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

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

上一篇<Android自定义组件系列[5]--进阶实践(1)>中对任老师的<可下拉的PinnedHeaderExpandableListView的实现>前一部分进行了实现,这一篇我们来看看ExpandableListView的使用并实现剩下的部分. 原文出处:http://blog.csdn.net/singwhatiwanna/article/details/25546871 一.ExpandableListView的用法 ExpandableListView是ListView的

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

遮罩文字的动画我们在Flash中非常常见,作为Android的应用开发者你是否也想将这种动画做到你的应用中去呢?这一篇文章我们来看看如何自定义一个ImageView来实现让一张文字图片实现文字的遮罩闪烁效果,下面先来看看效果吧. (录屏幕延时导致效果看起来不是很好) 一.实现原理 实现原理是重写View的onCreate方法,获取图片资源后对每个像素的透明度进行修改来实现,再启动一个线程来循环改变某个区域中的像素透明度. RGBA基础知识:(下面几段介绍文字引用自维基百科) RGBA是代表Red

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

上一篇<Android自定义组件系列[5]--进阶实践(2)>继续对任老师的<可下拉的PinnedHeaderExpandableListView的实现>进行了分析,这一篇计划中间插一段"知识点",对Android中的事件分发机制进行解析.细心的朋友可能会发现,打开大牛写的Android项目,里面很多组件都是自定义的(这就是为什么界面和体验这么吸引你的原因),但是要灵活的去自定义组件就必须对手势(也就是各种监听)必须熟悉,能处理好事件之间的关系. 先看一段代码:

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

上一篇<>中补充了关于Android中事件分发的过程知识,这一篇我们接着来分析任老师的<可下拉的PinnedHeaderExpandableListView的实现>. 一.StickyLayout中的OnGiveUpTouchEventListener接口的作用是什么? public interface OnGiveUpTouchEventListener { public boolean giveUpTouchEvent(MotionEvent event); } 在Sticky

Android自定义组件系列【10】——随ViewPager滑动的导航条

昨天在用到ViewPager实现滑动导航的时候发现微信的导航条效果是跟随ViewPager的滑动而动的,刚开始想了一下,感觉可以使用动画实现,但是这个滑动是随手指时时变化的,貌似不可行,后来再网上搜了一下,找到一个开源代码,结果打开一看大吃一惊,这么简单的效果代码居然大概有300多行,太占手机存储空间了!后来自己干脆重写ViewGroup使用scrollTo方法实现了一下,具体实现过程如下: package com.example.slideupdownviewpage; import andr

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

简介 项目开发中发现问题.解决问题这个过程中会出现很多问题,比如重复出现.某个问题的遗留,这些问题的本质就是设计模式.今天记录设计模式的知识点. 内容 在java以及其他的面向对象设计模式中,类与类之间主要有6种关系,他们分别是:依赖.关联.聚合.组合.继承.实现.它们的耦合度依次增强. 依赖关系:对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系.关联关系:分为单向关联和双向关联.在java中,单向关联表现为:类A当中使用了

Android自定义组件系列【9】——Canvas绘制折线图

有时候我们在项目中会遇到使用折线图等图形,Android的开源项目中为我们提供了很多插件,但是很多时候我们需要根据具体项目自定义这些图表,这一篇文章我们一起来看看如何在Android中使用Canvas绘制折线图.先看看绘制的效果: 实现原理很简单,我就直接给出代码: package com.example.testcanvasdraw; import java.util.ArrayList; import java.util.List; import java.util.Random; impo

Android UI组件进阶(2)——仿Windows对话框

Android UI组件进阶(2)--仿Windows对话框 在开始本章前先祝大家中秋节快乐哈,相信很多上班的朋友都是放三天假的哈! 有时间的话回家陪陪父母吧!树欲静而风不止,子欲养而亲不待!岁月不饶人! 好了,道理和祝福语就说到这里了,今天给大家准备的是模仿Windows风格对话框! 效果图: 相信大部分的AlertDialog都是下面这个样子的: 今天给大家讲解的对话框是下面这样的: 对比两种对话框,站在用户的角度,相信你更加钟情于第二种颜色鲜明的对话框 好了下面就开始讲解如何制作模仿win

Android总结篇系列:Android 权限

权限是一种安全机制.Android权限主要用于限制应用程序内部某些具有限制性特性的功能使用以及应用程序之间的组件访问.在Android开发中,基本上都会遇到联网的需求,我们知道都需要加上联网所需要的权限: 1 <uses-permission android:name="android.permission.INTERNET" /> 实际上,在开发过程中,当我们使用了某些系统特性的功能,且此类特性需要包含相应权限时,如果在AndroidManifest.xml文件中相应申明