android - studio - Los diálogos no muestran botones positivos y negativos.
popup android studio (6)
Agregue esto en style.xml:
<style name="MyDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="android:textColor">@color/colorAccent</item>
</style>
y en uso de actividad
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(MyActivity.this, R.style.MyDialogTheme);
Utilicé AlertDialog para alertar al usuario confirmar eliminar. Reviso en mi dispositivo (Android 5.1) y se muestra bien
Pero en algún otro dispositivo (también ejecuta Android 5.1), el cuadro de diálogo omitió los botones positivo y negativo.
Revisé y descubrí que los dispositivos que tienen este problema tienen una resolución media (960x540, 854x480).
¿Se relaciona la resolución con este tema? Si no es así, ¿puede decirme la razón y cómo solucionar este problema?
Mi código para mostrar el diálogo:
public static final Dialog yesNoDialog(Context context,
String message,
DialogInterface.OnClickListener yesAction, DialogInterface.OnClickListener noAction) {
AlertDialog.Builder builder = new AlertDialog.Builder(context,R.style.todoDialogLight);
builder.setTitle(context.getString(R.string.app_name))
.setMessage(message)
.setCancelable(false)
.setPositiveButton("YES", yesAction)
.setNegativeButton("NO", noAction);
return builder.create();
}
Y styles.xml
<style name="todoDialogLight" parent="Theme.AppCompat.Light.Dialog">
<!-- Used for the buttons -->
<item name="colorAccent">@color/colorPrimaryDark</item>
<item name="android:textStyle">bold</item>
<!-- Used for the title and text -->
<item name="android:textColorPrimary">@color/colorText</item>
<!-- Used for the background -->
<!-- <item name="android:background">#4CAF50</item>-->
<item name="android:fontFamily">sans-serif</item>
<item name="android:windowAnimationStyle">@style/RemindDialogAnimation</item>
<item name="android:layout_width">@dimen/width_remind_dialog</item>
<item name="android:layout_height">wrap_content</item>
</style>
Así que los botones están ahí para mí. Desafortunadamente, eran texto blanco sobre fondo blanco. No tiene nada que ver con la resolución, sino más que ver con el tema que está eligiendo. Para resolver esto, necesita establecer el color de texto correcto en el tema de su diálogo.
Por ejemplo, en styles.xml agregar
<style name="MyDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="colorPrimary">@color/colorPrimaryDarkBlue</item>
</style>
y en su actividad agregue
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(MyActivity.this, R.style.MyDialogTheme);
Espero que esto ayude.
Diálogo de diálogo;
public void startAlertDialog(String message)
{
AlertDialog.Builder alertDialog=new AlertDialog.Builder(this);
alertDialog.setCancelable(false);
LayoutInflater inflater=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
View view=inflater.inflate(R.layout.alertdialoglayout,null);
TextViewRagular textViewRagular=(TextViewRagular)view.findViewById(R.id.textviewMessage);
textViewRagular.setText(message);
alertDialog.setView(view);
dialog=alertDialog.create();
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.show();
}
La solución de Ali funcionó para mí. Mi código original funcionó en versiones anteriores de Android <7. Pero las pruebas en mi Pixel dieron botones invisibles. Agregué el concepto de estilo detallado por Ali como se muestra a continuación y todo está bien:
return new AlertDialog.Builder(getActivity(),R.style.MyDialogTheme)
.setView(v)
.setTitle(R.string.filter_picker_title)
.setPositiveButton(android.R.string.ok,
// when the user presses the button to select a new number
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Integer markerIndex = mNumberPicker.getValue();
stringFilter=uniqueValues[markerIndex];
sendResult(Activity.RESULT_OK, stringFilter);
}
})
.create();
Realmente se relaciona con la resolución, no sé exactamente la razón y solo hago una condición para solucionar este problema.
public static String getDensity(Context context) {
float density = context.getResources().getDisplayMetrics().density;
if (density >= 4.0) {
return "xxxhdpi";
}
if (density >= 3.0) {
return "xxhdpi";
}
if (density >= 2.0) {
return "xhdpi";
}
if (density >= 1.5) {
return "hdpi";
}
if (density >= 1.0) {
return "mdpi";
}
return "ldpi";
}
AlertDialog
public static Dialog yesNoDialog(final Context context,
final String message,
final DialogInterface.OnClickListener yesAction,
final DialogInterface.OnClickListener noAction) {
int theme = PreferenceUtil.getThemeSetting(context, PreferenceUtil.PREF_THEME);
AlertDialog.Builder builder = null;
String density = AppUtil.getDensity(context);
if (theme == ThemeUtil.THEME_LIGHT) {
if(density.equals("hdpi")){
builder = new AlertDialog.Builder(context);
}else{
builder = new AlertDialog.Builder(context, R.style.todoDialogLight);
}
} else {
if(density.equals("hdpi")){
builder = new AlertDialog.Builder(context);
}else{
builder = new AlertDialog.Builder(context, R.style.todoDialogDark);
}
}
builder.setTitle(context.getString(R.string.app_name))
.setMessage(message)
.setCancelable(false)
.setPositiveButton("YES", yesAction)
.setNegativeButton("NO", noAction);
return builder.create();
}
Espero que sea de ayuda para otros desarrolladores que tengan el mismo problema.
Si está utilizando un tema personalizado en su styles.xml
configure el color de colorAccent
a un color más oscuro.
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimary</item>
<item name="colorAccent">@color/colorPrimary</item>
</style>