web-dev-qa-db-fra.com

Obtention du remplissage par défaut pour AlertDialog

J'ai besoin de faire un AlertDialog avec une vue personnalisée. Le message d'un AlertDialog a un remplissage par défaut, mais lorsque je définis une vue, il n'a pas de remplissage, je cherche à obtenir le même remplissage que celui par défaut du message. J'utilise un style qui étend le thème Holo (si cela est pertinent).

AlertDialog.Builder builder = new AlertDialog.Builder(PlaylistListView.this.getContext());
builder.setTitle("Title");
builder.setView(inflate(context, R.layout.music_player_create_dialog, null));
builder.setPositiveButton("OK", null);
builder.setNegativeButton("Cancel", null);
builder.show();

voici la mise en page du contenu:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:paddingLeft="@dimen/abc_dialog_padding_material"
    Android:paddingRight="@dimen/abc_dialog_padding_material"
    Android:paddingTop="@dimen/abc_dialog_padding_top_material"
    Android:paddingBottom="@dimen/abc_dialog_padding_top_material">

    <TextView
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:text="Title:"/>

    <EditText
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:gravity="bottom"
        Android:background="@null"
        Android:layout_marginTop="20dp"/>
    <View
        Android:layout_width="match_parent"
        Android:layout_height="1px"
        Android:background="@color/divider"/>
</LinearLayout>
41
SnapDragon

Le ?dialogPreferredPadding l'attribut a maintenant cette valeur. Il a été introduit dans l'API 22; voir https://developer.Android.com/sdk/api_diff/22/changes/Android.R.attr.html .

Vous pouvez obtenir un remplissage cohérent dans vos boîtes de dialogue personnalisées en spécifiant cet attribut sur la disposition de la boîte de dialogue. Par exemple, Android:paddingLeft="?dialogPreferredPadding" alignera le contenu de la boîte de dialogue sur son titre.

70
trooper

Je suis resté coincé avec le même problème, j'ai donc dû trouver la réponse. Au cas où quelqu'un viendrait chercher la réponse, voici ma solution.

Le code source de la mise en page d'AlertDialog est décrit dans alert_dialog.xml (par exemple ici pour Android 4.4.1 , qui devrait correspondre au thème Holo). La mise en page est codée en dur rembourrages (et ils peuvent être différents dans les différentes versions d'Android). Pour connaître le rembourrage par défaut, vous devez résumer tous les rembourrages pour les vues contenant id/message" TextView. Dans ce cas, ils sont 3 + 14 + 5 = 22 dp gauche et 1 + 10 + 5 = 16 dp droite.

L'élément Android:id/custom Est l'endroit où une vue personnalisée est insérée et il a 3 rembourrages gauche et 1 dp droite (à partir de l'élément racine, d'autres n'ont pas de rembourrage) que vous n'avez pas à définir manuellement.

Donc, pour que le remplissage résultant d'une vue personnalisée soit identique à celui du message, définissez-le sur 19 dp à gauche et 15 dp à droite (et n'oubliez pas de conserver le remplissage par défaut de 5 dp en haut et en bas).

Exemple de code:

final EditText input = new EditText( getContext() );
float dpi = ctx.getResources().getDisplayMetrics().density;
AlertDialog dialog = (new AlertDialog.Builder(getContext()))
        .setTitle("Rename track")
        .setMessage("Track name:")
        .setPositiveButton("OK", null)
        .setNegativeButton("Cancel", null)
        .create();
dialog.setView(input, (int)(19*dpi), (int)(5*dpi), (int)(14*dpi), (int)(5*dpi) );
dialog.show();

Ce code donne un résultat comme celui-ci (semble bon). BTW, c'est le thème Material, qui semble avoir les mêmes rembourrages (également codés en dur).

[]

21
Osman-pasha

Juste pour ajouter une réponse plus complète sur la façon de l'utiliser:

Vous pouvez utiliser dans le fichier XML de mise en page Android:paddingStart="?dialogPreferredPadding" et Android:paddingEnd="?dialogPreferredPadding".

Alternativement, si vous voulez le faire par code:

@JvmStatic
fun getDimensionFromAttribute(context: Context, attr: Int): Int {
    val typedValue = TypedValue()
    return if (context.theme.resolveAttribute(attr, typedValue, true)) TypedValue.complexToDimensionPixelSize(typedValue.data, context.resources.displayMetrics) else 0
}

usage:

val alertDialogPadding = getDimensionFromAttribute(context, R.attr.dialogPreferredPadding)
view.setPadding(alertDialogPadding, 0, alertDialogPadding, 0)

Si vous utilisez un CheckBox (et peut-être d'autres vues), je ne pense pas qu'il soit possible de définir les rembourrages ou les marges afin qu'il s'aligne bien avec les autres vues de la boîte de dialogue, à moins que vous ne l'enveloppiez avec une vue différente, ou étendre

2
android developer