`

android 自定义Dialog.Builder弹出框

 
阅读更多
1.自定义Diolog类
package com.test.widget;

import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.test.R;

/**
 * 自定义弹出框
 * 
 * @author Administrator
 * 
 */
@SuppressWarnings("all")
public class CustomDialog extends Dialog {

	public CustomDialog(Context context) {
		super(context);
	}

	public CustomDialog(Context context, int theme) {
		super(context, theme);
	}

	// 主要是重写Bulder内部类
	public static class Builder {

		private Context context;
		private String title;
		private String message;
		private String positiveButtonText;
		private String negativeButtonText;
		private View contentView;
		private DialogInterface.OnClickListener positiveButtonClickListener;
		private DialogInterface.OnClickListener negativeButtonClickListener;

		public Builder(Context context) {
			this.context = context;
		}

		public Builder setMessage(String message) {
			this.message = message;
			return this;
		}

		/**
		 * 设置的内容
		 * 
		 * @param message
		 * @return
		 */
		public Builder setMessage(int message) {
			this.message = (String) context.getText(message);
			return this;
		}

		/**
		 * 设置标题
		 * 
		 * @param title
		 * @return
		 */
		public Builder setTitle(int title) {
			this.title = (String) context.getText(title);
			return this;
		}

		/**
		 * 设置标题
		 * 
		 * @param title
		 * @return
		 */

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

		public Builder setContentView(View v) {
			this.contentView = v;
			return this;
		}

		/**
		 * 设置确定按钮
		 * 
		 * @param positiveButtonText
		 * @param listener
		 * @return
		 */
		public Builder setPositiveButton(int positiveButtonText,
				DialogInterface.OnClickListener listener) {
			this.positiveButtonText = (String) context
					.getText(positiveButtonText);
			this.positiveButtonClickListener = listener;
			return this;
		}

		public Builder setPositiveButton(String positiveButtonText,
				DialogInterface.OnClickListener listener) {
			this.positiveButtonText = positiveButtonText;
			this.positiveButtonClickListener = listener;
			return this;
		}

		public Builder setNegativeButton(int negativeButtonText,
				DialogInterface.OnClickListener listener) {
			this.negativeButtonText = (String) context
					.getText(negativeButtonText);
			this.negativeButtonClickListener = listener;
			return this;
		}

		public Builder setNegativeButton(String negativeButtonText,
				DialogInterface.OnClickListener listener) {
			this.negativeButtonText = negativeButtonText;
			this.negativeButtonClickListener = listener;
			return this;
		}
		// 这是自定义弹出框的关键
		public CustomDialog create() {
			LayoutInflater inflater = (LayoutInflater) context
					.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
			// instantiate the dialog with the custom Theme
			final CustomDialog dialog = new CustomDialog(context,
					R.style.Dialog);
			View layout = inflater.inflate(R.layout.dialog, null);
			dialog.addContentView(layout, new LayoutParams(
					LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
			// 设置标题
			((TextView) layout.findViewById(R.id.title)).setText(title);
			// 设置确认按钮
			if (positiveButtonText != null) {
				((Button) layout.findViewById(R.id.positiveButton))
						.setText(positiveButtonText);
				if (positiveButtonClickListener != null) {
					((Button) layout.findViewById(R.id.positiveButton))
							.setOnClickListener(new View.OnClickListener() {
								public void onClick(View v) {
									positiveButtonClickListener.onClick(dialog,
											DialogInterface.BUTTON_POSITIVE);
								}
							});
				}
			} else {
				//如果没有确认按钮则隐藏
				layout.findViewById(R.id.positiveButton).setVisibility(
						View.GONE);
			}
			// 设置取消按钮
			if (negativeButtonText != null) {
				((Button) layout.findViewById(R.id.negativeButton))
						.setText(negativeButtonText);
				if (negativeButtonClickListener != null) {
					((Button) layout.findViewById(R.id.negativeButton))
							.setOnClickListener(new View.OnClickListener() {
								public void onClick(View v) {
									negativeButtonClickListener.onClick(dialog,
											DialogInterface.BUTTON_NEGATIVE);
								}
							});
				}
			} else {
				//如果没有取消按钮则隐藏
				layout.findViewById(R.id.negativeButton).setVisibility(
						View.GONE);
			}
			// 设置消息
			if (message != null) {
				((TextView) layout.findViewById(R.id.message)).setText(message);
			} else if (contentView != null) {
				((LinearLayout) layout.findViewById(R.id.content))
						.removeAllViews();
				((LinearLayout) layout.findViewById(R.id.content)).addView(
						contentView, new LayoutParams(LayoutParams.MATCH_PARENT,
								LayoutParams.MATCH_PARENT));
			}
			// 把设置好的View加载到弹出框
			dialog.setContentView(layout);
			return dialog;
		}
	}
}



2.弹出框所使用的布局文件

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="false"
    android:orientation="vertical"
    android:padding="20.0dip" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:background="@drawable/bg_bombbox"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/title"
            style="@style/text_18_ffffff"
            android:layout_width="fill_parent"
            android:layout_height="40.0dip"
            android:gravity="center"
            android:text="@string/title_alert"
            android:visibility="visible" />

        <LinearLayout
			android:id="@+id/content"
    		android:layout_width="fill_parent"
     		android:layout_height="wrap_content"
            android:gravity="center" >
		      <TextView
		        android:id="@+id/message"
		        style="@style/text_16_666666"
		        android:layout_width="fill_parent"
		        android:layout_height="wrap_content"
		        android:gravity="left|center"
		        android:lineSpacingMultiplier="1.5"
		        android:minHeight="120.0dip"
		        android:paddingBottom="15.0dip"
		        android:paddingLeft="20.0dip"
		        android:paddingRight="20.0dip"
		        android:paddingTop="15.0dip" />
    	</LinearLayout>
		<!-- 设置分割线 -->
        <View
            android:layout_width="fill_parent"
            android:layout_height="1.0px"
            android:background="#8CC34B" />

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="60.0dip"
            android:layout_gravity="bottom"
            android:background="@drawable/dialog_bottom_bg"
            android:gravity="center"
            android:orientation="horizontal" >

            <Button
                android:id="@+id/positiveButton"
                style="@style/text_15_ffffff_sdw"
                android:layout_width="114.0dip"
                android:layout_height="40.0dip"
                android:background="@drawable/btn_ok_selector"
                android:gravity="center"
                android:text="@string/ok" />

            <Button
                android:id="@+id/negativeButton"
                style="@style/text_15_666666_sdw"
                android:layout_width="114.0dip"
                android:layout_height="40.0dip"
                android:layout_marginLeft="20.0dip"
                android:background="@drawable/btn_cancel_selector"
                android:gravity="center"
                android:text="@string/cancel" />
        </LinearLayout>
    </LinearLayout>

</FrameLayout>


3.activity内容

package com.test.activity;

import android.app.Activity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.Window;

import com.test.R;
import com.test.widget.CustomDialog;

public class DialogActivity extends Activity{
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
		setContentView(R.layout.dialogmain);
		// 自定义标题
		getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}
	
	public void showAlertDialog(View view) {

		CustomDialog.Builder builder = new CustomDialog.Builder(this);
		builder.setMessage("这个就是自定义的提示框");
		builder.setTitle("提示");
		builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				// 隐藏dialog
				dialog.dismiss();
				System.out.println("------------------点击确定----------------");
			}
		});

		builder.setNegativeButton("取消",
				new android.content.DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int which) {
						// 隐藏dialog
						dialog.dismiss();
						System.out.println("------------------点击取消----------------");
					}
				});
		builder.create().show();
	}
}



使用替换layout布局文件的方法

页面布局
<?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" >     
<!-- 顶部椭园边缘 -->
<ImageView        
  android:layout_width="400dp"        
  android:layout_height="22dp"        
  android:src="@drawable/dialog_top" >
</ImageView>
<!-- 中间白色背景,两个TextView,标题和内容,留一个LinearLayout,在代码中根据调用动态加上按钮 -->
<LinearLayout        
android:layout_width="400dp"        
android:layout_height="wrap_content"        android:background="@drawable/dialog_center"        
android:orientation="vertical" >         
<TextView android:textColor="#000000"            
android:textSize="35dp"            
android:gravity="center"            
android:id="@+id/title"            
android:layout_width="fill_parent"            
android:layout_height="wrap_content" />         
<TextView android:layout_marginLeft="20dp"            android:layout_marginRight="10dp"            
android:id="@+id/message"            
android:layout_marginBottom="10dp"            
android:layout_marginTop="20dp"            
android:textColor="#000000"            
android:textSize="25dp"            
android:layout_width="fill_parent"            
android:layout_height="wrap_content" />
<!-- 在LinearLayout中加按钮 -->
<LinearLayout            
android:id="@+id/buttonLayout"            
android:layout_width="fill_parent"            
android:layout_height="fill_parent"            
android:layout_gravity="center"            
android:gravity="center"            
android:orientation="horizontal" >         
</LinearLayout>
</LinearLayout>
<!-- 底部椭园边缘 -->
<ImageView        
android:layout_marginTop="-2dp"        
android:layout_width="400dp"       
android:layout_height="22dp"        
android:src="@drawable/dialog_bottom" >
</ImageView>
</LinearLayout>


selector

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_pressed="true" android:drawable="@drawable/dialog_button_pressed" />
    <item android:state_focused="true" android:drawable="@drawable/dialog_button_pressed" />
    <item android:drawable="@drawable/dialog_button" />
</selector>



public class AlertDialog {
    Context context;
    android.app.AlertDialog ad;
    TextView titleView;
    TextView messageView;
    LinearLayout buttonLayout;
    public AlertDialog(Context context) {
        // TODO Auto-generated constructor stub
        this.context=context;
        ad=new android.app.AlertDialog.Builder(context).create();
        ad.show();
        //关键在下面的两行,使用window.setContentView,替换整个对话框窗口的布局
        Window window = ad.getWindow();
        window.setContentView(R.layout.alertdialog);
        titleView=(TextView)window.findViewById(R.id.title);
        messageView=(TextView)window.findViewById(R.id.message);
        buttonLayout=(LinearLayout)window.findViewById(R.id.buttonLayout);
    }
    public void setTitle(int resId)
    {
        titleView.setText(resId);
    }
    public void setTitle(String title) {
        titleView.setText(title);
    }
    public void setMessage(int resId) {
        messageView.setText(resId);
    }  public void setMessage(String message)
    {
        messageView.setText(message);
    }
    /**
     * 设置按钮
     * @param text
     * @param listener
     */
    public void setPositiveButton(String text,final View.OnClickListener listener)
    {
        Button button=new Button(context);
        LinearLayout.LayoutParams params=new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        button.setLayoutParams(params);
        button.setBackgroundResource(R.drawable.alertdialog_button);
        button.setText(text);
        button.setTextColor(Color.WHITE);
        button.setTextSize(20);
        button.setOnClickListener(listener);
        buttonLayout.addView(button);
    }  /**
     * 设置按钮
     * @param text
     * @param listener
     */
    public void setNegativeButton(String text,final View.OnClickListener listener)
    {
        Button button=new Button(context);
        LinearLayout.LayoutParams params=new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        button.setLayoutParams(params);
        button.setBackgroundResource(R.drawable.alertdialog_button);
        button.setText(text);
        button.setTextColor(Color.WHITE);
        button.setTextSize(20);
        button.setOnClickListener(listener);
        if(buttonLayout.getChildCount()>0)
        {
            params.setMargins(20, 0, 0, 0);
            button.setLayoutParams(params);
            buttonLayout.addView(button, 1);
        }else{
            button.setLayoutParams(params);
            buttonLayout.addView(button);
        }  }
    /**
     * 关闭对话框
     */
    public void dismiss() {
        ad.dismiss();
    } }


调用方法

final AlertDialog ad=new AlertDialog(Test.this);
ad.setTitle("标题");
ad.setMessage("内容sdfsafdasf内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容");
ad.setPositiveButton("确定", new OnClickListener() { 
@Override                  
public void onClick(View v) {
    // TODO Auto-generated method stub
    ad.dismiss();
    Toast.makeText(Test.this, "被点到确定", Toast.LENGTH_LONG).show();        
}
}); 
ad.setNegativeButton("取消", new OnClickListener() { 
@Override                  
public void onClick(View v) {
// TODO Auto-generated method stub
ad.dismiss();
Toast.makeText(Test.this, "被点到取消", Toast.LENGTH_LONG).show();
}
});





转自:http://my.oschina.net/u/1036767/blog/266318?p=1
  • 大小: 16.9 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    自定义Dialog.zip

    "自定义Dialog.zip" 包含了一个实现七种动画效果的自定义Dialog示例,这将帮助开发者学习如何根据需求创建富有创意的弹出窗口。 首先,我们要了解Dialog的基本结构。Dialog通常由布局文件定义,包括标题(title)、...

    Android 自定义弹出框

    以上就是创建一个自定义Android弹出框的基本过程,其中`MyCommonDialog`可能是你在项目中创建的一个自定义Dialog类,包含了上述步骤的实现。通过这样的方式,你可以根据自己的设计和业务逻辑,打造出具有独特风格和...

    自定义dialog弹出框

    在Android开发中,自定义Dialog弹出框是一个常见的需求,它可以帮助我们提供更丰富的用户交互体验,使得信息提示或者操作选择更加个性化。本篇将详细讲解如何创建和使用自定义Dialog,以及涉及到的相关知识点。 ...

    android自定义弹出框实现(修改版).zip

    本项目“android自定义弹出框实现(修改版)”是一个针对原生Android弹出框进行定制化改造的例子,主要涉及Java编程语言。下面将详细讲解这个项目的重点知识点。 1. **自定义对话框类**: 在Android中,通常使用`...

    android 自定义Dialog源文件

    本篇文章将深入探讨如何实现Android中的自定义Dialog,包括弹出菜单、确认框和输入框的创建。 首先,我们要知道Dialog是Android系统提供的一种用户界面组件,用于在主界面之上显示一些临时信息或进行交互操作。默认...

    带三角的dialog弹出框

    在Android开发中,创建自定义对话框...总结来说,实现带三角的Dialog弹出框主要涉及自定义布局、自定义Dialog类以及调整三角形指示箭头的位置。通过这种方式,我们可以创建具有独特视觉效果的对话框,提升用户体验。

    Android支付底部弹窗自定义dialog

    接下来,我们需要创建自定义Dialog类,继承自`AppCompatDialogFragment`。在这个类中,我们将加载上面创建的布局,并实现点击事件处理。 ```java public class BottomPaymentDialog extends ...

    android 自定义退出提示弹出框

    在"android 自定义退出提示弹出框"这个场景中,开发者可能会根据应用风格选择`Dialog`或`PopupWindow`。如果希望用户有强烈的感知,使用`Dialog`可能更合适;如果希望保持界面简洁,不打断用户当前操作,`...

    Android自定义Dialog--DanmakuFlame弹幕发送框界面的实现

    以上就是实现Android自定义Dialog作为弹幕发送框界面的基本流程。在实际开发中,可能还需要考虑其他因素,比如弹幕的滚动速度、颜色、大小等自定义选项,以及错误处理和用户反馈等。通过熟练掌握Dialog和第三方库的...

    自定义Android Dialog EditText 密码输入框

    在Android开发中,自定义Dialog是一项常见的需求,它允许开发者根据应用的UI风格和功能需求进行个性化设计。本文将深入探讨如何自定义一个Android Dialog,特别是实现一个类似于支付密码输入框的功能,其中EditText...

    Android自定义弹出框

    本文将深入探讨如何在Android中自定义实现弹出框,主要关注`自定义Dialog`这一核心概念。 首先,要创建一个自定义的Dialog,我们需要继承自`DialogFragment`类。`DialogFragment`是Android提供的一个组件,它结合了...

    Android dialog单选、多选弹窗

    PopWindow是Android中另一种轻量级的弹出窗口,它可以在Activity之上显示任意的View。与Dialog不同,PopWindow没有预设的外观,完全由开发者自定义。它常用于快速操作或者显示额外的信息,如下拉菜单、快捷工具栏等...

    android 自定义对话框.zip项目安卓应用源码下载

    这可以通过在AndroidManifest.xml中为应用或Activity设置主题,或者在自定义Dialog类中设置Window属性来实现。 ```xml &lt;style name="CustomDialogTheme" parent="Theme.AppCompat.Light.Dialog"&gt; &lt;item name="...

    两种自定义Dialog,可随意扩展,一种首页App更新提示弹出框,显示更新内容等;第二种提示类似系统弹出框,随意更改布局及提示内容

    首先,我们来探讨第一种自定义Dialog:首页App更新提示弹出框。这种Dialog通常用于在应用启动时检查更新,并向用户展示新版本的更新内容。为了实现这样的功能,我们需要创建一个自定义的Dialog布局文件,包含更新...

    Android应用源码之android 自定义对话框.zip

    `Dialog`是Android系统提供的一个用于显示弹出式窗口的类,它通常用于展示警告、确认或提示信息。要创建自定义对话框,我们首先要创建一个新的`Dialog`实例,然后可以通过设置布局和添加组件来定制对话框的外观和...

    Android自定义Dialog显示GridView

    在Android开发中,自定义Dialog是一种常见的需求,它允许开发者为用户提供更为个性化和交互丰富的界面。本主题将深入探讨如何创建一个自定义Dialog,并在其中显示一个GridView,以实现更灵活的数据展示。以下是对这...

    自定义dialog弹出登录框

    总的来说,自定义Dialog弹出登录框涉及到了Android UI设计、事件监听、数据验证等多个方面,是Android开发中基础且重要的技能之一。通过以上步骤,开发者可以创建出符合自己应用风格的、具有完整功能的登录对话框。

    android自定义透明对话框,透明提示框,自定义Dialog

    在Android中,`Dialog`类是系统提供的对话框组件,它可以从Activity或Fragment中弹出。要创建一个基本的`Dialog`,你需要继承`AppCompatDialog`或者使用`AlertDialog.Builder`来构建。然而,为了实现透明效果,我们...

    自定义dialog实现登录框

    在Android开发中,自定义Dialog是一种常见的用户界面(UI)设计技术,用于提供与用户交互的弹出式窗口。通常,我们使用Dialog来显示重要的信息、提示或进行简单的操作,如登录、注册等。本教程将详细介绍如何在...

    安卓Android源码——HerilyAlertDialog完全自定义的Dialog.rar

    这个压缩包"安卓Android源码——HerilyAlertDialog完全自定义的Dialog.rar"包含了一个名为`HerilyAlertDialog`的自定义对话框实现,可以帮助开发者更好地理解和实现自定义Dialog功能。 `HerilyAlertDialog`可能是一...

Global site tag (gtag.js) - Google Analytics