如何通过反射来解决AlertDialog标题由于字数过多显示不全的问题

2024-05-29 07:18

本文主要是介绍如何通过反射来解决AlertDialog标题由于字数过多显示不全的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载前请标明出处:http://blog.csdn.net/sahadev_


先上一下示例图:

这是默认状态下:这是通过反射后修改的结果:


在解决这个问题之前首先需要了解一下AlertDialog的基本构造,所以先从源码看起:

想要知道为什么显示不全,首先入口处应该是这里:

builder.setTitle("关于印发《省环境监察局关于开展党的群众路线教育实践活动的实施方案》的通知");
然后进入setTitle的方法:

/*** Set the title displayed in the {@link Dialog}.** @return This Builder object to allow for chaining of calls to set methods*/public Builder setTitle(CharSequence title) {P.mTitle = title;return this;}

好了,它把字符串赋给了对象P,然后再来看看P的类型:

  public static class Builder {private final AlertController.AlertParams P;private int mTheme;/*** Constructor using a context for this builder and the {@link AlertDialog} it creates.*/public Builder(Context context) {this(context, resolveDialogTheme(context, 0));}

嗯,从Builder处可以看到P是类型为AlertController.AlertParams的对象。然后再接着看AlertController.AlertParams这个类里面的属性( 注意:如果你没有专门设置过可以查看Android内部类的方法的话,这里是看不了的,相关设置可以参见:http://www.2cto.com/kf/201311/259006.html):

好了,进入AlertController.AlertParams类内可以看到该类是属于AlertController的内部类,以下为该类的部分属性:

    public static class AlertParams {public final Context mContext;public final LayoutInflater mInflater;public int mIconId = 0;public Drawable mIcon;public int mIconAttrId = 0;public CharSequence mTitle;

好了,所以那个字符串设置时最终会设置到这个类对象的mTitle处,然后接下来就是要查看这个属性什么时候被使用了呢:

在内类可以看到该方法使用了该属性:

public void apply(AlertController dialog) {if (mCustomTitleView != null) {dialog.setCustomTitle(mCustomTitleView);} else {if (mTitle != null) {dialog.setTitle(mTitle);}

这里说明mTitle被设置给了AlertController的对象dialog,然后接下来就是寻找这个dialog对象是怎么被传入进来的:

通过寻找找到apply该方法的被调用处是:

 /*** Creates a {@link AlertDialog} with the arguments supplied to this builder. It does not* {@link Dialog#show()} the dialog. This allows the user to do any extra processing* before displaying the dialog. Use {@link #show()} if you don't have any other processing* to do and want this to be created and displayed.*/public AlertDialog create() {final AlertDialog dialog = new AlertDialog(P.mContext, mTheme, false);P.apply(dialog.mAlert);dialog.setCancelable(P.mCancelable);if (P.mCancelable) {dialog.setCanceledOnTouchOutside(true);}dialog.setOnCancelListener(P.mOnCancelListener);dialog.setOnDismissListener(P.mOnDismissListener);if (P.mOnKeyListener != null) {dialog.setOnKeyListener(P.mOnKeyListener);}return dialog;}

该方法位于AlertDialog.Builder的内部,也就是当Builder对象调用create方法时会将 AlertController的对象dialog传入,这里可以看到是dialog的mAlert属性,也就是说dialog的 mAlert属性是 AlertController的对象。好了,到这里分析完毕。现在就剩下取出该对象,对该对象进行反射了。

AlertDialog dialog = builder.create();try {Class<?> mAlert = dialog.getClass();Log.e("sahadev", mAlert.getName());Field field = mAlert.getDeclaredField("mAlert");field.setAccessible(true);Log.e("sahadev", field.getName() + "----" + field.get(dialog));Field mTitleView = field.get(dialog).getClass().getDeclaredField("mTitleView");mTitleView.setAccessible(true);Object AlertController = field.get(dialog);mTitleView.set(AlertController, new TextView(this));//该方法<span style="font-family:Microsoft YaHei;">没起作用,不知道为什么,有大神清楚么?</span>dialog.show();Object obj = mTitleView.get(AlertController);TextView textView = (TextView) obj;textView.setSingleLine(false);} catch (Exception e) {e.printStackTrace();}
好了,到了这里就解决完毕了。

如有问题请留言。




这篇关于如何通过反射来解决AlertDialog标题由于字数过多显示不全的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1012997

相关文章

linux生产者,消费者问题

pthread_cond_wait() :用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它。 pthread_cond_wait() 必须与pthread_mutex 配套使用。pthread_cond_wait()函数一进入wait状态就会自动release mutex。当其他线程通过pthread

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

2024.6.24 IDEA中文乱码问题(服务器 控制台 TOMcat)实测已解决

1.问题产生原因: 1.文件编码不一致:如果文件的编码方式与IDEA设置的编码方式不一致,就会产生乱码。确保文件和IDEA使用相同的编码,通常是UTF-8。2.IDEA设置问题:检查IDEA的全局编码设置和项目编码设置是否正确。3.终端或控制台编码问题:如果你在终端或控制台看到乱码,可能是终端的编码设置问题。确保终端使用的是支持你的文件的编码方式。 2.解决方案: 1.File -> S

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

vcpkg安装opencv中的特殊问题记录(无法找到opencv_corexd.dll)

我是按照网上的vcpkg安装opencv方法进行的(比如这篇:从0开始在visual studio上安装opencv(超详细,针对小白)),但是中间出现了一些别人没有遇到的问题,虽然原因没有找到,但是本人给出一些暂时的解决办法: 问题1: 我在安装库命令行使用的是 .\vcpkg.exe install opencv 我的电脑是x64,vcpkg在这条命令后默认下载的也是opencv2:x6

问题-windows-VPN不正确关闭导致网页打不开

为什么会发生这类事情呢? 主要原因是关机之前vpn没有关掉导致的。 至于为什么没关掉vpn会导致网页打不开,我猜测是因为vpn建立的链接没被更改。 正确关掉vpn的时候,会把ip链接断掉,如果你不正确关掉,ip链接没有断掉,此时你vpn又是没启动的,没有域名解析,所以就打不开网站。 你可以在打不开网页的时候,把vpn打开,你会发现网络又可以登录了。 方法一 注意:方法一虽然方便,但是可能会有

据阿谱尔APO Research调研显示,2023年全球髓内钉市场销售额约为4.7亿美元

根据阿谱尔 (APO Research)的统计及预测,2023年全球髓内钉市场销售额约为4.7亿美元,预计在2024-2030年预测期内将以超过3.82%的CAGR(年复合增长率)增长。 髓内钉市场是指涉及髓内钉制造、分销和销售的行业。髓内钉是一种用于整形外科手术的医疗器械,用于稳定长骨骨折,特别是股骨、胫骨和肱骨。髓内钉通常由不銹钢或钛等材料制成,并插入骨的髓管中,以在愈合过程中提供结构支

vue同页面多路由懒加载-及可能存在问题的解决方式

先上图,再解释 图一是多路由页面,图二是路由文件。从图一可以看出每个router-view对应的name都不一样。从图二可以看出层路由对应的组件加载方式要跟图一中的name相对应,并且图二的路由层在跟图一对应的页面中要加上components层,多一个s结尾,里面的的方法名就是图一路由的name值,里面还可以照样用懒加载的方式。 页面上其他的路由在路由文件中也跟图二是一样的写法。 附送可能存在

vue+elementUI下拉框联动显示

<el-row><el-col :span="12"><el-form-item label="主账号:" prop="partyAccountId" :rules="[ { required: true, message: '主账号不能为空'}]"><el-select v-model="detailForm.partyAccountId" filterable placeholder="

vue+elementui分页输入框回车与页面中@keyup.enter事件冲突解决

解决这个问题的思路只要判断事件源是哪个就好。el分页的回车触发事件是在按下时,抬起并不会再触发。而keyup.enter事件是在抬起时触发。 so,找不到分页的回车事件那就拿keyup.enter事件搞事情。只要判断这个抬起事件的$event中的锚点样式判断不等于分页特有的样式就可以了 @keyup.enter="allKeyup($event)" //页面上的//js中allKeyup(e