您的位置:首页 > 移动开发 > Android开发

[Android]自定义dialog

2015-07-18 15:32 417 查看
在我们项目开发的时候,总是需要使用同一种格式的dialog,但是,每次我们都需要把那一大段一大段的代码复制过去,这无疑是非常不明智的选择,后来,我想为什么我不把那些dialog封装起来当成一个对象,等我们以后需要用到的时候,自己new这个对象,然后实现它的左右键监听不就行了么。以下为运用时的代码:

MyDialog my = new MyDialog(MainActivity.this);
		my.showDialog("中", "左", "右", new MyDialogCallBack() {
			
			public void onRightBtnFun() {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, "右", Toast.LENGTH_SHORT).show();
			}
			
			public void onLeftBtnFun() {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, "左", Toast.LENGTH_SHORT).show();
			}
		});


以下为效果图:



这种做法的优点,毋庸置疑便是使用的时候简便快捷,能够快速的生成dialog。

以下为实现代码:

(1)***页面布局

<?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="120dp"
    android:layout_gravity="center"
    android:layout_marginLeft="30dp"
    android:layout_marginRight="30dp"
    android:background="@color/white"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tvmessage"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="20dp"
        android:textColor="@color/dialog_message"
        android:textSize="16sp" />

    <View
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="@color/dialog_line" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="45dp"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/tvleft"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:background="@drawable/dialog_btn"
            android:gravity="center"
            android:textColor="@color/bg"
            android:textSize="17sp" />

        <View
            android:layout_width="1dp"
            android:layout_height="fill_parent"
            android:background="@color/dialog_line" />

        <TextView
            android:id="@+id/tvright"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:background="@drawable/dialog_btn"
            android:gravity="center"
            android:textColor="@color/bg"
            android:textSize="17sp" />
    </LinearLayout>

</LinearLayout>



(2)为了使其产生背景透明的效果,我们需要在style.xml里面创建自定义style

<style name="MyDialogStyleBottom" parent="android:Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <!-- 边框 -->
        <item name="android:windowIsFloating">true</item>
        <!-- 是否浮现在activity之上 -->
        <item name="android:windowIsTranslucent">true</item>
        <!-- 半透明 -->
        <item name="android:windowNoTitle">true</item>
        <!-- 无标题 -->
        <item name="android:windowBackground">@android:color/transparent</item>
        <!-- 背景透明 -->
        <item name="android:backgroundDimEnabled">true</item>
        <!-- 模糊 -->
      
    </style>

在这里设置了一下



便可以看到下图的效果:



(3)创建MyDialog类,定义以下成员变量并实现其构造方法:

/** 屏幕宽度像素 */
	private int width;
	/** 自定义对话框 */
	private MyDialog myDialog;
	/** 对话框中的内容 */
	private TextView tvMessage;
	/** 对话框中的左键 */
	private TextView tvLeft;
	/** 对话框中的右键 */
	private TextView tvRight;
	/** 显示Dialog的Activity */
	private Activity activity;
	/** 上下文 */
	private Context context;
	/** dialog左右键的回调类 */
	private MyDialogCallBack myDialogCallBack;


public MyDialog(Context context) {
		this(context, R.style.MyDialogStyleBottom);
	}

	public MyDialog(Context context, int theme) {
		super(context, theme);
		this.activity = (Activity)context;
		this.context = context;
	}


(4)定义用于回调的类:

/**
	 * 用于实现dialog左右按钮的点击功能
	 * 
	 * @author xiejinxiong
	 * 
	 */
	public interface MyDialogCallBack {

		/**
		 * dialog左键功能
		 */
		void onLeftBtnFun();

		/**
		 * dialog右键功能
		 */
		void onRightBtnFun();
	}


(5)开始编写其初始化方法,其中包括初始化屏幕像素,初始化UI页面,初始化页面数据

/**
	 * 初始化对话框
	 * 
	 * @param context
	 * @param strMeaasge
	 * @param strLeft
	 * @param strRight
	 */
	public void showDialog(String strMeaasge, String strLeft, String strRight,
			MyDialogCallBack myDialogCallBack) {

		this.myDialogCallBack = myDialogCallBack;
		// myDialog = new MyDialog(context);
		myDialog = this;
		InitPixels();
		initDialogUI(this.context);
		initDialogInfo(strMeaasge, strLeft, strRight);

		myDialog.setCanceledOnTouchOutside(false);
		myDialog.show();
	}
(5.1)初始化屏幕像素

/**
	 * 初始化屏幕像素
	 */
	public void InitPixels() {
		DisplayMetrics metric = new DisplayMetrics();
		this.activity.getWindowManager().getDefaultDisplay().getMetrics(metric);
		// height = metric.heightPixels;
		width = metric.widthPixels;
	}


(5.2.1)初始化UI页面

/**
	 * 初始化UI
	 */
	private void initDialogUI(Context context) {

		View view = LayoutInflater.from(context).inflate(
				R.layout.dialog_layout, null, false);
		initDialogListener(view);

		Window window = myDialog.getWindow();
		window.setContentView(view);
		WindowManager.LayoutParams p = window.getAttributes(); // 获取对话框当前的参数值
		p.height = LayoutParams.WRAP_CONTENT;
		p.width = (int) (width * 0.8); // 宽度设置为屏幕的0.8
		window.setAttributes(p);
	}


(5.2.2)初始化普通对话框监听

/**
	 * 初始化普通对话框并显示内容
	 * 
	 * @param view
	 */
	private void initDialogListener(View view) {
		// 对话框中的内容
		tvMessage = (TextView) view.findViewById(R.id.tvmessage);

		// 对话框中的左键
		tvLeft = (TextView) view.findViewById(R.id.tvleft);

		tvLeft.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				// dialogLeftBtnFunction();
				// if (myDialogCallBack != null) {
				myDialogCallBack.onLeftBtnFun();
				// } else {
				// myDialogCallBackCenter.onCenterBtnFun();
				// }

				myDialog.dismiss();
			}
		});

		// 对话框中的右键
		tvRight = (TextView) view.findViewById(R.id.tvright);
		// if (myDialogCallBack != null) {
		tvRight.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				// dialogRightBtnFunction();
				myDialogCallBack.onRightBtnFun();
				myDialog.dismiss();
			}
		});
		// } else {
		// tvRight.setVisibility(View.GONE);
		// }
	}


(5.3)显示dialog数据

/**
	 * 设置dialog的信息
	 * 
	 * @param strMeaasge
	 * @param strLeft
	 * @param strRight
	 */
	private void initDialogInfo(String strMeaasge, String strLeft,
			String strRight) {
		tvMessage.setText(strMeaasge);
		tvLeft.setText(strLeft);
		tvRight.setText(strRight);
	}


(5.4)实现关闭dialog的方法

/**
	 * 关闭dialog
	 */
	public void closeDialog() {
		if (myDialog != null) {
			myDialog.dismiss();
		}
	}


到了这里,就可以完整的吧dialog显示出来了。

但是,在这里突然想到了一个问题,那便是假如我的dialog只有一个按钮怎么办?难道要重新写一个类么,答案当然不是,实现的思路将两个按钮中的其中一个隐藏掉即可。

实现:

(1)另外添加一个用于回调的类:

/**
	 * 用于实现dialog中间键按钮的点击功能
	 * 
	 * @author xiejinxiong
	 * 
	 */
	public interface MyDialogCallBackCenter {

		/**
		 * dialog中间键功能
		 */
		void onCenterBtnFun();

	}


(2)另外添加一个初始化dialog的方法:

/**
	 * 初始化对话框(单个按钮)
	 * 
	 * @param strMeaasge
	 * @param strCenter
	 * @param myDialogCallBackCenter
	 */
	public void showDialog(String strMeaasge, String strCenter,
			MyDialogCallBackCenter myDialogCallBackCenter) {

		this.myDialogCallBackCenter = myDialogCallBackCenter;
		showDialog(strMeaasge, strCenter, "", null);
	}


(3)最终在初始化button的时候添加一个判断来设置是否隐藏其中一个按钮:

/**
	 * 初始化普通对话框并显示内容
	 * 
	 * @param view
	 */
	private void initDialogListener(View view) {
		// 对话框中的内容
		tvMessage = (TextView) view.findViewById(R.id.tvmessage);

		// 对话框中的左键
		tvLeft = (TextView) view.findViewById(R.id.tvleft);

		tvLeft.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				// dialogLeftBtnFunction();
				if (myDialogCallBack != null) {
					myDialogCallBack.onLeftBtnFun();
				} else {
					myDialogCallBackCenter.onCenterBtnFun();
				}

				myDialog.dismiss();
			}
		});

		// 对话框中的右键
		tvRight = (TextView) view.findViewById(R.id.tvright);
		if (myDialogCallBack != null) {
			tvRight.setOnClickListener(new View.OnClickListener() {

				public void onClick(View v) {
					// dialogRightBtnFunction();
					myDialogCallBack.onRightBtnFun();
					myDialog.dismiss();
				}
			});
		} else {
			tvRight.setVisibility(View.GONE);
		}
	}
(4)最终以下简单的代码便可以得到另外一种显示效果:

MyDialog my = new MyDialog(MainActivity.this);
		my.showDialog("内容", "中", new MyDialogCallBackCenter() {
			
			public void onCenterBtnFun() {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, "中", Toast.LENGTH_SHORT).show();
			}
		});




源码:http://download.csdn.net/detail/u011596810/9009559
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: