Próbuję wygenerować niestandardowe okno dialogowe w systemie Android. Moje okno dialogowe tworzę w następujący sposób:
dialog = new Dialog(this);
dialog.setContentView(R.layout.my_dialog);
Wszystko działa dobrze, z wyjątkiem tytułu Dialogu. Nawet jeśli nie ustawię tytułu okna dialogowego, w oknie dialogowym jest puste miejsce w pozycji okna dialogowego.
Czy jest jakiś sposób, aby ukryć tę część okna dialogowego?
Próbowałem z AlertDialog, ale wygląda na to, że układ nie jest ustawiony poprawnie:
LayoutInflater inflater =
(LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.map_dialog, null);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(view);
// dialog = new Dialog(this);
// dialog.setContentView(R.layout.map_dialog);
dialog = builder.create();
((TextView) dialog.findViewById(R.id.nr)).setText(number);
Jeśli użyję tego kodu, w ostatnim wierszu zostanie wyświetlony zerowy wyjątek wskaźnika. Okno dialogowe nie ma wartości NULL, więc TextView, który próbuję pobrać, nie istnieje.
Jeśli odkomentuję część, w której korzystam z Konstruktora dialogu, wszystko działa dobrze, ale dla tytułu powyżej mojego układu okna dialogowego.
źródło
Odpowiedzi:
Możesz ukryć tytuł okna dialogowego, używając:
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
Poprzednia wersja tej odpowiedzi, która jest nadmiernie skomplikowana:
Musisz użyć
AlertDialog
. Istnieje dobre wyjaśnienie na stronie programisty Androida na temat niestandardowych okien dialogowych .Krótko mówiąc, robisz to za pomocą kodu takiego jak skopiowany poniżej z oficjalnej strony. To bierze niestandardowy plik layot, napompowuje go, daje mu podstawowy tekst i ikonę, a następnie tworzy. Pokazałbyś to wtedy za pomocą
alertDialog.show()
.W odpowiedzi na komentarz:
Zakładam, że TextView z identyfikatorem
nr
znajduje się w widoku, który nadmuchujeszView view = inflater....
. Jeśli tak, to musisz zmienić tylko jeden bit: zamiastdialog.findView...
zrobićview.findView...
. Potem, kiedy to zrobisz, pamiętaj, aby użyć dialog.show (), a nawet builder.show (), nie zawracając sobie głowy wykonaniem builder.create ().źródło
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
FEATURE_NO_TITLE działa podczas tworzenia okna dialogowego od zera, jak w:
Ale to nie działa podczas tworzenia AlertDialog (lub przy użyciu Konstruktora), ponieważ już wyłącza tytuł i używa niestandardowego wewnętrznie.
Przejrzałem źródła SDK i myślę, że nie można tego obejść. Aby więc usunąć górne odstępy, jedynym rozwiązaniem jest utworzenie niestandardowego okna dialogowego od podstaw IMO, bezpośrednio za pomocą klasy Dialog.
Można to również zrobić za pomocą stylu, np. W styles.xml:
I wtedy:
źródło
Dialog
, ale tworzenieAlertDialog
było znacznie łatwiejsze. Jak stwierdzono w docs :The Dialog class is the base class for dialogs, but you should avoid instantiating Dialog directly. Instead, use one of the following subclasses: <AlertDialog and others described here>
.AlertDialog
Obsługuje również cyklem życia rzeczy i OK / Cancel w łatwy sposób.W swoim kodzie dodaj ten wiersz
Lub w XML użyj motywu
XML byłby lepszą implementacją, ponieważ w wersji kodu pasek tytułu jest tworzony, a następnie usuwany, co jest marnotrawstwem zasobów
Zmień typ okna alertu na okno systemowe (np. TYPE_SYSTEM_OVERLAY) i sprawdź, czy to rozwiąże problem
źródło
Użyj w ten sposób:
Spowoduje to usunięcie paska tytułu z okna dialogowego.
źródło
Użyj kodu poniżej
setcontentview
:Uwaga : Musisz mieć powyższy kod, w tej samej kolejności i wierszu.
requestWindowFeature
musi znajdować się przed linią setContentView.źródło
możesz usunąć tytuł przez
gdzie okno dialogowe to nazwa mojego okna dialogowego.
źródło
Jeśli używasz kodu,
requestWindowFeature(Window.FEATURE_NO_TITLE);
upewnij się, że działa wcześniej, wdialog.setContentView();
przeciwnym razie spowoduje to awarię aplikacji.źródło
Znalazłem Three Way to zrobić>
1) Korzystanie z requestWindowFeature
2) Korzystanie ze stylu (style.xml)
3) Używanie motywu XML w AndroidManifest.xml
źródło
W swojej klasie Custom_Dialog.java dodaj
requestWindowFeature(Window.FEATURE_NO_TITLE)
źródło
Odpowiedź olivierga zadziałała dla mnie i jest najlepszym rozwiązaniem, jeśli utworzenie niestandardowej klasy Dialog to trasa, którą chcesz się udać. Niepokoiło mnie jednak, że nie mogę użyć klasy AlertDialog. Chciałem móc korzystać z domyślnego systemu AlertDialog. Utworzenie niestandardowej klasy okna dialogowego nie miałoby tego stylu.
Więc znalazłem rozwiązanie (hack), które będzie działać bez konieczności tworzenia niestandardowej klasy, możesz użyć istniejących konstruktorów.
AlertDialog umieszcza widok nad widokiem zawartości jako symbol zastępczy tytułu. Jeśli znajdziesz widok i ustawisz wysokość na 0, przestrzeń zniknie.
Do tej pory przetestowałem to na 2.3 i 3.0, możliwe, że nie działa jeszcze w każdej wersji.
Oto dwie metody pomocnicze:
Oto przykład jego użycia:
Jeśli używasz tego z DialogFragment, zastąp
onCreateDialog
metodę DialogFragment . Następnie utwórz i zwróć okno dialogowe jak w pierwszym przykładzie powyżej. Jedyną zmianą jest to, że powinieneś przekazać false jako trzeci parametr (show), aby nie wywoływał show () w oknie dialogowym. DialogFragment zajmie się tym później.Przykład:
Gdy będę to testować dalej, będę musiał zaktualizować o wszelkie dodatkowe poprawki.
źródło
Nie wiem, czy to pytanie jest nadal aktualne, ale w moim przypadku, kiedy przełączyłem się z Dialog na DialogFragment,
nie było opcji, ale mogłem użyć
zamiast tego z tym samym wynikiem.
źródło
setStyle(STYLE_NO_TITLE, 0);
) przejdzie do metody onCreate klasy DialogFragment.Ustaw tytuł na pusty ciąg znaków za pomocą konstruktora.
źródło
ustaw atrybut „grawitacja” w całym oknie dialogowym na „środek”. Następnie musisz zastąpić to ustawienie do wszystkich komponentów potomnych w oknie dialogowym, którego nie chcesz wyśrodkowywać.
źródło
źródło
w XML użyj motywu
źródło
Jeśli po prostu skorzystamy z okna dialogowego bez
setTitle()
, to czy zadziała to w usunięciu spacji tytułu?źródło
Myślisz, że możesz tego teraz użyć:
źródło
tworzy okno dialogowe bez tytułu
źródło
źródło
Podczas korzystania z AlertDialog nieużywanie
setTitle()
powoduje zniknięcie tytułuźródło
Po kilku włamaniach, mam to do pracy:
źródło
dialog
tu jest igetResources()
Możesz to zrobić bez użycia
AlertDialog
, definiując nową klasę, która wykracza pozaDialog
klasę w następujący sposób:źródło
Oto coś, co możesz zrobić,
AlertBuilder
aby zniknął tytuł:źródło
Użyj tego
źródło
dialog_custom .requestWindowFeature (Window.FEATURE_NO_TITLE);
spowoduje to usunięcie tytułu z okna dialogowego cutes.
Uwaga: dodaj tę linię przed dodaniem treści .. na przykład
źródło