2015-10-12 14 views
30

Muszę zrobić AlertDialog z niestandardowym widokiem. Wiadomość od AlertDialog ma domyślne dopełnienie, ale gdy ustawiam widok bez dopełnienia, to różdżkę, aby uzyskać takie samo wypełnienie, jak domyślny komunikat. Używam stylu, który rozszerza motyw Holo (jeśli jest to istotne).Pierwsze domyślne wypełnienie dla 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(); 

to układ za treść:

<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

Dodaj swój kod również – Jas

+0

@snapdragon Dodaj kod, co zrobiłeś –

Odpowiedz

16

utknąłem z tym samym problemem, więc musiała znaleźć odpowiedź. Jeśli ktoś szuka odpowiedzi, oto moje rozwiązanie.

Kod źródłowy układu AlertDialog jest opisany w pliku alert_dialog.xml (np. here for android 4.4.1, który powinien odpowiadać motywowi Holo). Układ ma zakodowane wypustki (i mogą się one różnić w różnych wersjach Androida). Aby poznać domyślne wypełnienie, musisz podsumować wszystkie paddings dla widoków zawierających tekst TextView. W tym przypadku są to 3 + 14 + 5 = 22 dp lewo i 1 + 10 + 5 = 16 dp prawo.

Element jest elementem, w którym niestandardowy widok jest wstawiany i ma 3 dp lewe i 1 dp prawe wstawki (z głównego elementu, inne nie mają wypustek), których nie trzeba ustawiać ręcznie.

Aby uzyskać wynik wypełnienia niestandardowego widoku, taki sam jak komunikat, ustaw go na 19 dp lewy i 15 dp na prawo (i nie zapomnij zachować domyślnego 5 dp górnego i dolnego marginesu).

Przykładowy kod:

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

Są kod daje prowadzić tak (wygląda dobrze). BTW, to jest temat Material, który wydaje się mieć te same podpórki (również na stałe).

[]

+0

To zbieg okoliczności, że odpowiedziałeś tylko 23 godziny temu, ponieważ byłam w tym samym błędzie. Najwyraźniej domyślny układ nie jest dobrze zaprojektowany, ale twoja odpowiedź działa i sprawia, że ​​wygląda dużo ładniej, dziękuję. –

+1

@MatthewMitchell, witamy! Tak, układ AlertDialog powinien prawdopodobnie mieć stałe stałe '' '@android: dimen/dialog_padding''''' zamiast liczb zakodowanych na stałe lub wymusić wstawki do wstawionych widoków (pierwsza opcja jest lepsza, jak sądzę) –

+0

Kompilator mówi @android: dimen/dialog_padding nie jest publiczny. –

53

atrybut ?dialogPreferredPadding ma teraz wartość. Został wprowadzony w API 22; patrz https://developer.android.com/sdk/api_diff/22/changes/android.R.attr.html.

Możesz uzyskać spójne wypełnienie w niestandardowych oknach dialogowych, podając ten atrybut w układzie okna dialogowego. Na przykład android:paddingLeft="?dialogPreferredPadding" spowoduje dostosowanie zawartości okna dialogowego do jej tytułu.

+15

Działa to doskonale i chcę zaznaczyć, że atrybut jest obecny w bibliotece pomocniczej, jeśli użyjesz'? dialogPreferredPadding' zamiast '? android: dialogPreferredPadding'. –

+0

Jakie wartości to ustawienie? Przypuszczam, że jest to 24dp, ponieważ jest to obecnie wartość domyślna, ale zastanawiam się, czy to ustawienie 20dp na górze, jak na specyfikacje materiałowe https://material.io/guidelines/components/dialogs.html#dialogs-specs – David