Android原⽣AlertDialog修改标题,内容,按钮颜⾊,字体⼤
⼩等
private void showAlerDialog() {
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("AlerDialog")
.setMessage("这是⼀个AlertDialog")
.setPositiveButton("确定",null)
.setNegativeButton("取消",null)
.create();
dialog.show();
}
需求
我们在android中可以很容易的通过上⾯的代码弹出⼀个AlertDialog,其中的标题,内容还有按钮的颜⾊⼤⼩等,系统代码中并没有暴露出⽅法来允许我们⾃定义他们,可假如有需求,为了突出确定,需要将确定的按钮修改为红⾊,我们该怎么做呢,或者是需要修改标题颜⾊等,当然我们可以选择⾃定义View,在此处我们不讨论这个⽅法,我们尝试修改原⽣的AlertDialog的标题,按钮颜⾊等;
假如我们需要修改内容的颜⾊为蓝⾊,我们该如何修改呢?既然原⽣的AlertDialog没有提供修改的⽅法,那我们可以通过反射来提取到这个控件,然后修改其颜⾊即可;
public class AlertDialog extends AppCompatDialog implements DialogInterface {
final AlertController mAlert;
...
}
点开AlertDialog源码我们发现有⼀个全局的AlertController,AlertDialog主要就是通过这个类来实现的,我们继续看这个类的源码;
class AlertController {
...
private ImageView mIconView;
private TextView mTitleView;
private TextView mMessageView;
private View mCustomTitleView;
...
在这个类的源码中我们看到了有mTitleView,mMessageView等字段,这些字段就是我们所需要的,我们就可以通过反射来动态修改他们;
private void showAlerDialog() {
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("AlerDialog")
.setMessage("这是⼀个AlertDialog")
.setPositiveButton("确定",null)
.setNegativeButton("取消",null)
.create();
dialog.show();
try {
Field mAlert = DeclaredField("mAlert");
mAlert.setAccessible(true);
Object mAlertController = (dialog);
Field mMessage = Class().getDeclaredField("mMessageView");
mMessage.setAccessible(true);
TextView mMessageView = (TextView) (mAlertController);
alertdialog使用方法mMessageView.setTextColor(Color.BLUE);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
通过上⾯的代码,我们就可以通过反射来修改原⽣AlertDialog中内容的颜⾊或者⼤⼩;
修改按钮的颜⾊同样可以通过反射的⽅法来完成,不过原⽣的AlertDialog提供了相应的⽅法来实现针对按钮的操作,所以我们可以通过以下⽅法直接调⽤,例如将按钮的颜⾊⼀个修改为⿊⾊,⼀个修改为蓝⾊:
private void showAlerDialog() {
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("AlerDialog")
.setMessage("这是⼀个AlertDialog")
.setPositiveButton("确定",null)
.setNegativeButton("取消",null)
.create();
dialog.show();
}
通过以上代码,就可以将AlertDialog中按钮的颜⾊来⾃⼰定义;
这样我们就完成了⾃定义标题,内容,按钮颜⾊或者⼤⼩等,需要注意的是,不管是通过反射,还是原⽣的⽅法来修改,都需要在调
⽤AlertDialog的show()⽅法后进⾏,否则会报错;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论