问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2024-09-27 07:29

我来回答

1个回答

热心网友 时间:2024-10-04 22:28

首先入口处应该是这里:

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

[java] view plain copy
/**
* 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的类型:

[java] view plain copy
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的内部类,以下为该类的部分属性:

[java] view plain copy
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处,然后接下来就是要查看这个属性什么时候被使用了呢:
在内类可以看到该方法使用了该属性:

[java] view plain copy
public void apply(AlertController dialog) {
if (mCustomTitleView != null) {
dialog.setCustomTitle(mCustomTitleView);
} else {
if (mTitle != null) {
dialog.setTitle(mTitle);
}

这里说明mTitle被设置给了AlertController的对象dialog,然后接下来就是寻找这个dialog对象是怎么被传入进来的:
通过寻找找到apply该方法的被调用处是:

[java] view plain copy
/**
* 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的对象。好了,到这里分析完毕。现在就剩下取出该对象,对该对象进行反射了。

[java] view plain copy
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();
}
好了,到了这里就解决完毕了。

热心网友 时间:2024-10-04 22:22

首先入口处应该是这里:

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

[java] view plain copy
/**
* 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的类型:

[java] view plain copy
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的内部类,以下为该类的部分属性:

[java] view plain copy
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处,然后接下来就是要查看这个属性什么时候被使用了呢:
在内类可以看到该方法使用了该属性:

[java] view plain copy
public void apply(AlertController dialog) {
if (mCustomTitleView != null) {
dialog.setCustomTitle(mCustomTitleView);
} else {
if (mTitle != null) {
dialog.setTitle(mTitle);
}

这里说明mTitle被设置给了AlertController的对象dialog,然后接下来就是寻找这个dialog对象是怎么被传入进来的:
通过寻找找到apply该方法的被调用处是:

[java] view plain copy
/**
* 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的对象。好了,到这里分析完毕。现在就剩下取出该对象,对该对象进行反射了。

[java] view plain copy
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();
}
好了,到了这里就解决完毕了。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
天一共卖出136张电影票,上午卖出去86张,下午卖出多少张。 17届华杯赛小学高年级组的初赛的这道题怎么做? 美特斯工业系统(中国)有限公司MTS公司发展史 mts公司是什么单位 华夏八大古姓是哪八个 ...耳鸣 单眼瞳孔上移 平常手机看得多 会不会是脑瘤 ...了首付给儿子和儿媳买了一套房子,房照上面写的是儿子和儿媳的... GBA最终幻想战略卡住 最终幻想战略版 大bug (狮子战争?就是GBA上的) GBA版最终幻想战略版的BUG问题,很急的 在中国企业如何与外国人打交道 如何认识在中国的外国人 沈阳哪些装修公司好些 沈阳哪些装饰公司便宜 有哪些做法简单的冰淇淋教程值得分享? 最简单DIY冰淇淋教程,夏日必备技能get! 有哪些制作冰淇淋的教程分享? 怎样可以把电热水器里面的水放完再用 如何在家自己动手做冰淇淋好吃?看完我的教程你就知道了! 在日语考试中,要怎么区分[まで]与[へ]? U盘里的文件如何备份?推荐六个简便易行的备份方法 电脑文件如何备份?电脑文件备份的5个技巧分享 一个句号是一句还是两句? ...路地铁口/格调一居式怎么样?有什么好玩的地方? 什么是一个句号? ...宫国家遗址公园安静两居怎么样?有什么好玩的地方? ...线唐都空工白鹿仓可做饭怎么样?有什么好玩的地方? ...1号线/地暖可做饭/唐都空工大怎么样?有什么好玩的地方? ...火车站永兴坊/钟楼三居怎么样?有什么好玩的地方? ...近钟楼点头像看更多房源怎么样?有什么好玩的地方? Java注解的override源码给我贴一下 Fork/Join框架基本使用和原理探究(基础篇) Spring框架? 如果你买的格力空调坏了;发票丢了;可是厂家保修五年,你该怎么办... 格力空调发票掉了,怎么查询是在那家买的? ...但是打出去的电话在安卓手机会显示一张陌生人的照片, 发票掉了,格力空调售后服务怎么办? ...个联通卡,打电话时会出现一个陌生人的图像,删又删不掉,怎么办... 格力空调发票丢了,可以免费维修吗 苹果手机怎么设置一张卡屏蔽陌生人电话? win7系统,开机后黑屏一段时间,然后进入桌面,然后网络这里显示未连接,连 ... ...会黑屏一两分钟,然后开机后显示网络连接不可用,标志上是黑色的还有... ...过了几分钟进入了桌面就出现了网络连接不可用 为什么电脑卡在欢迎界面很长时间,然后黑屏一会,进入后连不上网,电脑... ...进去后黑屏只显示鼠标过了一会显示桌面但网络连接不可用。在线... win7开机黑屏只有光标,显示桌面后,连接不可用 ...黑屏。等了3.4分钟开开以后显示网络连接不可用,怎么回事?怎么修复... 大百兔奶糖是伤害标志性产品,上世纪70年代周恩来将它作为国礼赠送给了哪... (华康勘亭流 )这个字体安装不成功,每次安装后都不会有这个字体存在,我... ...华康勘亭流”繁体字,这个字体为什么安装不成功,放到字体文件夹里也...