Android修改弹窗样式的几种方式 您所在的位置:网站首页 17258大写 Android修改弹窗样式的几种方式

Android修改弹窗样式的几种方式

#Android修改弹窗样式的几种方式| 来源: 网络整理| 查看: 265

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、载入布局修改样式

这种方式大家都比较熟悉,直接在xml 上设计布局的内容,然后创建弹窗时加载这个布局,这个方式可以让我们更好的自定义样式,比较考验个人的审美和写UI 的能力,如果你很强的话,那么你可以设计各种花里胡哨的的弹窗,下面我简单的介绍一下这个方式的使用。

先定义一个edit_name.xml 的文件,在这个文件中写入下面的代码。

上面的布局文件出来的效果是这样的 。

xml 文件写好了,那么我们看看代码是如何载入这个布局的。先创建一个 AlertDialog(dialog) 和 View ( dialogView) 对象 , 然后 dialogView 载入上面写好的布局文件, 通过 dialog.setView(dialogView) 设置 dialog 的布局。

private void showDialog1() { // 创建一个 dialogView 弹窗 AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); final AlertDialog dialog = builder.create(); View dialogView = null; //设置对话框布局 dialogView = View.inflate(MainActivity.this, R.layout.edit_name, null); dialog.setView(dialogView); dialog.show(); // 获取布局控件 editName =(EditText) dialogView.findViewById(R.id.name_edit); editN= (TextView) dialogView.findViewById(R.id.info_n); editY = (TextView) dialogView.findViewById(R.id.info_y); editN.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } }); editY.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this,"姓名为:"+editName.getText().toString(),Toast.LENGTH_SHORT).show(); dialog.dismiss(); } }); }

这种方式的载入布局,后面如果你有需求要改动,或者改变样式,那么你直接修改 xml 文件 , 或者在java 代码中重新设置一个新的布局。

二、载入style样式

载入style 样式呢,这个方法适用于所有Android 布局控件,所有控件都可以通过这个方式去修改样式,当然前提是你得会写 style 样式。当然,我也对这个东西了解不是很深,在这就先班门弄斧、关公面前舞大刀一下,浅浅的介绍一下这个东西。

首先在values目录下创建一个 styles.xml 文件

在文件中创建一个自定义的样式,如下所示,这个样式特别简单,就是一些基本的定义。这里的 name="myDialogStyle" 很重要,下面我们载入这个样式时,就是根据这个 name 找到这个样式的。

@null true false true @null false @null

在 java 代码中创建弹窗时载入这个样式。

private void showDialog3() { AlertDialog mDialog = new AlertDialog.Builder(MainActivity.this, R.style.myDialogStyle) .setTitle("标题") .setMessage("这个是什么呢?") .setPositiveButton(R.string.sure,null) .setNegativeButton(R.string.cancel, null) .create(); mDialog.show(); }

额,好吧,我承认有点丑,毕竟我不是做UI的,似乎这是个很好的借口。。。。。

人都是爱美的,看到这么丑总觉得怪怪的,重新扣了下面的这段样式

@android:color/transparent @null @android:dimen/dialog_min_width_major @android:dimen/dialog_min_width_minor

在代码中引入这个样式后,效果如下所示。似乎好看点了。

当然这篇文章的主要目的并不是让你弄成一个好看的弹窗,这个我也不会,还是回归主题,我们如何修改弹窗的样式,用这种方法呢,也能争对性的修改弹窗的样式,只要你知道样式的内容代表什么,那么都能进行简单的修改。

三、通过反射机制修改弹窗样式

我们直接看代码,大家可能会好奇,哎,这个东西是怎么来的,为什么这么写呢?说起这个,那我们不得不先看看源码了。

private void showDialog2() { AlertDialog mDialog = new AlertDialog.Builder(MainActivity.this) .setTitle("标题") .setMessage("这个是什么呢?") .setPositiveButton(R.string.sure,null) .setNegativeButton(R.string.cancel, null) .show(); // 修改弹窗的背景颜色 mDialog.getWindow().setBackgroundDrawableResource(R.color.purple_200); // 修改 确定取消 按钮的字体大小 mDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextSize(20); mDialog.getButton(DialogInterface.BUTTON_NEGATIVE).setTextSize(20); try { //获取mAlert对象 Field mAlert = AlertDialog.class.getDeclaredField("mAlert"); mAlert.setAccessible(true); Object mAlertController = mAlert.get(mDialog); //获取mTitleView并设置大小颜色 Field mTitle = mAlertController.getClass().getDeclaredField("mTitleView"); mTitle.setAccessible(true); TextView mTitleView = (TextView) mTitle.get(mAlertController); mTitleView.setTextSize(40); mTitleView.setTextColor(Color.WHITE); //获取mMessageView并设置大小颜色 Field mMessage = mAlertController.getClass().getDeclaredField("mMessageView"); mMessage.setAccessible(true); TextView mMessageView = (TextView) mMessage.get(mAlertController); mMessageView.setTextColor(Color.RED); mMessageView.setTextSize(30); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } }

在 android studio 中 使用 ctrl + shift + n 的快捷键, 然后搜索 AlertDialog 就可以看到源码的文件,我们打开这个文件

在 AlertDialog 这个文件中,在开头的位置,很容易就看到 mAlert 这个对象的声明

下面这段代码就是通过放射机制获取 mAlert 这个对象。

//获取mAlert对象 Field mAlert = AlertDialog.class.getDeclaredField("mAlert"); mAlert.setAccessible(true); Object mAlertController = mAlert.get(mDialog);

通过同样的方法 查看 AlertController.java 这个文件的代码,查看这个代码可以发现这里声明了一些变量,这些变量就是弹窗的组成,通过变量名能够大概知道它代表着什么东西。

下面这两段就是设置弹窗标题和消息的样式的代码。

//获取mTitleView并设置大小颜色 Field mTitle = mAlertController.getClass().getDeclaredField("mTitleView"); mTitle.setAccessible(true); TextView mTitleView = (TextView) mTitle.get(mAlertController); mTitleView.setTextSize(40); mTitleView.setTextColor(Color.WHITE); //获取mMessageView并设置大小颜色 Field mMessage = mAlertController.getClass().getDeclaredField("mMessageView"); mMessage.setAccessible(true); TextView mMessageView = (TextView) mMessage.get(mAlertController); mMessageView.setTextColor(Color.RED); mMessageView.setTextSize(30);

效果是这样的。细心的人可能会发现,上面设置的内容好像 跟下面显示的不一样吧,我读书少,你别骗我啊!

确实,上面通过反射的方式并没有让我的弹窗样式修改成功。

我查看了log ,发现有报错,大概就是因为无法通过反射机制找到对于的对象,所以并没有修改样式成功,那是不是说这个方法不可行呢,并不是,我简单查找了一下原因,怀疑是本地的环境有冲突,存在多个AlertDialog.java 这个文件的源码,无法精准的找到对应的变量,导致冲突报错了。

提示: 上面的方式提供一个思想,如果你在实际应用中没有找到别的方法解决,这个方式可以提供参考,当然,可能你得先解决这个报错的问题。

四、设置App style样式

上面讲了如何设置弹窗的 style样式,这里再讲讲从 App的层面来修改样式,也就是说设置App 的主题风格来设置弹窗的样式。

先在 styles.xml 文件中声明一个 App 样式,我设置的如下所示。

@null @android:color/white true @null @null false false @color/teal_700 @android:color/white @android:color/white

然后在 AndroidManifest.xml 使用这个theme 。

下面我们看看Java 代码

CharSequence[] stringList = new CharSequence[]{"苹果","香蕉","梨"}; private void showDialog4() { int index = 1; AlertDialog mDialog = new AlertDialog.Builder(MainActivity.this) .setTitle("标题") .setIcon(null) .setNegativeButton(R.string.cancel, null) .setPositiveButton(null, null) .setSingleChoiceItems(stringList, index,null) .create(); mDialog.show(); // 修改弹窗的背景颜色 mDialog.getWindow().setBackgroundDrawableResource(R.color.dialog_background_color); }

效果如下所示。

不知道大家有没有发现,上面的弹窗跟前面几个不一样的,它是动态加载的,里面的内容可以根据需求动态增加,这种动态变化的,如果我要修改苹果、香蕉这些文字的颜色是白色时,前面的几种方式中,第一种是很难进行修改的,这个是动态变化的也不是直接在xml 上写死能解决的。第二种也是可以的,就是载入style样式后,弹窗并没有官方的那么美观,如果你能写成一模一样,那当我没说。通过放射机制修改,也是可以,就是我试了一下,没找到怎么改(好吧,是我太菜!)。

好了,说了这么多,主要的需求就是,怎么把上面的苹果、香蕉这些文字的颜色改成白色。其实我已经给了解决方案 , 上面的 style 样式中的最后一行代码, 没错就是下面这行代码。 为什么是这行代码呢,不能别的吗? 额 ,还真不能! 下面听我娓娓道来。

@android:color/white

搜索源码 values.xml 文件,搜索 AlertDialog, 查找到下面的的位置。

其中下面红色的框框是我们要找的东西,这里进入这个布局文件

在这个布局文件中,我们可以发现下面设置 textColor , 这个就是设置选择框文字的颜色,我们再点进去查看这个设置的资源

点击上面的资源会跳转到下面的位置 ,这里可以看到一个name 为 textColorAlertDialogListItem 的资源,在这个文件中,查找这个name ,

就可以看到在这里设置颜色,所以这个 android:textColorAlertDialogListItem 就是我们要的东西。

在定义的布局文件中,重新定义这个 android:textColorAlertDialogListItem 的变量的颜色。也就是上面我写的这行代码。

@android:color/white

上面已经讲了一下修改弹窗样式的方式的思维方式,我写的样式很丑并不重要,重要的是这个思维,这种思维方式并不仅仅适用于弹窗的样式,其他安卓控件也是适用。毕竟编程的思维是相通的。

下面我找到的一些常用的样式 仅供参考,具体效果还望实际操作后看效果。

@color/white @color/white @color/colorAccent #00000000 true true true true true #E91E63 true @drawable/ic_launcher_background false #B0C4DE #E6E6FA #1C71A9 #FFFFFF #C1C1C1 #FF7F50 #FF00FF #FFD700 #1C71A9 singleTop landscape

代码已上传至 gitee :zpeien/AndroidProject - 码云 - 开源中国 (gitee.com)

 在该项目的 DialogDemo文件夹中,该项目后期会持续更新!

好啦,这篇文章写到这里就结束了,预知后文如何,请看我下篇文章,感谢您的观看!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有