¿Cómo resolver el problema de la visualización incompleta debido a demasiadas palabras en el título de AlertDialog mediante la reflexión?
[java] ver copia simple
builder.setTitle("Aviso sobre la emisión de la Oficina Provincial de Supervisión Ambiental sobre el programa de implementación de la Misa del Partido Línea de actividades educativas y prácticas");
Luego vaya al método setTitle:
[java] ver copia simple
/**
* Establece el título que se muestra en {@link Dialog}.
*
* @return este objeto Builder para permitir el encadenamiento de métodos de configuración
*/
public Builder setTitle(CharSequence title ) {
P.mTitle = title;
return this
}
Bueno, asigna la cadena al objeto P, y luego asigne el tipo de P:
[java] ver copia simple
generador de clases estáticas públicas {
AlertController.AlertParams final privado
private int mTheme;
/**
* El constructor utiliza el contexto de este constructor y el {@link AlertDialog} que crea.
Como puede ver en el Generador, P es un objeto de tipo AlertController.AlertParams. AlertController.AlertParams Atributos en esta clase (Nota: si no ha configurado específicamente un método para ver las clases internas de Android, no puede verlo aquí. Las configuraciones relevantes se pueden encontrar en: /kf/201311/259006.html):
Bien, ingrese a la clase AlertController.AlertParams.
Puede ver en la clase AlertParams que esta clase es parte de la clase interna AlertController. Las siguientes son algunas propiedades de esta clase:
[java] ver copia simple
clase estática pública. AlertParams
public int mIconAttrId = 0;
public CharSequence mTitle
Luego, cuando se establece la cadena, la cadena eventualmente se establecerá en el mTitle de el objeto de esta clase, lo siguiente que debemos hacer es ver cuando se usa este atributo:
En la clase interna, puedes ver que el método usa el siguiente atributo:
[java] ver copia simple
public void apply(AlertController dialog) {
if (mCustomTitleView != null) {
dialog.setCustomTitle(mCustomTitleView);
} else {
if (mTitle ! = null) {
dialog.setTitle(mTitle
}
Aquí dice que mTitle está configurado en el cuadro de diálogo del objeto AlertController, y luego el siguiente paso es descubrir cómo se pasa este objeto de diálogo:
El siguiente paso es descubrir cómo funciona el cuadro de diálogo se pasa el objeto:
Buscar dónde se llama el método de aplicación:
[java] ver copia simple
/**
* Cree un {@link AlertDialog}. No
* {@link Dialog#show()} el diálogo. Esto permite al usuario realizar cualquier procesamiento adicional
* antes de mostrar el cuadro de diálogo.
* Si no tienes otro procesamiento y quieres crear y mostrar el diálogo, usa {@link#show()}.
*/
public AlertDialog create() {
diálogo final de AlertDialog = new AlertDialog(P.mContext, mTheme, false
<); p> P.apply(dialog.mAlert);dialog.setCancelable(P.mCancelable);
if (P.mCancelable) {
diálogo. setCanceledOnTouchOutside(verdadero);
}
dialog.setCanceledOnTouchOutside(verdadero);
}
dialog.setCanceledOnTouchOutside(verdadero).
dialog.setOnCancelListener(P.mOnCancelListener);
dialog.setOnDismissListener(P.mOnDismissListener
if (P.mOnKeyListener ! = null) { p>
p>
dialog.setOnKeyListener(P.mOnKeyListener);
}
regresar diálogo.
regresar diálogo
}
Este método está dentro de AlertDialog.Builder, es decir, cuando el objeto Builder llama al método create, pasará al cuadro de diálogo del objeto AlertController, y aquí puede ver que es el Propiedad mAlert del cuadro de diálogo. Esto significa que la propiedad mAlert del cuadro de diálogo es el objeto AlertController. Bien, el análisis termina aquí. Ahora sólo es cuestión de sacar el objeto y pensar en ello.
[java] Ver copia pura
AlertDialog dialog = builder.create();
prueba {
Classlt;? mAlert = dialog.getClass();
Log.e("sahadev", mAlert.getName());
Campo de campo = mAlert.getDeclaredField("mAlert"); /p>
field.setAccessible(true);
Log.e("sahadev", field.getName() "----" field.get(dialog)); >
Campo mTitleView = field.get(dialog ).getClass().getDeclaredField("mTitleView");
mTitleView.setAccessible(true
Objeto AlertController = campo); .get(dialog);
mTitleView.set(AlertController, new TextView(this)); //El método lt; span style="font-family: Microsoft YaHei;"gt; no funcionó, no sé por qué, ¿hay algo claro?lt;/spangt;
dialog.show()
Object obj = mTitleView.get( AlertController);
TextView textView = (TextView) obj;
textView.setSingleLine(false
} catch (Excepción e) {
e.printStackTrace();
}
Bien, lo entiendo.
Bueno, hasta aquí la solución.