android自定义Dialog,仿QQ手机浏览器

以前一直不大喜欢android系统的对话框,这两天上班比较空闲,就试着模仿一下QQ浏览器的对话框。

本来以前想写个类继承Dialog,但受水平限制,没有实现。主要代码如下:


public class CustomAlertDialog
{
	private AlertDialog dialog;
	private LayoutInflater inflater;
	private Button leftBtn, midBtn, rightBtn;
	private LinearLayout titleLay, bottomLay;
	private ScrollView contentLay;
	private TextView title, contentMsg;
	private Context context;
	private View dialogView;
	
	public CustomAlertDialog(Context context)
	{
		this.context = context;
		inflater = LayoutInflater.from(context);
		dialogView = inflater.inflate(R.layout.dialog, null);
		
		bottomLay = (LinearLayout) dialogView.findViewById(R.id.dialog_btns);
		contentLay = (ScrollView) dialogView.findViewById(R.id.dialog_content_lay);
		dialog = new AlertDialog.Builder(context).create();
	}
	
	
	public void show() {
		dialog.show();
		dialog.getWindow().setContentView(dialogView);
	}
	
	public void dismiss() {
		if (dialog != null && dialog.isShowing()) {
			dialog.dismiss();
		}
	}
	
	public boolean isShowing() {
		if (dialog != null)
			return dialog.isShowing();
		return false;
	}
	
	public void setCancelable(boolean bool) {
		dialog.setCancelable(bool);
	}
	
	public void setContentView(View view) {
		contentLay.removeAllViews();
		contentLay.addView(view);
	}
	
	public void setMessage(String msg) {
		contentMsg = (TextView) dialogView.findViewById(R.id.dialog_content);
		contentMsg.setText(msg);
		contentMsg.setVisibility(View.VISIBLE);
	}
	
	public void setTitle(String title) {
		titleLay = (LinearLayout) dialogView.findViewById(R.id.dialog_title_lay);
		this.title = (TextView) dialogView.findViewById(R.id.dialog_title);
		titleLay.setVisibility(View.VISIBLE);
		this.title.setText(title);
	}
	
	public void setOnPositiveButton(String str, View.OnClickListener listener) {
		bottomLay.setVisibility(View.VISIBLE);
		leftBtn = (Button) dialogView.findViewById(R.id.dialog_left_btn);
		leftBtn.setVisibility(View.VISIBLE);
		leftBtn.setText(str);
		leftBtn.setOnClickListener(listener);
	}
	
	public void setOnNegativeButton(String str, View.OnClickListener listener) {
		bottomLay.setVisibility(View.VISIBLE);
		rightBtn = (Button) dialogView.findViewById(R.id.dialog_right_btn);
		rightBtn.setVisibility(View.VISIBLE);
		rightBtn.setText(str);
		rightBtn.setOnClickListener(listener);
	}
	
	public void setOnNeutralButton(String str, View.OnClickListener listener) {
		bottomLay.setVisibility(View.VISIBLE);
		midBtn = (Button) dialogView.findViewById(R.id.dialog_mid_btn);
		midBtn.setVisibility(View.VISIBLE);
		midBtn.setText(str);
		midBtn.setOnClickListener(listener);
	}
}

这个对话框的布局由标题部分,内容部分,和底部按钮部分组成,最多3个按钮,需要哪些按钮,只要设置这些按钮的listener就可以显示出来;内容部分,可以设置为自定义的View,也可以是简单的一个TextView(通过setMessage方法)。布局如下dialog.xml:


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="180dip" android:layout_height="160dip" >
    <LinearLayout android:id="@+id/dialog_title_lay" android:layout_width="fill_parent" android:layout_height="wrap_content"
        android:background="@drawable/alertdlg_title_bg" android:gravity="center_vertical" android:visibility="gone">
        <TextView android:id="@+id/dialog_title" android:layout_width="fill_parent" android:layout_height="wrap_content"
	   		android:text="标题" android:textSize="18sp" android:textColor="#000000" android:textStyle="bold"
	   		android:layout_marginLeft="10dip" android:layout_marginRight="10dip"/>
    </LinearLayout>
	<ScrollView android:id="@+id/dialog_content_lay" android:layout_width="fill_parent" android:layout_height="100dip"
        android:background="@drawable/alertdlg_content_bg" android:gravity="center" 
        android:layout_below="@id/dialog_title_lay">
	    <TextView android:id="@+id/dialog_content" android:layout_width="wrap_content" android:layout_height="wrap_content"
	        android:text="内容" android:textSize="16sp" android:textColor="#000000" android:visibility="gone"
	        android:layout_marginLeft="10dip" android:layout_marginRight="10dip" android:layout_marginTop="10dip"/>
    </ScrollView>
    <LinearLayout android:id="@+id/dialog_btns" android:layout_width="fill_parent" android:layout_height="wrap_content"
        android:background="@drawable/alertdlg_bottom_bg" android:layout_below="@id/dialog_content_lay"
        android:gravity="center" android:visibility="gone">
        <Button android:id="@+id/dialog_left_btn" android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:text="左按钮" android:background="@drawable/button_blue_normal" android:layout_marginRight="10dip"
            android:layout_marginLeft="10dip" android:layout_weight="1" android:visibility="gone"/>
        <Button android:id="@+id/dialog_mid_btn" android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:text="中按钮" android:background="@drawable/button_blue_normal" android:layout_marginRight="10dip"
            android:layout_marginLeft="10dip" android:layout_weight="1" android:visibility="gone"/>
        <Button android:id="@+id/dialog_right_btn" android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:text="右按钮" android:background="@drawable/button_blue_pressed" android:layout_marginRight="10dip"
            android:layout_marginLeft="10dip" android:layout_weight="1" android:visibility="gone"/>
    </LinearLayout>

</RelativeLayout>

测试界面,主要就2个按钮,主要看看不同的2个dialog,第一个显示3个按钮,中间内容是一个TextView;第二个显示一个按钮,中间是自定义的View:

public class TestCustomDialogActivity extends Activity {
	Button button1, button2;
	LayoutInflater inflater;
	CustomAlertDialog customAd;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        button1 = (Button) findViewById(R.id.button1);
        button2 = (Button) findViewById(R.id.button2);
        inflater = LayoutInflater.from(this);
        button1.setOnClickListener(new OnClickListener()
		{
			
			@Override
			public void onClick(View v) {
				customAd = new CustomAlertDialog(TestCustomDialogActivity.this);
				customAd.setTitle("密码被盗");
				customAd.setMessage("互联网用户数据泄密事件继续发酵。继CSDN、天涯、新浪等互联网公司后," +
						"京东商城、网易公司、支付宝也被卷入“泄密门”。昨日又有网友爆料称,交通银行和民生银行用户资料也遭外泄。" +
						"昨日中午,有爆料称交通银行7000万客户、民生银行3500万用户以及工行用户资料外泄," +
						"泄露数据包括用户的姓名、卡号、密码等敏感信息,并发布信息截图。" +
						"对此,三家银行昨天均发布声明否认有用户资料外泄。业内专家也指出,银行卡交易系统不可能存在明文密码。");
				customAd.setOnPositiveButton("确定", new OnClickListener()
				{
					@Override
					public void onClick(View v)
					{
						Toast.makeText(TestCustomDialogActivity.this, "左按钮", Toast.LENGTH_SHORT).show();
						customAd.dismiss();
					}
				});
				
				customAd.setOnNeutralButton("其他", new OnClickListener()
				{
					@Override
					public void onClick(View v)
					{
						Toast.makeText(TestCustomDialogActivity.this, "中按钮", Toast.LENGTH_SHORT).show();
						customAd.dismiss();
					}
				});
				
				customAd.setOnNegativeButton("取消", new OnClickListener()
				{
					
					@Override
					public void onClick(View v)
					{
						Toast.makeText(TestCustomDialogActivity.this, "右按钮", Toast.LENGTH_SHORT).show();
						customAd.dismiss();
					}
				});
				customAd.setCancelable(false);
				customAd.show();
				
			}
		});
        
        button2.setOnClickListener(new OnClickListener()
		{
			
			@Override
			public void onClick(View v)
			{
				customAd = new CustomAlertDialog(TestCustomDialogActivity.this);
				View view = inflater.inflate(R.layout.dialog_content, null);
				customAd.setContentView(view);
				customAd.setTitle("退出");
				customAd.setOnPositiveButton("确定", new OnClickListener()
				{
					@Override
					public void onClick(View v)
					{
						Toast.makeText(TestCustomDialogActivity.this, "确定退出", Toast.LENGTH_SHORT).show();
						customAd.dismiss();
					}
				});
				customAd.setCancelable(true);
				customAd.show();
			}
		});
    }
    
}






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值