iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >详解Android中Dialog的使用
  • 467
分享到

详解Android中Dialog的使用

dialogAndroid 2022-06-06 04:06:08 467人浏览 安东尼
摘要

在Android中经常要使用Dialog来实现一些提示以及一些特殊的效果,而且样式也不一样,每次都得查一大堆资料,还不一定能解决,这里总结一些常用的Dialog的实践。 普通的

Android中经常要使用Dialog来实现一些提示以及一些特殊的效果,而且样式也不一样,每次都得查一大堆资料,还不一定能解决,这里总结一些常用的Dialog的实践。

普通的Dialog


//普通的AlertDialog对话框
findViewById(R.id.btn_common).setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
 builder.setTitle("普通的对话框的标题");
 builder.setMessage("这是一个普通的对话框的内容");
 builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
  @Override
  public void onClick(DialogInterface dialog, int which) {
  toast("取消");
  }
 });
 builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
  @Override
  public void onClick(DialogInterface dialog, int which) {
  toast("确定");
  }
 });
 AlertDialog dialog = builder.create();
 dialog.show();
 }
});

这里使用AlertDialog来显示一个系统的提示对话框,效果如下:

这里写图片描述

修改普通对话框的位置、大小、透明度

主要是在普通的dialog.show() 下面加上如下代码


//放在show()之后,不然有些属性是没有效果的,比如height和width
Window dialogWindow = dialog.getWindow();
WindowManager m = getWindowManager();
Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用
WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值
//设置高度和宽度
p.height = (int) (d.getHeight() * 0.4); // 高度设置为屏幕的0.6
p.width = (int) (d.getWidth() * 0.6); // 宽度设置为屏幕的0.65
//设置位置
p.gravity = Gravity.BOTTOM;
//设置透明度
p.alpha = 0.5f;
dialogWindow.setAttributes(p);

在这里,设置dialog的高为屏幕的高度的4/10,宽为屏幕宽带的6/10,同事位置为底部,透明度为半透明。当然还有很多其他属性,这里暂不介绍,你们可以自己试一试。效果如下:

这里写图片描述

使用普通的dialog来添加自定义布局

我们需自定义一个布局,如下:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="Http://schemas.android.com/apk/res/android"
 android:layout_width="100dp"
 android:layout_height="100dp"
 android:background="#00ff00">
 <TextView
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:gravity="center"
 android:textColor="#ff0000"
 android:text="你好"/>
</LinearLayout>

我们这里新建了一个布局设置高度和宽度为100dp,线性布局里面包裹了一个TextView,布局很简单,当然也可以自定义一个复杂的布局,这里就不介绍了。来看看Java代码的实现。


// 使用普通的dialog来添加自定义布局
findViewById(R.id.btn_custom2).setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
 builder.setView(R.layout.dialog_custom1);
 AlertDialog dialog = builder.create();
 dialog.show();
 }
});

我们直接把我们的布局通过builder设置进去,看看效果:

这里写图片描述

这里的Dialog非常丑,这是与AlertDialog的默认主题有关,下面我们通过自定义主题来改变对话框的样式来使对话框变得漂亮。
在values/styles.xml自定义样式继承Android:Theme.Dialog来实现自己的样式


<style name="MyCommonDialog" parent="android:Theme.Dialog">
 <!-- 背景颜色及透明程度 -->
 <item name="android:windowBackground">@android:color/transparent</item>
 <!-- 是否半透明 -->
 <item name="android:windowIsTranslucent">false</item>
 <!-- 是否没有标题 -->
 <item name="android:windowNoTitle">true</item>
 <!-- 是否浮现在activity之上 -->
 <item name="android:windowIsFloating">true</item>
 <!-- 是否背景模糊 -->
 <item name="android:backgroundDimEnabled">false</item>
 <!-- 设置背景模糊的透明度-->
 <item name="android:backgroundDimAmount">0.5</item>
</style>

这里样式的属性都有注释,没种样式不是必须的,你可以自己试着改变一些值来查看效果以便达到自己的最佳效果。
在创建dialog的时候将样式传过去

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this,R.style.MyCommonDialog);

现在的效果如下:

这里写图片描述

可以看的我们的布局的高度和宽带还是没效果,我们知道子空间的布局一般由布局来测量的于是我想到给这个布局的最外层套一个布局,看能不能达到我们的效果。

修改dialog_custom1.xml布局如下:


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <LinearLayout
 android:layout_width="100dp"
 android:layout_height="100dp"
 android:layout_centerInParent="true"
 android:background="#00ff00">
 <TextView
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:gravity="center"
  android:text="你好"
  android:textColor="#ff0000"/>
 </LinearLayout>
</RelativeLayout>

再次运行如下:

这里写图片描述

达到我们想要的效果了,这样你就可以引入样式和自定义布局实现各种对话框的效果了。

继承Dialog来实现Dialog

通过继承Dialog来实现自定义的Dialog,这样我们就可以在任何地方直接new我们的Dialog就可以实现特定的对话框了。

1.在values/styles.xml新建一个样式MyDialog


<style name="MyDialog" parent="android:Theme.Dialog">
 <!-- 背景颜色及透明程度 -->
 <item name="android:windowBackground">@android:color/transparent</item>
 <!-- 是否半透明 -->
 <item name="android:windowIsTranslucent">false</item>
 <!-- 是否没有标题 -->
 <item name="android:windowNoTitle">true</item>
 <!-- 是否浮现在activity之上 -->
 <item name="android:windowIsFloating">true</item>
 <!-- 是否背景模糊 -->
 <item name="android:backgroundDimEnabled">false</item>
 <!-- 设置背景模糊的透明度-->
 <item name="android:backgroundDimAmount">0.5</item>
</style>

2.新建一个MyDialog继承Dialog


public class MyDialog extends Dialog {
 //在构造方法里预加载我们的样式,这样就不用每次创建都指定样式了
 public MyDialog(Context context) {
 this(context, R.style.MyDialog);
 }
 public MyDialog(Context context, int themeResId) {
 super(context, themeResId);
 }
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 // 预先设置Dialog的一些属性
 Window dialogWindow = getWindow();
 WindowManager.LayoutParams p = dialogWindow.getAttributes(); 
 p.x = 0;
 p.y = 100;
 p.gravity = Gravity.LEFT | Gravity.TOP;
 dialogWindow.setAttributes(p);
 }
}


这里对window的一些参数进行了解释,我把对话框设置的离左上角离顶部100px的位置。

3.使用MyDialog

自定义布局dialog_custom2.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">
 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:layout_centerInParent="true"
 android:background="#ffffff"
 android:orientation="vertical"
 android:padding="10dp">
 <TextView
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_margin="2dp"
  android:background="#00ff00"
  android:gravity="center"
  android:padding="10dp"
  android:text="你好"
  android:textColor="#000000"/>
 <TextView
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_margin="2dp"
  android:background="#00ff00"
  android:gravity="center"
  android:padding="10dp"
  android:text="你好"
  android:textColor="#000000"/>
 <TextView
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_margin="2dp"
  android:background="#00ff00"
  android:gravity="center"
  android:padding="10dp"
  android:text="你好"
  android:textColor="#000000"/>
 </LinearLayout>
</RelativeLayout>

Java代码


//继承Dialog来实现Dialog
findViewById(R.id.btn_custom3).setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 MyDialog dialog = new MyDialog(MainActivity.this);
 dialog.setContentView(R.layout.dialog_custom2);
 dialog.show();
 }
});

4.查看效果:

这里写图片描述

给Dialog设置动画

1.新建动画文件

这里写图片描述

进入动画dialog_enter.xml


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
 android:duration="200"
 android:fillAfter="true"
 android:fromYDelta="100%p"
 android:toYDelta="0%"/>
</set>

退出动画dialog_exit.xml


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
 <translate
 android:duration="200"
 android:fillAfter="true"
 android:fromYDelta="0%"
 android:toYDelta="100%p"/>
</set>

2.在values/styles.xml中新建样式


<style name="MyAnimDialog" parent="android:Theme.Dialog">
 <!-- 背景颜色及透明程度 -->
 <item name="android:windowBackground">@android:color/transparent</item>
 <!-- 是否半透明 -->
 <item name="android:windowIsTranslucent">false</item>
 <!-- 是否没有标题 -->
 <item name="android:windowNoTitle">true</item>
 <!-- 是否浮现在activity之上 -->
 <item name="android:windowIsFloating">true</item>
 <!-- 是否背景模糊 -->
 <item name="android:backgroundDimEnabled">true</item>
 <!-- 设置背景模糊的透明度-->
 <item name="android:backgroundDimAmount">0.5</item>
 <!-- 动画 -->
 <item name="android:windowAnimationStyle">@style/dialog_animation</item>
</style>
<!-- 对话框显示和退出动画 -->
<style name="dialog_animation">
 <item name="android:windowEnterAnimation">@anim/dialog_enter</item>
 <item name="android:windowExitAnimation">@anim/dialog_exit</item>
</style>

主要是给android:windowAnimationStyle指定我们新建的动画即可,引用和前面一样,这里就给出了,

3.查看效果

这里写图片描述

继承Dialog来实现底部弹出Dialog

自定义MyBottomDialog


public class MyBottomDialog extends Dialog {
 public MyBottomDialog(Context context) {
 this(context, R.style.MyAnimDialog);
 }
 public MyBottomDialog(Context context, int themeResId) {
 super(context, themeResId);
 //加载布局并给布局的控件设置点击事件
 View contentView = getLayoutInflater().inflate(R.layout.dialog_custom3, null);
 contentView.findViewById(R.id.tv_1).setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
  Toast.makeText(getContext(), "你好", Toast.LENGTH_SHORT).show();
  }
 });
 super.setContentView(contentView);
 }
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 // 预先设置Dialog的一些属性
 Window dialogWindow = getWindow();
 WindowManager.LayoutParams p = dialogWindow.getAttributes();
 WindowManager m = getWindow().getWindowManager();
 Display d = m.getDefaultDisplay();
 getWindow().setAttributes(p);
 p.height = (int) (d.getHeight() * 0.6);
 p.width = d.getWidth();
 p.gravity = Gravity.LEFT | Gravity.BOTTOM;
 dialogWindow.setAttributes(p);
 }
}

在onCreate方法里指定的Dialog的高度和宽度

布局dialog_custom3.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">
 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:layout_centerInParent="true"
 android:background="#ffffff"
 android:orientation="vertical"
 android:padding="10dp">
 <TextView
  android:id="@+id/tv_1"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_margin="2dp"
  android:background="#00ff00"
  android:gravity="center"
  android:padding="10dp"
  android:text="你好"
  android:textColor="#000000"/>
 <TextView
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_margin="2dp"
  android:background="#00ff00"
  android:gravity="center"
  android:padding="10dp"
  android:text="你好"
  android:textColor="#000000"/>
 <TextView
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_margin="2dp"
  android:background="#00ff00"
  android:gravity="center"
  android:padding="10dp"
  android:text="你好"
  android:textColor="#000000"/>
 </LinearLayout>
</RelativeLayout>

使用是方法是一样的


//继承Dialog来实现底部弹出Dialog
findViewById(R.id.btn_custom5).setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 MyBottomDialog dialog = new MyBottomDialog(MainActivity.this);
 dialog.show();
 }
});

这里就不用设置布局了,因为我们在MyBottomDialog的构造方法里已经预加载了布局并设置了点击事件

查看效果:

这里写图片描述

自定义仿Meun的弹出Dialog

MyMenuDialog的代码


public class MyMenuDialog extends Dialog {
 public MyMenuDialog(Context context) {
 this(context, R.style.MyDialog);
 }
 public MyMenuDialog(Context context, int themeResId) {
 super(context, themeResId);
 }
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 // 预先设置Dialog的一些属性
 Window dialogWindow = getWindow();
 WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值
 //获取屏幕的高度和宽带
 WindowManager m = getWindow().getWindowManager();
 Display d = m.getDefaultDisplay();
 DisplayMetrics outMetrics = new DisplayMetrics();
 d.getMetrics(outMetrics);
 //设置WindowManager.LayoutParams
// p.height = (int) (outMetrics.heightPixels * 0.6);
// p.width = (int) (outMetrics.widthPixels * 0.4);
 //根据s随意来的高度来设置x轴偏移量
 p.x = (int) (15 * outMetrics.density);
 //根据Title的高度来设置y轴偏移量
 p.y = (int) (45 * outMetrics.density);
 p.gravity = Gravity.RIGHT | Gravity.TOP;
 dialogWindow.setAttributes(p);
 }
}

使用就不介绍了,这里主要是利用WindowManager.LayoutParams的x、y、gravity来实现的,当然可以自定义Dialog的弹出动画就可以实现一个菜单对话框了。

效果如下:

这里写图片描述

基本上Dialog的实现了这些效果应该能满足大部分项目的需求,至于以下复杂的,想带有ListView、GridView的Dialog等等都可以通过自定义Dialog来继承Dialog来实现,都是依葫芦画瓢就可以了,以后遇到什么再来补充。

您可能感兴趣的文章:android控件封装 自己封装的dialog控件Android中自定义对话框(Dialog)的实例代码android dialog自定义实例详解Android中Dialog去黑边的方法Android开发笔记之:Dialog的使用详解Android ProgressBar进度条和ProgressDialog进度框的展示DEMOAndroid 去掉自定义dialog的白色边框的简单方法Android修改源码解决Alertdialog触摸对话框边缘消失的问题Android Dialog 设置字体大小的具体方法Android入门之AlertDialog用法实例分析Android自定义ProgressDialog进度等待框实例详解Android自定义ProgressDialog进度条对话框的实现浅析Android中强大的Dialog


--结束END--

本文标题: 详解Android中Dialog的使用

本文链接: https://www.lsjlt.com/news/22708.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android Dialog之DialogFragment详解与使用
    一、介绍         在Android开发过程中,经常会有弹窗业务,在正常的弹窗业务中,常用到的是Dialog,Dialog的原理也是通过将view,添加到Dialog中。Dialog自身是一个独立的窗口,和Activity一样,有自己...
    99+
    2023-09-04
    android android studio dialog kotlin
  • Dialog中Android应用中的使用方法
    Dialog中Android应用中的使用方法?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Android开发中最常用的就是Dialog类,除了自定义dialog...
    99+
    2023-05-31
    android dialog roi
  • 详解Android Dialog对话框的五种形式
    Android中的对话框形式大致可分为五种:分别是一般对话框形式,列表对话框形式,单选按钮对话框,多选按钮对话框,自定义对话框。在实际开发中,用系统的对话框会很少,因为太丑了,美工不愿意,多是使用自定义对话框。当然学会系统的,自定义就简单了...
    99+
    2023-05-31
    android dialog 对话框
  • Android中PreferenceFragment的使用详解
    目录PreferenceFragment简介PreferenceFragment使用PreferenceFragment 扩展PreferenceFragment简介 在我们写一个...
    99+
    2024-04-02
  • 详解Android中AIDL的使用
    AIDL,即Android Interface Definition Language,Android接口定义语言。这门语言是为了实现进程间通信。每一个进程都有自己的一块独立的内存,...
    99+
    2024-04-02
  • 详解Android中motion_toast的使用
    目录前言motion_toast 介绍示例最简单用法其他内置的提醒自定义 toast总结前言 我们通常会用 toast(也叫吐司)来显示提示信息,例如网络请求错误,校验错误等等。大多...
    99+
    2024-04-02
  • Android开发之Dialog怎么使用
    在Android开发中,可以使用Dialog来创建弹出式对话框。下面是使用Dialog的一般步骤:1. 创建Dialog实例:```...
    99+
    2023-08-18
    Android Dialog
  • Android中常用的三个Dialog弹窗总结解析
    目录ProgressDialogDatePickerDialogTimePickerDialog布局完整代码ProgressDialog private void sh...
    99+
    2024-04-02
  • Android中PreferenceActivity使用详解
    目录一,Preference介绍二,PreferencesActivity介绍三,PreferenceActivity的使用四,PreferenceActivity分别和ListFr...
    99+
    2024-04-02
  • Android中PackageManager使用详解
    目录前言引入:AndroidManifest.xml文件节点说明:相关类的介绍PackageManger 类PackageInfo类  PackageItemInfo类Applica...
    99+
    2024-04-02
  • 详解Android中Service AIDL的使用
    目录前言Service基本用法——本地服务远程服务 —— AIDL服务端客户端前言 有些朋友可能是从事开发工作的时间不是特别的长,所以觉得Service相对与另外两个组件activi...
    99+
    2024-04-02
  • Android通过自定义Activity实现悬浮的Dialog详解
    前言其实实现悬浮的自定义窗体有很多方法,自定义Dialog,自定义layout 均可以实现。自定义activity也是可以的,今天我就介绍一下activity的实现方法。下面来看看详细的介绍:效果图如图可以看出,当前的窗体,第一眼其实和di...
    99+
    2023-05-31
    android 悬浮dialog 自定义activity
  • Android中的OpenGL使用配置详解
    目录引言介绍GLSurfaceViewEGL配置渲染setDebugFlags和setGLWrapper渲染器Renderer坐标映射绘制三角形绘制效果引言 PS:虽然感觉好久没更...
    99+
    2023-02-28
    Android OpenGL配置 Android OpenGL
  • Android 中RxPermissions 的使用方法详解
    Android 中RxPermissions 的使用方法详解以请求拍照、读取位置权限为例module的build.gradle: compile 'com.tbruyelle.rxpermissions2:rxpermissions:0....
    99+
    2023-05-30
    android rxpermissions mi
  • Android 中Context的使用方法详解
    Android 中Context的使用方法详解概要:Context字面意思是上下文,位于framework package的android.content.Context中,其实该类为LONG型,类似Win32中的Handle句柄。很多方法...
    99+
    2023-05-30
    android context roi
  • 详解Android Handler的使用
    目录Handler概要构造器sendMessageAtTimedispatchMessageThreadLocalLooperMessageQueueIdleHandlerAsync...
    99+
    2024-04-02
  • Android Room的使用详解
    目录1、导入配置2、创建表3、创建Dao4、创建数据库5、使用官网介绍:developer.android.google.cn/training/da… Room 是在 SQLite...
    99+
    2024-04-02
  • Android ProductFlavor的使用详解
    目录前言 productFlavorsflavorDimensions多纬度前言 最近一直在学习Android Gradle 相关的知识点,今天刚好看到了 ProductFlavo...
    99+
    2024-04-02
  • Android ViewBinding的使用详解
    目录一、什么是view binding 设置说明 二、基本用法 Activity中使用 Fragment 中使用 Adapter 中使用三、了解源码实现 BaseActivityBa...
    99+
    2024-04-02
  • Android Handler的使用详解
    在Android开发中,我们经常会遇到这样一种情况:在UI界面上进行某项操作后要执行一段很耗时的代码,比如我们在界面上点击了一个”下载“按钮,那么我们需要执行网络请求,这是一个耗时操...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作