AlertDialog的基础实现

public class MainActivity extends Activity {

	protected int i;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	/*
	 * 文本对话框:有自己的固定布局/点击外部默认就可以关闭对话框/取消按钮,如果不执行逻辑操作,监听事件可以直接写成null
	 */
	public void showText(View view) {
		// 1.创建AlertDialog的构造器对象
		Builder builder = new AlertDialog.Builder(MainActivity.this);
		// 2.设置对话框的内容
		builder.setTitle("提示框");//标题
		builder.setIcon(R.drawable.ic_launcher);//图标
		builder.setMessage("一个简单的提示框");//内容
		// 设置确定(积极)按钮
		builder.setPositiveButton("确定", new OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				// 点击监听执行的逻辑操作
				Toast.makeText(MainActivity.this, "点击了确定按钮", 0).show();
			}
		});
		// 设置取消(消极)按钮
		builder.setNegativeButton("取消", null);
		// 3.显示对话框
		builder.show();
	}

	/*
	 * 弹出单选对话框:
	 */
	public void showSingle(View view) {
		Builder builder = new AlertDialog.Builder(MainActivity.this);
		builder.setTitle("请选择性别");//标题
		builder.setIcon(R.drawable.ic_launcher);//图标
		/**
		 * items:所有选项----数组 checkedItem :默认选中的条目的下标 listener:监听事件
		 */
		final String[] items={"男","女","人妖"};
		builder.setSingleChoiceItems(items, 2, new OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				i=which;
			}
		});
		
		builder.setPositiveButton("确定", new OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				Toast.makeText(MainActivity.this, "选择了:" + items[i], 0).show();
			}
		});
		builder.show();
	}

	/*
	 * 多选对话框
	 */
	public void showMore(View view) {
		Builder builder = new AlertDialog.Builder(MainActivity.this);
		builder.setTitle("请选择爱好");//标题
		/**
		 * items:展示的数据的数组 
		 * checkedItems:默认选中状态的数组 
		 * listener:监听事件
		 */
		final String[] items={"足球","篮球","乒乓球","羽毛球","玻璃球"};
		final boolean[] checkedItems={true,false,false,false,false};
		builder.setMultiChoiceItems(items, checkedItems, new OnMultiChoiceClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which, boolean isChecked) {
				//虽然没做任何逻辑操作,,,但是由于这个监听的存在,,,可以更改设置好的默认状态值
			}
		});
		
		builder.setPositiveButton("确定", new OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				//遍历状态得到选中的下标,进行取值
				for (int i = 0; i < checkedItems.length; i++) {
					if (checkedItems[i]) {//选中
						Toast.makeText(MainActivity.this, "爱好是:"+items[i], 0).show();
					}
				}
			}
		});
		builder.show();
	}
	
	/*
	 * 弹出自定义的对话框:自定义的是自己布局/必须通过本身的视图对象去找控件/如果想要显示,是使用dialog.show()/手动关闭的方法 dialog.dismiss();
	 */
	public void showMine(View view){
		//1.创建构造器对象
		Builder builder = new AlertDialog.Builder(MainActivity.this);
		//2.通过构造器对象,,,创建出来一个AlertDialog的对象
		final AlertDialog dialog = builder.create();
		//3.通过AlertDialog的对象,,,去设置自己的布局(视图对象)
		View contentView=View.inflate(MainActivity.this, R.layout.dialog_layout, null);
		dialog.setView(contentView);
		//4.可以执行逻辑操作,,,按钮的监听,,,找控件还是必须通过,视图对象去找
		Button btn = (Button) contentView.findViewById(R.id.btn);
		final EditText edit_text = (EditText) contentView.findViewById(R.id.edit_text);
		btn.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Toast.makeText(MainActivity.this, edit_text.getText().toString(), 0).show();
				//在自定义对话框中,,,可以进行手动的关闭对话框
				dialog.dismiss();
			}
		});
		//5.显示对话框
		dialog.show();
	}
	
	public void show_window(View view) {
		View view2=View.inflate(MainActivity.this, R.layout.activity_main, null);
		View contentView=View.inflate(MainActivity.this, R.layout.pop_layout, null);
		final PopupWindow window = new PopupWindow(contentView, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
		
		window.setBackgroundDrawable(new BitmapDrawable());
		window.setOutsideTouchable(true);
		
		window.setFocusable(true);
		window.setTouchable(true);
		
		Button btn1 = (Button) contentView.findViewById(R.id.btn1);
		final EditText edit_text1 = (EditText) contentView.findViewById(R.id.edit_text1);
		
		btn1.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Toast.makeText(MainActivity.this, edit_text1.getText().toString(), 0).show();
				window.dismiss();
			}
		});
		
		window.showAtLocation(view2, Gravity.BOTTOM, 0, 0);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现 AlertDialog 高斯模糊的方法与一般的 View 高斯模糊基本相同,只需要在 AlertDialog 的背景中添加高斯模糊效果即可。下面是使用 RenderScript 实现 AlertDialog 高斯模糊的示例代码: 1. 在 res/values/styles.xml 文件中定义一个 MyAlertDialogTheme 主题,用于设置 AlertDialog 的样式: ``` <style name="MyAlertDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert"> <item name="android:windowBackground">@drawable/dialog_bg_blur</item> </style> ``` 2. 在 res/drawable 文件夹中创建一个 dialog_bg_blur.xml 文件,用于设置 AlertDialog 背景: ``` <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 设置底层背景 --> <item android:id="@android:id/background"> <shape android:shape="rectangle"> <solid android:color="@android:color/transparent" /> </shape> </item> <!-- 设置高斯模糊层 --> <item android:id="@+id/dialog_blur_layer"> <bitmap android:src="@drawable/dialog_bg" /> </item> </layer-list> ``` 其中,dialog_bg.xml 是一个不带高斯模糊效果的背景图片。 3. 在 res/drawable-v21 文件夹中创建一个 dialog_bg_blur.xml 文件,用于设置 AlertDialog 背景(仅适用于 Android 5.0 及以上版本): ``` <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 设置底层背景 --> <item android:id="@android:id/background"> <shape android:shape="rectangle"> <solid android:color="@android:color/transparent" /> </shape> </item> <!-- 设置高斯模糊层 --> <item android:id="@+id/dialog_blur_layer"> <bitmap android:src="@drawable/dialog_bg" /> <blur android:radius="25dp" android:scale="1" /> </item> </layer-list> ``` 其中,blur 标签用于设置高斯模糊效果,radius 属性表示模糊半径,scale 属性表示模糊程度。 4. 在 Java 代码中创建一个 Bitmap 对象,用于存储高斯模糊后的图片: ``` private Bitmap getBlurBitmap(Context context, Bitmap bitmap) { // 创建一个空的 Bitmap 对象 Bitmap blurBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); // 创建一个 RenderScript 对象 RenderScript rs = RenderScript.create(context); // 创建一个 Allocation 对象,用于存储原始图片数据 Allocation input = Allocation.createFromBitmap(rs, bitmap); // 创建一个 Allocation 对象,用于存储高斯模糊后的图片数据 Allocation output = Allocation.createFromBitmap(rs, blurBitmap); // 创建一个 ScriptIntrinsicBlur 对象,用于实现高斯模糊效果 ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); // 设置高斯模糊半径 script.setRadius(25); // 执行高斯模糊 script.setInput(input); script.forEach(output); // 将高斯模糊后的图片数据保存到 Bitmap 对象中 output.copyTo(blurBitmap); // 销毁 RenderScript 对象 rs.destroy(); return blurBitmap; } ``` 5. 在 Java 代码中创建一个 AlertDialog 对象,并为其设置 MyAlertDialogTheme 主题: ``` AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.MyAlertDialogTheme); builder.setTitle("AlertDialog"); builder.setMessage("This is an AlertDialog with blur background."); builder.setPositiveButton("OK", null); builder.setNegativeButton("Cancel", null); AlertDialog dialog = builder.create(); ``` 6. 在 Java 代码中获取 dialog_blur_layer 图层,并为其设置高斯模糊后的 Bitmap 对象: ``` // 获取 dialog_blur_layer 图层 ViewGroup decorView = (ViewGroup) dialog.getWindow().getDecorView(); ViewGroup contentContainer = (ViewGroup) decorView.findViewById(android.R.id.content); FrameLayout container = (FrameLayout) contentContainer.getChildAt(0); ImageView blurLayer = (ImageView) container.findViewById(R.id.dialog_blur_layer); // 获取原始图片 Drawable drawable = blurLayer.getDrawable(); Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); drawable.draw(canvas); // 获取高斯模糊后的图片 Bitmap blurBitmap = getBlurBitmap(this, bitmap); // 将高斯模糊后的图片设置给 dialog_blur_layer 图层 blurLayer.setImageBitmap(blurBitmap); ``` 需要注意的是,Android 中的 RenderScript 只能在 Android 4.2(API 17)及以上版本中使用。在使用 RenderScript 时,需要注意内存的使用和回收,以避免内存泄漏和程序崩溃。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值