android - Styling titleDivider in Dialog
(15)
"Eliminar la línea azul" si supongo que correctamente significa quitar el borde entre el título del cuadro de diálogo y su cuerpo. Ese borde proviene del tema Holo, por lo que no es posible soltarlo sin utilizar su diseño personalizado.
Cree un archivo llamado custom-dialog.xml con el siguiente contenido (es solo un ejemplo ... modifíquelo como desee):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/general_dialog_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/dialogTopImage"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="0.12"
android:padding="10dp" />
<LinearLayout
android:id="@+id/dialogLine"
android:layout_width="fill_parent"
android:layout_height="3dp"
android:background="@drawable/green_btn"
android:orientation="vertical" />
<TextView
android:id="@+id/dialogText"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="0.32"
android:padding="5dp"
android:text=""
/>
<LinearLayout
android:id="@+id/general_dialog_layout"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="center"
android:layout_marginBottom="5dp"
android:layout_weight="0.11"
android:gravity="center"
android:orientation="horizontal" >
<Button
android:id="@+id/dialogButton"
android:layout_width="100dp"
android:textSize="8pt"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:background="@drawable/green_btn"
android:gravity="center"
android:text="Ok" />
</LinearLayout>
Como ves, estoy usando recursos y cosas que no estarán en tu proyecto, pero puedes eliminarlas de manera segura. El resultado en mi caso es más o menos el siguiente, con una imagen en la parte superior que estableceré programáticamente en el código.
Para crear el diálogo entonces usa algo como:
private Dialog createAndShowCustomDialog(String message, Boolean positive, Drawable d, View.OnClickListener cl, String text1) {
final Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.general_dialog_layout);
// BIND
ImageView image = (ImageView) dialog.findViewById(R.id.dialogTopImage);
TextView text = (TextView) dialog.findViewById(R.id.dialogText);
Button button = (Button) dialog.findViewById(R.id.dialogButton);
LinearLayout line = (LinearLayout) dialog.findViewById(R.id.dialogLine);
// SET WIDTH AND HEIGHT
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int width = (int) (displaymetrics.widthPixels * 0.85);
int height = (int) (displaymetrics.heightPixels * 0.60);
WindowManager.LayoutParams params = getWindow().getAttributes();
params.width = width;
dialog.getWindow().setLayout(width, height);
// SET TEXTS
text.setText(message);
button.setText(text1);
// SET IMAGE
if (d == null) {
image.setImageDrawable(getResources().getDrawable(R.drawable.font_error_red));
} else {
image.setImageDrawable(d);
}
// SET ACTION
if (cl == null) {
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
} else {
button.setOnClickListener(cl);
}
// SHOW
dialog.show();
return dialog;
}
Me pregunto cómo es posible deshacerse de (o cambiar el color) titleDivider en el diálogo. Es una línea azul debajo del título del diálogo que se muestra en los dispositivos honeycomb +.
Supongo que esta es una parte relevante del diseño del SDK, pero como no hay ningún atributo de estilo, no sé cómo hacerlo. Si intento con findViewById no hay android.R.id.titleDivider
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:fitsSystemWindows="true">
<TextView android:id="@android:id/title" style="?android:attr/windowTitleStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="@android:dimen/alert_dialog_title_height"
android:paddingLeft="16dip"
android:paddingRight="16dip"
android:gravity="center_vertical|left" />
<View android:id="@+id/titleDivider"
android:layout_width="match_parent"
android:layout_height="2dip"
android:background="@android:color/holo_blue_light" />
<FrameLayout
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:foreground="?android:attr/windowContentOverlay">
<FrameLayout android:id="@android:id/content"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
</LinearLayout>
He intentado anular dialogTitleDecorLayout, que es solo una referencia a dialog_title_holo.xml en mi theme.xml, pero sin éxito. Error es:
error: Error: No se encontró ningún recurso que coincida con el nombre dado: attr ''dialogTitleDecorLayout''.
Antes de escribir dialog.show()
, escribe:
int divierId = dialog.getContext().getResources().getIdentifier("android:id/titleDivider", null, null);
View divider = dialog.findViewById(divierId);
if(divider!=null){
divider.setBackgroundColor(getResources().getColor(R.color.transparent));}
En colors.xml :
<color name="transparent">#00000000</color>
Aquí es cómo resolví eso (gracias a http://joerg-richter.fuyosoft.com/?p=181 ):
MyDialogBuilder.class
public class MyDialogBuilder extends android.app.AlertDialog.Builder {
public MyDialogBuilder(Context context) {
super(context);
}
@NonNull
@Override
public android.app.AlertDialog create() {
final android.app.AlertDialog alertDialog = super.create();
alertDialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
int titleDividerId = getContext().getResources()
.getIdentifier("titleDivider", "id", "android");
View titleDivider = alertDialog.findViewById(titleDividerId);
if (titleDivider != null) {
titleDivider.setBackgroundColor(getContext().getResources()
.getColor(R.color.alert_dialog_divider));
}
}
});
return alertDialog;
}
}
En colors.xml:
<color name="transparent">#00000000</color>
En diálogo:
int divierId = dialog.getContext (). getResources (). getIdentifier ("android: id / titleDivider", null, null);
Ver divider = d.findViewById (divierId); divider.setBackgroundColor (getResources (). getColor (R.color.transparent));
Este está probado en algunos dispositivos 4.x:
TextView title = (TextView)getWindow().getDecorView().findViewById(android.R.id.title);
((ViewGroup)title.getParent()).getChildAt(1).setVisibility(View.GONE);
Esto no es una forma de ocultarlo por control brotha .. He tenido el mismo problema. Lo único que puedes hacer es crear tu propio CustomDialog
Aquí hay una aplicación de muestra.
Descarga y observa el patrón de diseño, entonces será fácil
Aquí hay un tutorial sobre cómo hacer un diálogo personalizado
La parte importante es que después de crear DialogObject, no establezca el Título mediante setTitle () cree TextView dentro de su CustomLayout y llámelo desde findViewByID () y establezca su título
Gracias a todos, pero obtuve la Solución para obtener una referencia al titulador de alertdialog para cambiar su color utilizando el código que aparece a continuación. Espero que esto ayude a alguien.
int divierId = dialog.getContext().getResources()
.getIdentifier("android:id/titleDivider", null, null);
View divider = dialog.findViewById(divierId);
divider.setBackgroundColor(getResources().getColor(R.color.creamcolor));
Necesitas implementar
myDialog = builder.create();
myDialog.setOnShowListener(new OnShowListenerMultiple());
//----------------------------
//Function to change the color of title and divider of AlertDialog
public static class OnShowListenerMultiple implements DialogInterface.OnShowListener {
@Override
public void onShow( DialogInterface dialog ) {
if( !(dialog instanceof Dialog) )
return;
Dialog d = ((Dialog) dialog);
final Resources resources = d.getContext().getResources();
final int color = AppUtility.getColor( resources, R.color.defaultColor );
try {
int titleId = resources.getIdentifier( "android:id/alertTitle", null, null );
TextView titleView = d.findViewById( titleId );
titleView.setTextColor( color );
}
catch( Exception e ) {
Log.e( "XXXXXX", "alertTitle could not change color" );
}
try {
int divierId = resources.getIdentifier( "android:id/titleDivider", null, null );
View divider = d.findViewById( divierId );
divider.setBackgroundColor( color );
}
catch( Exception e ) {
Log.e( "XXXXXX", "titleDivider could not change color" );
}
}
}
Para ocultar completamente la línea azul predeterminada (asumiendo que está en DialogFragment
):
Dialog dialog = getDialog();
if (dialog != null) {
final int dividerId = dialog.getContext().getResources()
.getIdentifier("android:id/titleDivider", null, null);
View divider = dialog.findViewById(dividerId);
if (divider != null) {
divider.setBackground(null);
}
}
Puedes hacer un diálogo personalizado como este:
Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.custom_dialog);
Button okay = (Button) dialog.findViewById(R.id.button1);
okay.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
// do your work
}
});
Establecer un título personalizado en el diseño no use Android
dialog.setTitle();
y su custom_dialog.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android1="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_root"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:padding="10dp">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:textSize="40sp"
android:text="Hello"/>
<Button
android:id="@+id/button1"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginLeft="150dp"
android:text="OK" />
</RelativeLayout>
Resolví el problema usando el tema DialogFragment.STYLE_NO_TITLE y luego falsificando la barra de título en el diseño del diálogo.
Si no desea usar el estilo predeterminado, no use AlertDialog. Podría ir con Actividad (con su diseño personalizado) con Tema de diálogo.
<activity android:theme="@android:style/Theme.Dialog">
Tu idea fue correcta. Sin embargo, dialogTitleDecorLayout que buscaba es un recurso privado, por lo que no puede acceder a él de una manera normal. Pero todavía puedes acceder usando la sintaxis *
<item name="*android:dialogTitleDecorLayout">@layout/dialog_title</item>
Añadiendo esto a mi propio estilo y simplemente copiando dialog_title.xml a mi aplicación y cambiándolo, resolví un poco el problema en mi caso.
utilizar
<View android:id="@+id/titleDivider"
android:layout_width="match_parent"
android:layout_height="2dip"
android:background=#CC3232 />