Zastanawiałem się, czy ktoś może mi pomóc. Próbuję utworzyć niestandardowy AlertDialog. Aby to zrobić, dodałem następujący wiersz kodu w styles.xml
<resources>
<style name="CustomAlertDialog" parent="android:Theme.Dialog.Alert">
<item name="android:windowBackground">@drawable/color_panel_background</item>
</style>
</resources>
- color_panel_background.9.png znajduje się w folderze do rysowania. Jest to również dostępne w folderze res zestawu SDK systemu Android.
Poniżej znajduje się główna aktywność.
package com.customdialog;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
public class CustomDialog extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.setTheme(R.style.CustomAlertDialog);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("HELLO!");
builder .setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//MyActivity.this.finish();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//dialog.cancel();
}
});
AlertDialog alertdialog = builder.create();
alertdialog.show();
}
}
Aby zastosować motyw do AlertDialog, musiałem ustawić motyw w bieżącym kontekście.
Jednak po prostu nie wydaje mi się, aby aplikacja wyświetlała dostosowany AlertDialog. Czy ktoś może mi przy tym pomóc?
Odpowiedzi:
W Dialog.java (Android src) używany jest ContextThemeWrapper. Możesz więc skopiować pomysł i zrobić coś takiego:
AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.AlertDialogCustom));
A potem stylizuj go tak, jak chcesz:
źródło
@android:style/Theme.Dialog
publiczny? Czy zamiast tego można go użyć?Theme.AppCompat.Light.Dialog.Alert
stylu jako elementu nadrzędnego w twoim niestandardowym stylu. Ale jeśli to zrobisz, upewnij się, że importujesz,import android.support.v7.app.AlertDialog;
a nieimport android.app.AlertDialog
Miałem ten
AlertDialog
problem związany z tematem przy użyciu SDK 1.6, jak opisano tutaj: http://markmail.org/message/mj5ut56irkrkc4nrRozwiązałem problem, wykonując następujące czynności:
Mam nadzieję że to pomoże.
źródło
W swoim blogu napisałem artykuł na temat konfigurowania układu AlertDialog z plikami w stylu XML. Głównym problemem jest to, że potrzebujesz różnych definicji stylów dla różnych parametrów układu. Oto podstawa oparta na stylu AlertDialog z Holo Light Platform wersja 19 dla pliku stylu, który powinien obejmować wiele standardowych aspektów układu, takich jak rozmiary tekstu i kolory tła.
źródło
źródło
Walczyłem z tym - możesz stylizować tło okna dialogowego za pomocą
android:alertDialogStyle="@style/AlertDialog"
swojego motywu, ale ignoruje ono wszelkie ustawienia tekstu, które masz. Jak wspomniano powyżej @rflexor, nie można tego zrobić z SDK przed Honeycomb (dobrze, że można użyćReflection
).Moim rozwiązaniem, w skrócie, było stylizowanie tła okna dialogowego za pomocą powyższego, a następnie ustawienie niestandardowego widoku tytułu i zawartości (przy użyciu układów, które są takie same jak w zestawie SDK).
Moje opakowanie:
alert_dialog_title.xml (pobrany z SDK)
alert_dialog_message.xml
Następnie po prostu użyj
CustomAlertDialogBuilder
zamiast,AlertDialog.Builder
aby utworzyć okna dialogowe i po prostu zadzwońsetTitle
isetMessage
jak zwykle.źródło
Możesz bezpośrednio przypisać motyw podczas inicjowania Konstruktora:
Następnie dostosuj swój motyw w swoim
values/styles.xml
źródło
Theme.AppCompat.Light.Dialog.Alert
W przypadku niestandardowego okna dialogowego:
wystarczy wywołać
super(context,R.style.<dialog style>)
zamiastsuper(context)
w konstruktorze dialogowymW przypadku AlertDialog:
Wystarczy utworzyć alertDialog za pomocą tego konstruktora:
źródło
Chyba nie da się tego zrobić. Przynajmniej nie z Konstruktorem. Pracuję z wersją 1.6, a implementacja w Builder.create () to:
który wywołuje konstruktora AlertDialog „nieświadomego tematu”, który wygląda następująco:
W AlertDialog istnieje drugi konstruktor do zmiany motywów:
którego Konstruktor po prostu nie dzwoni.
Jeśli i tak okno dialogowe jest dość ogólne, spróbowałbym napisać podklasę AlertDialog, wywołując drugi konstruktor i użyć tej klasy zamiast mechanizmu konstruktora.
źródło
Lepszym sposobem na to jest skorzystanie z niestandardowego okna dialogowego i dostosowanie go do własnych potrzeb. Przykład niestandardowego okna dialogowego .....
}
Oto układ XML
źródło
Każdy, kto próbuje to zrobić we fragmencie (używając biblioteki wsparcia, tj. Wcześniejszego API 11), powinien to zrobić:
@ Rflexor skłonił mnie do rozszerzenia AlertDialog i ujawnienia podziękowań dla konstruktora
źródło
AlertDialog.Builder(Context, int)
działa tylko na interfejsie API 11 i nowszych. Twój kod ulega awarii we wcześniejszych wersjach Androida.Rozwiązanie Arve Waltin wygląda dobrze, chociaż jeszcze go nie przetestowałem. Jest inne rozwiązanie w przypadku, gdy mają problemy z poruszaniem, że do pracy .... Extend
AlertDialog.Builder
i zastępują wszystkie metody (np.setText
,setTitle
,setView
Itp), aby nie ustawić rzeczywisty dialogowym Text / Tytuł / widok, ale, aby utworzyć nowy widok w Widok okna dialogowego robi tam wszystko. Następnie możesz dowolnie stylizować wszystko.Dla wyjaśnienia, jeśli chodzi o klasę nadrzędną, widok jest ustawiony i nic więcej.
Jeśli chodzi o niestandardową klasę rozszerzoną, wszystko odbywa się w tym widoku.
źródło
Nie jestem pewien, jak rozwiązanie Arve działałoby w niestandardowym oknie dialogowym z konstruktorem, w którym widok jest zawyżany przez LayoutInflator.
Rozwiązaniem powinno być wstawienie ContextThemeWrapper do inflatora poprzez
cloneInContext()
:źródło
Można to zrobić po prostu za pomocą setView () Buildera. Możesz utworzyć dowolny widok do wyboru i wprowadzić go do konstruktora. To działa dobrze. Używam niestandardowego TextView renderowanego przez narzędzie do tworzenia okien dialogowych. Nie ustawiam wiadomości, a ta przestrzeń jest wykorzystywana do renderowania mojego widoku tekstowego klienta.
źródło
źródło