W dokumentacji systemu Android w AlertDialog zawiera następujące instrukcje i przykład ustawiania widoku niestandardowego w AlertDialog:
Jeśli chcesz wyświetlić bardziej złożony widok, wyszukaj FrameLayout o nazwie „body” i dodaj do niego swój widok:
FrameLayout fl = (FrameLayout) findViewById(R.id.body);
fl.add(myView, new LayoutParams(FILL_PARENT, WRAP_CONTENT));
Po pierwsze, jest całkiem oczywiste, że add()
jest to literówka i tak ma być addView()
.
Jestem zdezorientowany pierwszą linią używającą R.id.body. Wygląda na to, że jest to element treści AlertDialog ... ale nie mogę po prostu wpisać tego w moim kodzie b / c, daje to błąd kompilacji. Gdzie R.id.body jest definiowany lub przypisywany czy cokolwiek?
Oto mój kod. Próbowałem użyć setView(findViewById(R.layout.whatever)
na konstruktorze, ale to nie zadziałało. Zakładam, bo nie nadmuchałem go ręcznie?
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Title")
.setCancelable(false)
.setPositiveButton("Go", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
EditText textBox = (EditText) findViewById(R.id.textbox);
doStuff();
}
});
FrameLayout f1 = (FrameLayout)findViewById(R.id.body /*CURRENTLY an ERROR*/);
f1.addView(findViewById(R.layout.dialog_view));
AlertDialog alert = builder.create();
alert.show();
android
android-alertdialog
burza 986
źródło
źródło
.setView(getLayoutInflater().inflate(R.layout.dialog_view, null))
do kreatora. Podziękowania dla Sergio Viudesa, poniżej.Odpowiedzi:
Masz rację, to dlatego, że nie nadmuchałeś go ręcznie. Wygląda na to, że próbujesz „wyodrębnić” identyfikator „treści” z układu działania, ale to nie zadziała.
Prawdopodobnie chcesz coś takiego:
źródło
builder.setView(inflater.inflate(R.id.dialog, ROOT_VIEWGROUP[, ATTACH_TO_ROOT]))
, dokumenty mówią, że główna grupa widoków jest opcjonalna. Czy powinno to być używane w tym przypadku? Jeśli tak ... nadal muszę dowiedzieć się, jak uzyskać odniesienie do AlertDialog ...View
napompowania. WzywajfindViewById()
to,View
gdy potrzebujesz czegoś z jego zawartości. Zobacz: github.com/commonsguy/cw-android/tree/master/Database/ConstantsMożesz utworzyć widok bezpośrednio z modułu Layout Inflater, wystarczy użyć nazwy pliku XML układu i identyfikatora układu w pliku.
Twój plik XML powinien mieć następujący identyfikator:
Następnie możesz ustawić układ w kreatorze za pomocą następującego kodu:
źródło
getCurrentFocus()
zwróci EditText i nie można rzutować EditText na ViewGroup. Użycienull
drugiego argumentu rozwiązuje ten problem.android.R.id.custom zwracał dla mnie wartość zerową. Udało mi się to uruchomić na wypadek, gdyby ktoś napotkał ten sam problem,
Dla porównania, R.layout.simple_password to:
źródło
FrameLayout
jak fragment? Kiedy wypróbowałem powyższą odpowiedź Andrewx2, pojawił się błąd, ponieważ myślałem, że nadmuchuję dwa układy (to moje przypuszczenie).Dokumenty Androida zostały zmodyfikowane, aby poprawić błędy.
Wywoływany jest widok wewnątrz AlertDialog
android.R.id.custom
http://developer.android.com/reference/android/app/AlertDialog.html
źródło
To zadziałało dla mnie:
źródło
Custom AlertDialog
Ten pełny przykład obejmuje przekazywanie danych z powrotem do działania.
Utwórz niestandardowy układ
W
EditText
tym prostym przykładzie zastosowano układ z symbolem, ale możesz go zastąpić dowolnym innym.custom_layout.xml
Użyj okna dialogowego w kodzie
Kluczowe części to
setView
przypisać niestandardowy układ do plikuAlertDialog.Builder
To jest pełny kod z przykładowego projektu pokazanego na powyższym obrazku:
MainActivity.java
Uwagi
DialogFragment
podklasy zgodnie z opisem w dokumentacji .Zobacz też
źródło
EditText editText = customLayout.findViewById(R.id.editText);
powinno byćEditText editText = (EditText) customLayout.findViewById(R.id.editText);
Najprostsze wiersze kodu, które działają dla mnie, to:
Niezależnie od typu układu (LinearLayout, FrameLayout, RelativeLayout) będzie działać
setView
i będzie się różnić wyglądem i zachowaniem.źródło
Najłatwiej to zrobić, używając
android.support.v7.app.AlertDialog
zamiastandroid.app.AlertDialog
gdziepublic AlertDialog.Builder setView (int layoutResId)
można użyć poniżej API 21.źródło
AlertDialog.setView(View view)
dodaje dany widok do plikuR.id.custom FrameLayout
. Poniżej znajduje się fragment kodu źródłowego Androida, zAlertController.setupView()
którego w końcu to obsługuje (mView
jest to widok przekazanyAlertDialog.setView
metodzie).źródło
Po zmianie identyfikatora na android.R.id.custom musiałem dodać następujące elementy, aby wyświetlić widok:
Jednak spowodowało to renderowanie nowego widoku w dużym widoku nadrzędnym bez tła, dzieląc okno dialogowe na dwie części (tekst i przyciski, a nowy widok pomiędzy nimi). W końcu uzyskałem efekt, który chciałem, wstawiając mój Widok obok wiadomości:
Znalazłem to rozwiązanie, eksplorując drzewo widoku za pomocą View.getParent () i View.getChildAt (int). Jednak nie jestem z tego zadowolony. Nic z tego nie jest w dokumentacji systemu Android i jeśli kiedykolwiek zmienią strukturę AlertDialog, może to się zepsuć.
źródło
Najbardziej sensowne byłoby zrobienie tego w ten sposób, przy najmniejszej ilości kodu.
Aby zobaczyć rozszerzoną listę rzeczy, które możesz ustawić, zacznij pisać
.set
w Android Studioźródło