J'ai utilisé AlertDialog pour alerter l'utilisateur confirmer la suppression. Je vérifie sur mon appareil (Android 5.1) et il montre bien
Mais sur un autre appareil (également sous Android 5.1), la boîte de dialogue manquait les boutons positif et négatif.
J'ai vérifié et constaté que les périphériques rencontrés avaient ce problème avec une résolution moyenne (960x540, 854x480).
La résolution est-elle liée à ce problème? Si non, pouvez-vous me dire pourquoi et comment résoudre ce problème?
Mon code pour le dialogue d'affichage:
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();
}
And 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>
Alors les boutons sont là pour moi. Malheureusement, ils étaient en texte blanc sur fond blanc. Cela n'a rien à voir avec la résolution, mais plutôt avec le thème que vous choisissez. Pour résoudre ce problème, vous devez définir la bonne couleur de texte dans le thème de votre dialogue.
Par exemple, dans styles.xml, ajoutez
<style name="MyDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="colorPrimary">@color/colorPrimaryDarkBlue</item>
</style>
et dans votre activité, ajoutez
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(MyActivity.this, R.style.MyDialogTheme);
J'espère que cela t'aides.
Ajoutez ceci dans style.xml:
<style name="MyDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="Android:textColor">@color/colorAccent</item>
</style>
et en activité
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(MyActivity.this, R.style.MyDialogTheme);
La solution d'Ali a fonctionné pour moi. Mon code original fonctionnait sur les versions précédentes d'Android <7. Mais tester sur mon pixel a donné des boutons invisibles. J'ai ajouté le concept de style détaillé par ALi comme indiqué ci-dessous et tout va 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();
Si vous utilisez un thème personnalisé dans votre styles.xml
, définissez la couleur de colorAccent
sur une couleur plus sombre.
<!-- 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>
Dialogue dialogue;
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();
}
C'est vraiment lié à la résolution, je ne sais pas exactement la raison et juste faire une condition if else pour résoudre ce problème.
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();
}
J'espère que cela aidera les autres développeurs qui ont le même problème.