一步步实现 仿制Android LOL多玩盒子(四) 自定义AlertDialog实现

android自带的AlertDialog格式比较单调,跟大多数应用的设计风格都不搭,能显示的内容也仅限于一些简单的文字、列表等。

AlertDialog的设计风格的调整一般有三种方式:1,在AlertDialog.Builder(context, theme)构造函数中传入自定义的主题,这种方式最便捷,但是可自定义的内容相当有限,只能改改字体颜色等,布局仍是固定的;2,使用 Builder.setView(layoutResId) 和 Builder.setCustomTitle(customTitleView) 两个方法改变内容区和标题区布局,底部的按钮可以通过改AlertDialog.Builder(context, theme)中的theme来做一些简单的定制,也可以在 Builder.setView 方法中设置的布局里面把按钮也放进去,然后定义监听事件;3,使用 AlertDialog.getWindow().setContentView(view); 方法来定制Dialog的布局,这种方法可以完全定制Dialog的所有东西;4,继承Dialog类,按照AlertDialog的格式重写一遍。

以上四种方法,个人比较喜欢第三种,实现简单又可完全达到目的。

下面是第三种方法的一个简单实现。暂时只支持显示提示消息,其他类型的弹框原理都跟这一样。

/**
 * 消息提示框
 * @author warren
 * @date 2015年1月5日
 */
public class MessageDialog {
	
	private DialogInterface.OnClickListener mListenerPostive;
	private DialogInterface.OnClickListener mListenerNegative;
	
	private AlertDialog mAlert;
	private AlertDialog.Builder mBuilder;
	
	private Context mContext;
	
	private String mStrTitle;
	private String mStrMessage;
	private String mStrOk;
	private String mStrCancel;
	
	private ViewGroup mVRoot;
	
	private LinearLayout mLlTitlePanel;
	private LinearLayout mLlContentPanel;
	private LinearLayout mLlButtonPanel;
	
	private TextView mTvTitle;
	private TextView mTvMessage;
	private Button mBtnPositive;
	private Button mBtnNegative;
	
	public MessageDialog(Context context){
		
		this.mContext = context;
		
		mVRoot = (ViewGroup) LayoutInflater.from(this.mContext).inflate(R.layout.dlg_message, null);
		mLlTitlePanel = (LinearLayout) this.mVRoot.findViewById(R.id.topPanel);
		mLlContentPanel = (LinearLayout) this.mVRoot.findViewById(R.id.contentPanel);
		mLlButtonPanel = (LinearLayout) this.mVRoot.findViewById(R.id.buttonPanel);
		
		mTvTitle = (TextView) this.mVRoot.findViewById(R.id.alertTitle);
		mTvMessage = (TextView) this.mVRoot.findViewById(R.id.message);
		mBtnPositive = (Button) this.mVRoot.findViewById(R.id.button1);
		mBtnNegative = (Button) this.mVRoot.findViewById(R.id.button2);
		
		mBuilder = new AlertDialog.Builder(context);
	}
	
	/**
	 * 显示Dialog
	 * @return
	 */
	public MessageDialog show(){
		
		// 没有设置标题就不显示标题区
		if(this.mStrTitle == null){
			mLlTitlePanel.setVisibility(View.GONE);
		} else {
			mTvTitle.setText(this.mStrTitle);
		}
		
		// 内容区无论如何都要显示
		mTvMessage.setText(mStrMessage == null ? "" : mStrMessage);
		
		if(this.mStrOk == null && this.mStrCancel == null){
			mLlButtonPanel.setVisibility(View.GONE);
		} else {
			if(mStrOk != null){
				mBtnPositive.setText(mStrOk);
				mBtnPositive.setOnClickListener(new View.OnClickListener() {
					
					@Override
					public void onClick(View v) {
						if(mListenerPostive != null){
							mListenerPostive.onClick(mAlert, DialogInterface.BUTTON1);
							mAlert.dismiss();
						}
					}
				});
			} else {
				mBtnPositive.setVisibility(View.GONE);
			}
			if(mStrCancel != null){
				mBtnNegative.setText(mStrCancel);
				mBtnNegative.setOnClickListener(new View.OnClickListener() {
					
					@Override
					public void onClick(View v) {
						if(mListenerNegative != null){
							mListenerNegative.onClick(mAlert, DialogInterface.BUTTON2);
							mAlert.dismiss();
						}
					}
				});
			} else {
				mBtnNegative.setVisibility(View.GONE);
			}
		}
		
		mAlert = mBuilder.show();
		
		// 显示Dialog后才能使用 setContentView 设置内容视图,否则会报异常,因为Dialog只有在显示渲染之后才能获得其窗口。
		mAlert.getWindow().setContentView(mVRoot);
		return this;
	}
	
	/**
	 * 隐藏Dialog
	 */
	public void dismiss(){
		if(mAlert != null && mAlert.isShowing()){
			mAlert.dismiss();
		}
	}
	
	/**
	 * 设置Dialog标题
	 * @param text
	 * @return
	 */
	public MessageDialog setTitle(String text){
		this.mStrTitle = text;
		return this;
	}
	
	/**
	 * 设置消息内容
	 * @param text
	 * @return
	 */
	public MessageDialog setMessage(String text){
		this.mStrMessage = text;
		return this;
	}
	
	/**
	 * 设置确定按钮
	 * @param text
	 * @param listener
	 * @return
	 */
	public MessageDialog setPositiveButton(String text, DialogInterface.OnClickListener listener){
		mStrOk = text;
		this.mListenerPostive = listener;
		return this;
	}
	
	/**
	 * 设置取消按钮
	 * @param text
	 * @param listener
	 * @return
	 */
	public MessageDialog setNegativeButton(String text, DialogInterface.OnClickListener listener){
		mStrCancel = text;
		this.mListenerNegative = listener;
		return this;
	}
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/parentPanel"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginEnd="8dip"
    android:layout_marginStart="8dip"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginEnd="30dp"
        android:layout_marginStart="30dp"
        android:background="@color/dlg_background"
        android:orientation="vertical" >

        <LinearLayout
            android:id="@+id/topPanel"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <LinearLayout
                android:id="@+id/title_template"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginEnd="16dip"
                android:layout_marginStart="16dip"
                android:gravity="center_vertical|start"
                android:minHeight="45dp"
                android:orientation="horizontal" >

                <TextView
                    android:id="@+id/alertTitle"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:ellipsize="end"
                    android:singleLine="true"
                    android:text="提示"
                    android:textColor="@color/greenblue"
                    android:textSize="16sp" />
            </LinearLayout>

            <View
                android:id="@+id/titleDivider"
                android:layout_width="match_parent"
                android:layout_height="2dip"
                android:background="@android:color/holo_blue_light" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/contentPanel"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:minHeight="45dp"
            android:orientation="vertical" >

            <ScrollView
                android:id="@+id/scrollView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:clipToPadding="false" >

                <TextView
                    android:id="@+id/message"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:paddingBottom="8dip"
                    android:paddingEnd="16dip"
                    android:paddingStart="16dip"
                    android:paddingTop="8dip"
                    android:textColor="@android:color/white" />
            </ScrollView>
        </LinearLayout>

        <LinearLayout
            android:id="@+id/buttonPanel"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:divider="?android:attr/dividerHorizontal"
            android:dividerPadding="0dip"
            android:orientation="vertical"
            android:showDividers="beginning" >

            <LinearLayout
                style="?android:attr/buttonBarStyle"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:measureWithLargestChild="true"
                android:orientation="horizontal" >

                <Button
                    android:id="@+id/button2"
                    style="?android:attr/buttonBarButtonStyle"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="start"
                    android:layout_weight="1"
                    android:background="@drawable/bg_btn_dialog"
                    android:maxLines="2"
                    android:textColor="@android:color/white"
                    android:textSize="14sp" />

                <Button
                    android:id="@+id/button1"
                    style="?android:attr/buttonBarButtonStyle"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="end"
                    android:layout_weight="1"
                    android:background="@drawable/bg_btn_dialog"
                    android:maxLines="2"
                    android:textColor="@android:color/white"
                    android:textSize="14sp" />
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>

</LinearLayout>

实现效果


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值