自定义dialog

上午闲来无事,写了个自定义的dialog,使用的话还算通用,略做修改就可以加到项目中了,先上图吧,比较无图无真相



基本的搭建就是3个部分,最上面的提示栏,中间的提示消息,下面的确定,取消按钮,当然一般提示栏那里会有图标的,这个我没加图片,项目需要的话,可以自己设置图片(被我GONE了),先看看自定义的继承dialog代码:

MyDialog.java

  

package com.example.dialog.widget;

import com.example.dialog.R;

import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class MyDialog extends Dialog {
	Context context;
	Button confirm, cancel;
	/**
	 * 是否有标题
	 */
	private boolean hasTitle;
	/**
	 * 提示内容
	 */
	private String content;
	/**
	 * 提示标题
	 */
	private String title;
	protected PositiveListener listener;
	public MyDialog(Context context) {
		super(context, R.style.alert);
		this.context = context;
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.dialog);
		confirm = (Button) findViewById(R.id.dialog_confirm);
		cancel = (Button) findViewById(R.id.dialog_cancel);
		confirm.setOnClickListener(GetPositiveButtonOnClickListener());
		cancel.setOnClickListener(GetNegativeButtonOnClickListener());
		LinearLayout dialog_top = (LinearLayout) findViewById(R.id.dialog_top);
		View title_red_line = (View) findViewById(R.id.title_red_line);
		if (hasTitle) {
			dialog_top.setVisibility(View.VISIBLE);
			title_red_line.setVisibility(View.VISIBLE);
		} else {
			dialog_top.setVisibility(View.GONE);
			title_red_line.setVisibility(View.GONE);
		}
		TextView titleTextView = (TextView) findViewById(R.id.dialog_title);
		titleTextView.setText(title);
		TextView messageTextView = (TextView) findViewById(R.id.dialog_message);
		messageTextView.setText(content);
	}

	protected View.OnClickListener GetNegativeButtonOnClickListener() {

		return new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				dismiss();
			}
		};
	}

	/**
	 * 获取确认按钮单击事件监听
	 * 
	 * @return 确认按钮单击事件监听
	 */
	protected View.OnClickListener GetPositiveButtonOnClickListener() {
		return new View.OnClickListener() {
			public void onClick(View v) {
//				Toast.makeText(context, "你点击了确认按钮", 1).show();
				// 这里写一个方法,当点击按钮之后就执行,但是这个方法在子类里执行,dialog调用这个方法
				if (listener != null) {
					listener.onConfrim();
				}
				dismiss();
			}
		};
	}

	public void setPositiveListener(PositiveListener listener) {
		this.listener = listener;
	}

	public interface PositiveListener {
		void onConfrim();
	}

	public void hasTitle(boolean hasTitle) {
		this.hasTitle = hasTitle;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public void setTitle(String title) {
		this.title = title;
	}

}
这里要提示新手的一些说明,系统自带的dialog有很多默认的东西,比如边框,背景之类的,因为需要自定义的,样式当然想用自己的,所以在构造方法中添加了style,

<style name="alert">
        <item name="android:windowBackground">@android:color/transparent</item>
        <!-- 设置背景为透明,不是系統默認的黑色 -->
      <!--   <item name="android:windowTitleStyle">@style/DialogWindowTitle</item> -->
        <!-- 标题样式 -->
        <item name="android:windowIsFloating">true</item><!-- 是否悬浮在activity上 -->
        <item name="android:windowContentOverlay">@null</item><!-- 窗口是否有遮盖 -->
        <item name="android:windowFrame">@null</item><!-- 去掉边框 -->
        <item name="android:windowNoTitle">true</item><!--去掉标题  -->
    </style>
上面的代码就可以消除掉系统默认的边框,背景之类的了,代码比较简单,就不解释了,在看看MainActivity中的使用

package com.example.dialog;

import com.example.dialog.widget.MyDialog;
import com.example.dialog.widget.MyDialog.PositiveListener;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
	private Button show;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		show = (Button) findViewById(R.id.show);
		final String text = getResources().getString(R.string.dialog_content);
		final String title = getResources().getString(R.string.tips);// 直接加载布局文件资源是比较慢的,所以一般先获取到资源,再填充到视图中
		show.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {

				MyDialog dialog = new MyDialog(MainActivity.this);
				dialog.setPositiveListener(new PositiveListener() {
					@Override
					public void onConfrim() {
						// 点击确认之后执行的事件
						Log.i("PositiveListener", "你调用了接口方法");
					}

				});
				dialog.hasTitle(true);
				dialog.setContent(text);
				dialog.setTitle(title);
				dialog.show();
			}
		});
	}

}
这里用一个按钮弹出dialog,一般点击dialog的确认按钮会执行一些事件,根据单例模式,事件不能写在dialog里,所以自己写一个接口,供确认按钮调用执行事件的方法,其他的诸如标题,内容之类的,都可以自己设置,代码对于一些异常如空指针的没做判断,如使用时有问题,可以自行加上,好了,记录下来供新手们copy,下面贴上代码地址

 http://pan.baidu.com/s/174hMe


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值