2015-10-12 10 views
30

Devo creare un AlertDialog con una vista personalizzata. Il messaggio di uno AlertDialog ha un riempimento predefinito, ma quando si imposta una vista non ha padding, ho bacchetta per ottenere lo stesso riempimento come predefinito del messaggio. Sto usando uno stile che estende il tema di Holo (se questo è rilevante).Come riempimento predefinito per AlertDialog

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(); 

questo è il layout per il contenuto:

<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> 
+0

Aggiungi il tuo codice – Jas

+0

@snapdragon Inserisci il codice cosa hai fatto –

risposta

16

sono rimasto bloccato con lo stesso problema, quindi abbiamo dovuto trovare la risposta. Nel caso qualcuno venga a cercare la risposta, ecco la mia soluzione.

Il codice sorgente per il layout di AlertDialog è descritto in alert_dialog.xml (ad esempio here for android 4.4.1, che dovrebbe corrispondere al tema Holo). Layout ha paddings hardcoded (e potrebbero essere diversi nelle diverse versioni di Android). Per conoscere il riempimento predefinito è necessario sommare tutti i paddings per le Visualizzazioni contenenti id/message" TextView. In questo caso sono 3 + 14 + 5 = 22 dp a sinistra e 1 + 10 + 5 = 16 dp a destra.

L'elemento android:id/custom è dove viene inserita una vista personalizzata e ha 3 dp a sinistra e 1 dp paddings (dall'elemento radice, altri non hanno paddings) che non è necessario impostare manualmente.

Quindi, per avere il padding risultante di una vista personalizzata uguale a quella del messaggio, impostarlo su 19 dp a sinistra e 15 dp a destra (e non dimenticare di mantenere 5 dp superiore e inferiore di default).

codice Esempio:

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(); 

Questi codice dà risultato come questo (sembra buono). A proposito, questo è il tema Materiale, che sembra avere gli stessi paddings (anche hardcoded).

[]

+0

È una coincidenza che tu abbia risposto solo 23 ore fa perché ero nella stessa confusione. Chiaramente il layout predefinito non è ben progettato, ma la tua risposta funziona e lo rende molto più bello, grazie. –

+1

@MatthewMitchell siete i benvenuti! Sì, il layout AlertDialog dovrebbe probabilmente avere alcune '' '' '' @android: dimen/dialog_padding'''' anziché i numeri codificati, o forzare i paddings alle viste inserite (prima opzione è meglio, credo) –

+0

Il compilatore dice @android: dimen/dialog_padding non è pubblico. –

53

L'attributo ?dialogPreferredPadding ora ha questo valore. È stato introdotto nell'API 22; vedi https://developer.android.com/sdk/api_diff/22/changes/android.R.attr.html.

È possibile ottenere un riempimento coerente nelle finestre di dialogo personalizzate specificando questo attributo nel layout della finestra di dialogo. Ad esempio, android:paddingLeft="?dialogPreferredPadding" porterà il contenuto del dialogo in allineamento con il titolo.

+15

Funziona perfettamente, e voglio sottolineare che l'attributo è presente nella libreria di supporto se si utilizza'? dialogPreferredPadding' invece di '? android: dialogPreferredPadding'. –

+0

Quali valori è questa impostazione? Suppongo 24dp come è attualmente il valore predefinito, ma mi chiedo se questo set 20dp in alto secondo le specifiche materiali https://material.io/guidelines/components/dialogs.html#dialogs-specs – David