Z tym działaniem musisz użyć motywu Theme.AppCompat (lub elementu potomnego)


1004

Android Studio 0.4.5

Dokumentacja Androida do tworzenia niestandardowych okien dialogowych: http://developer.android.com/guide/topics/ui/dialogs.html

Jeśli chcesz mieć niestandardowe okno dialogowe, możesz zamiast tego wyświetlić działanie jako okno dialogowe zamiast korzystać z interfejsów API Dialog. Po prostu utwórz działanie i ustaw jego motyw na Theme.Holo.Dialog w <activity>elemencie manifestu:

<activity android:theme="@android:style/Theme.Holo.Dialog" >

Jednak gdy spróbowałem tego, otrzymuję następujący wyjątek:

java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity

Wspieram następujące i nie mogę użyć czegoś większego niż 10 dla min:

minSdkVersion 10
targetSdkVersion 19

W moich stylach mam następujące:

<!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

I w moim manifeście mam to do działania:

 <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:theme="@android:style/Theme.Holo.Light.Dialog"
            android:name="com.ssd.register.Dialog_update"
            android:label="@string/title_activity_dialog_update" >
        </activity>

Utworzenie takiego okna dialogowego było czymś, co miałem nadzieję zrobić, ponieważ już ukończyłem układ.

Czy ktoś może mi powiedzieć, jak mogę obejść ten problem?


2
@Raghunandan, jestem nowy w tym, ale patrząc na moje style mam następujące: <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> I mam następujący import: import android.support.v7 .app.ActionBarActivity; import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; Ale nie jestem pewien, co to wszystko znaczy.
— ant2009

10
Używasz, AppCompatktóry jest z biblioteki wsparcia do obsługi pasków akcji poniżej poziomu interfejsu API 11. Po prostu użyj android:theme="@style/AppTheme" >do działania w manifeście
— Raghunandan

2
@ ant2009, aby wyjaśnić to, co powiedział @Raghunandan: w twoim motywie, który określasz AndroidManifest.xmldla swojej działalności, przesłaniasz motyw , który określasz dla swojej aplikacji. Usuń android:themelinię ze <activity>znacznika.
— kryptochronokonolit

3
Spowoduje to usunięcie błędu, ale nie doprowadzi go do miejsca, w którym chce być, co jest działaniem z motywem okna dialogowego. Ogólna zasada mówi, że jeśli chcesz, aby twoja aktywność miała pasek akcji, powinna ona mieć motyw AppCompat, a kod Java powinien rozszerzyć ActionBarActivity. Jeśli masz działanie, które nie wymaga paska akcji (np. Działanie o tematyce dialogowej), możesz zastosować do niego dowolny motyw, ale kod Java musi rozszerzyć zwykłą starą aktywność.
— Bobbake4

1
Myślę, że jedynym problemem w tym przypadku jest kontekst, który podajesz dla programu Dialog constractor. Zobacz moją odpowiedź. stackoverflow.com/a/51574281/232727
— Vitaliy A

Odpowiedzi:


1123

Przyczyną tego problemu jest to, że działanie, do którego próbujesz zastosować motyw okna dialogowego, rozszerza się, ActionBarActivityco wymaga zastosowania AppCompatmotywu.

Aktualizacja : rozszerzenie AppCompatActivityrównież miałoby ten problem

W takim przypadku zmień dziedziczenie Java z ActionBarActivityna Activityi pozostaw motyw okna dialogowego w manifeście bez Theme.AppCompatwartości


Ogólna zasada jest taka, że ​​jeśli chcesz, aby Twój kod obsługiwał starsze wersje Androida, powinien mieć AppCompatmotyw, a kod Java powinien się rozszerzyć AppCompatActivity. Jeśli masz * działanie, które nie potrzebuje tego wsparcia, na przykład jeśli zależy Ci tylko na najnowszych wersjach i funkcjach Androida, możesz zastosować do niego dowolny motyw, ale kod Java musi być prosty Activity.


UWAGA: W przypadku zmiany z AppCompatActivity(lub podklasy ActionBarActivity) na Activity, należy również zmienić różne połączenia z „wsparciem” na odpowiednie połączenie bez „wsparcia”. Zamiast getSupportFragmentManagerdzwonić getFragmentManager.


6
op używa appcompat, w którym to przypadku powinien rozszerzyć ActionBarActivityto, co pokazano w jego instrukcjach importu z komentarza poniżej pytania.
— Raghunandan

2
@Bursos Jeśli mówisz o tworzeniu nowego projektu w Android Studio, domyślam się, że to błąd w standardowej konfiguracji.
— Bobbake4

2
@ Bobbake4, mam ten sam problem, a to rozwiązanie jest dla mnie niemożliwe. Chodzi o to, że nie mogę rozszerzyć działania, ponieważ mam kilka klas (cały projekt), które korzystają z ActionBarActivity. Czy jest jakieś inne rozwiązanie tego problemu? Thx
— 5er

6
@ 5er Jeśli Twoja Java korzysta z ActionBarActivity, motyw musi mieć rozszerzenie Theme.AppCompat. Istnieje garść wbudowanych motywów, które rozszerzają Theme.AppCompat lub możesz sam go rozszerzyć i zmodyfikować. Bez usunięcia elementu nadrzędnego ActionBarActivity nie można poruszać się za pomocą Theme.AppCompat.
— Bobbake4,

26
W stylu <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> to rozwiązało mój problem. :)
— Harmeet Singh,

545

Wszystko, co musisz zrobić, to dodać android:theme="@style/Theme.AppCompat.Light"do znacznika aplikacji w AndroidManifest.xmlpliku.


2
W kodzie ant2009 ma ustawiony AppTheme jako aplikacja, która rozciąga się od potomka Theme.AppCompat. To powinno działać. Miałem ten sam problem po aktualizacji do wersji 5.0 na moim urządzeniu i ostatecznie ustawiłem @ style / Theme.AppCompat.Light jako motyw w mojej działalności. Coś tu nie
— gra

36
To nie jest poprawna odpowiedź dla Androida Studio, choć w niektórych przypadkach będzie działać jako szybka poprawka, gdy omijasz pliki styles.xml. W Android Studio właściwym sposobem zdefiniowania motywu jest zdefiniowanie ich w plikach styles.xml, a następnie plik manifestu Androida będzie się do nich jedynie odwoływał i wybierał je na podstawie wersji Androida uruchomionej na urządzeniu. Zwykle jest ustawiony na Androida: theme = "@ style / AppTheme", a ten AppTheme odnosi się do <style name = "Theme.AppTheme" parent = "Theme.AppCompat.Light"> w styles.xml
— zeeshan

5
To naprawdę nie działało dla mnie, ponieważ moje paski tytułowe zniknęły, gdy użyłem niczego oprócz holo ...
— AndyD273

1
Wpadłem również na ten problem przy użyciu SnackBar. To rozwiązało mój problem.
— pracował

2
@ Martin, jeśli jesteś podobny do mnie, zapomniałeś dodać tę samą nazwę stylu w ogólnym pliku styles.xml niż w pliku (V21) styles.xml (bez właściwości specyficznych dla V21). Jeśli zadeklarujesz styl w folderze V21, a Twoje urządzenie ma wersję poniżej. Nie może go znaleźć, więc został wyzwolony wyjątek.
— letroll

275

Kopiowanie odpowiedzi z @MarkKeen w powyższych komentarzach, ponieważ miałem ten sam problem.

Wystąpił błąd podany u góry postu i zdarzyło się po dodaniu okna dialogowego z ostrzeżeniem. Mam wszystkie odpowiednie informacje o stylu w manifeście. Mój problem został rozwiązany przez zmianę odwołania do kontekstu w kreatorze alertów - zmieniłem:

new android.support.v7.app.AlertDialog.Builder(getApplicationContext())

do:

new android.support.v7.app.AlertDialog.Builder(this)

I żadnych problemów.


5
Stało się to również ze mną. Po prostu próbowałem i twoja odpowiedź naprawdę zadziałała! Jaka jest logika działania? Naprawdę nie zrozumiałem.
— kirtan403

6
Lub, jeśli budujesz swój AlertDialog we fragmencie, a nie bezpośrednio w działaniu, użyj getActivity()raczej niż thisjak sugerowano powyżej, a problem zostanie rozwiązany. Jeśli chodzi o powód, mogę tylko przypuszczać, że starszy kod AlertDialog.Builder (xxx) albo chciał przekazać inny typ, albo był po prostu mniej wybredny w kwestii tego, co zostało przekazane, podczas gdy obecny Builder () naprawdę naprawdę chce działania. Ponieważ Google zdecydowało się ukryć (usunąć?) Dokumentację starego kodu, prawdopodobnie w celu zachęcenia do korzystania z wersji v7.app, nie wiem na pewno.
— Anne Gunn

Czy przeciwieństwo tego, co jest sugerowane. I zadziałało: P. Dzięki!
— Harisewak,

1
To rozwiąże program dla mnie, również powinieneś użyć getContext()zamiast, thisjeśli jesteś w ArrayAdapter lub podobnej klasie adaptera.
— Ibrahim.H,

1
To oryginalne rozwiązanie, jakie kiedykolwiek spotkałem. WSKAZÓWKA: Podaj różnicę w getApplicationContext () i to w tym celu.
— prazeev

109

min sdk to 10. ActionBarjest dostępny z poziomu interfejsu API 11. Tak więc dla 10 będziesz korzystać AppCompatz biblioteki wsparcia, do której musisz użyć Theme.AppCompatlub z niego.

Posługiwać się

android:theme="@style/Theme.AppCompat" >

Lub jeśli nie chcesz paska akcji na górze

android:theme="@style/Theme.AppCompat.NoActionBar">

Więcej informacji @

http://developer.android.com/guide/topics/ui/actionbar.html

Edytować:

Być może błędnie odczytałem post.

Wygląda na to, że chce dialogu z motywem działania. Jak już sugerował Bobbake4, Activityzamiast rozszerzać ActionBarActivity.

Zobacz także atrybuty @ Dialog w linku poniżej

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4_r1/frameworks/base/core/res/res/values/themes.xml/


Dzieki za sugestie. Próbowałem tego już właściwie. I mam ten sam problem. Mój plik stylów wygląda następująco: <style name = "AppTheme" parent = "Theme.AppCompat">
— ant2009

@ ant2009 nie będziesz. Użyj motywu z biblioteki wsparcia AppCompat do swojej aktywności
— Raghunandan

Nie jestem pewien, czy dodam ten motyw poprawnie. Ale czy masz na myśli dodanie następującej instrukcji importu? import android.support.v7.appcompat. *; Jednak spróbowałem tego i może się mylę, ponieważ nadal miałem ten sam wyjątek.
— ant2009

@ ant2009 możesz mieć niestandardowe okno dialogowe. Ale czy chcesz przejść do pełnego ekranu dialogowego?
— Raghunandan

Nie chciałem mieć pełnego ekranu. Tylko okno dialogowe. Jednak problem został już rozwiązany. Bobbake4 ma rację. W każdym razie dzięki za twój wysiłek, udzieliłeś użytecznych porad. Jednak nadal jestem mylony z całą tą biblioteką wsparcia i AppCompat.
— ant2009

99

Jeśli korzystasz z kontekstu aplikacji, wykonaj następujące czynności:

final AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());

zmień go na kontekst działania taki jak ten:

final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

To samo, jeśli używasz LayoutInflater.from (<kontekst aplikacji>), upewnij się, że używasz kontekstu aktywności lub dostarczonego LayoutInflater, aby odziedziczył odpowiedni motyw.
— lbarbosa

1
Twoje rozwiązanie pomogło mi w moim przypadku. Czy możesz wyjaśnić, jaka jest różnica między getApplicationContext () a MainActivity.this?
— kostyabakay 19.04.17


9
potrzebujesz aktywności, a nie kontekstu, aby wyświetlić okna dialogowe
— behelit

to rozwiązanie rozwiązuje
— Mohamed Amin

45

Wystąpił ten problem, mimo że mój motyw był AppCompatmotywem, a moja aktywność była AppCompatActivity(lub Activity, jak sugerowano w odpowiedziach innych). Więc wyczyściłem, przebudowałem i uruchomiłem ponownie projekt.

( Kompilacja -> Wyczyść projekt; Kompilacja -> Przebuduj projekt; Uruchom -> Uruchom )

To może wydawać się głupie, ale teraz działa świetnie !

Mam tylko nadzieję, że to pomoże!


1
Miał dokładnie ten sam komunikat po dodaniu DialogFragment do działania AppCompat. Plik, unieważnienie pamięci podręcznej / restartu naprawiono to w mgnieniu oka.
— halaksynat

2
Próbowałem prawie wszystkich odpowiedzi w tym wątku. ale działa tylko ta z pozoru „głupia” odpowiedź. Dziękuję Ci!
— Dika

27

To właśnie to dla mnie naprawiło: zamiast określać temat w manifeście, zdefiniowałem go onCreatedla każdego działania, które rozszerza ActionBarActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.MyAppTheme);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_activity_layout);
...
}

Oto MyAppThemepotomek Theme.AppCompati jest zdefiniowany w XML. Pamiętaj, że motyw musi być ustawiony przed super.onCreatei setContentView.


1
Robolectric zgłasza wyjątek NullPointerException w linii setTheme podczas próby załadowania zasobu. Masz pomysł, dlaczego?
— Rhys Davis

@RhysDavis Trudno powiedzieć bez śladu stosu, ale może najpierw chce ustawić setContentView? W takim przypadku ta poprawka nie będzie działać.
— k29

19

idź do swoich stylów i postaw rodzica

parent="Theme.AppCompat"

zamiast

parent="@android:style/Theme.Holo.Light"

Dlaczego możemy to zrobić za pomocą standardowego działania. Czy Android nie umieścił pasków akcji w Standardowych działaniach za pomocą ICS lub Honecomb? Czy zawsze musimy użyć ActionBarActivity, jeśli ustawimy nasz minimalny cel na SDK ICS?
— Andrew S,

jak sprawdzić, którego motywu należy użyć z typem lub funkcją, której używamy, ponieważ podczas importowania mamy dostępne wszystkie typy motywów
— blackHawk

16

W moim przypadku nie mam pliku wartości-v21 w moim katalogu res. Następnie utworzyłem go i dodałem w nim następujące kody:

  <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

Uruchomiłem swój projekt na urządzeniach Oreo + i tylko to działało dla mnie.
— Nishant Soni

16

Zmień motyw żądanego działania. To działa dla mnie:

<activity
            android:name="HomeActivity"
            android:screenOrientation="landscape"
            android:theme="@style/Theme.AppCompat.Light"
            android:windowSoftInputMode="stateHidden" />

14

Miałem taką awarię na urządzeniach Samsunga , mimo że aktywność korzystała z Theme.AppCompat . Główna przyczyna była związana z dziwnymi optymalizacjami po stronie Samsunga:

- if one activity of your app has theme not inherited from Theme.AppCompat
- and it has also `android:launchMode="singleTask"`
- then all the activities that are launched from it will share the same Theme

Moje rozwiązanie właśnie usuwało android:launchMode="singleTask"


2
Wpadłem na to również, nie sprawdziłem poprawności i nie mogę odtworzyć błędu .. ale widzę ten błąd na wolności tylko na urządzeniach Samsung. większość wydaje się być również zakorzeniona, fwiw
— danb

Wystąpił błąd podany na początku wiadomości i pojawił się po dodaniu okna dialogowego z ostrzeżeniem. Mam wszystkie odpowiednie informacje o stylu w manifeście. Mój problem został rozwiązany przez zmianę odwołania do kontekstu w kreatorze alertów - zmieniłem: nowy android.support.v7.app.AlertDialog.Builder (getApplicationContext ()) na: nowy android.support.v7.app.AlertDialog.Builder (ten ) i żadnych dalszych problemów ...
— Mark Keen

Czy masz więcej szczegółów lub linków do Samsung na temat tej optymalizacji? Czy wszystkie działania muszą zatem implementować Theme.AppCompat, czy mogą istnieć działania bez tematu?
— AAverin

13

Jeśli chcesz rozszerzyć ActionBarActivity, potrzebujesz w pliku style.xml:

<!-- Base application theme. -->
<style name="AppTheme" parent="AppTheme.Base"/>

<style name="AppTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->

Jeśli ustawisz jako główny motyw aplikacji jako Android: Theme.Material.Light zamiast AppTheme.Base , otrzymasz błąd „IllegalStateException: Musisz użyć motywu Theme.AppCompat (lub elementu potomnego) z tą aktywnością”.


13

Po prostu zrób

new AlertDialog.Builder(this)

Zamiast

new AlertDialog.Builder(getApplicationContext())

Działające rozwiązanie! 30 minut, aby dowiedzieć się z tą odpowiedzią. Dlaczego używam nowego AlertDialog.Builder (getApplicationContext ())?
— Erich García

Pomocne będzie wyjaśnienie, jakiego rodzaju będzie thisoczekiwany.
— Blago,

12

Miałem ten sam problem, ale problem został rozwiązany, gdy włączyłem ten manifest: android: theme = "@ style / Theme.AppCompat.

    <application
        android:allowBackup="true"
        android:icon="@drawable/icon"
        android:label="@string/app_name_test"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat">

        ...    

    </application>

10

W moim przypadku taki problem pojawił się, gdy próbowałem wyświetlić okno dialogowe. Problem tkwił w kontekście, użyłem getBaseContext (), który teoretycznie powinien zwrócić kontekst działania, ale wydaje się, że nie, lub zwraca kontekst przed zastosowaniem dowolnego motywu.

Właśnie zastąpiłem getBaseContexts () słowem „ this ”, a teraz działa zgodnie z oczekiwaniami.

        Dialog.showAlert(this, title, message,....);

Przechodziłem przez getApplicaitonContext (), ale twoja załatwiła sprawę
— Jeeva

9

Miałem aktywność z motywem <android:theme="@android:style/Theme.Dialog">służącym do wyświetlania okna dialogowego w mojej aplikacji Widget i miałem ten sam problem

Rozwiązałem ten błąd, zmieniając kod aktywności, jak poniżej:

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.Theme_AppCompat_Dialog); //this line i added
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dialog);
}

2
To była prosta odpowiedź, która zadziałała dla mnie bez całej złożoności i braku odpowiedzi przyjętej.
— Cory Trese,

8

dla mnie było rozwiązanie do użycia ContextThemeWrapper:

private FloatingActionButton getFAB() {
Context context = new android.support.v7.view.ContextThemeWrapper(getContext(), R.style.AppTheme);
FloatingActionButton fab = new FloatingActionButton(context);
return fab;}

z Androida - Jak programowo tworzyć FAB?


8

Upewnij się, że używasz kontekstu działania podczas tworzenia nowego okna dialogowego alertu, a nie kontekstu aplikacji lub podstawowego.


7

Miałem również ten problem i to, co zrobiłem, aby go naprawić, ORAZ nadal korzystałem z motywu Holo, wykonując następujące kroki:

najpierw zastąpiłem ten import:

import android.support.v7.app.AppCompatActivity;

z tym:

import android.app.Activity;

następnie zmieniłem moje rozszerzenie z:

public class MyClass extends AppCompatActivity {//...

do tego:

public class MyClass extends Activity {//...

A także musiał zmienić ten import:

import android.support.v7.app.AlertDialog;

do tego importu:

import android.app.AlertDialog;

a następnie możesz użyć tagu tematu w manifeście na poziomie aktywności:

android:theme="@android:style/Theme.Holo.Dialog" />

i na koniec (chyba że masz w swoim projekcie inne klasy, które muszą korzystać z v7 appCompat) możesz wyczyścić i przebudować swój projekt lub usunąć ten wpis z pliku budowania stopni na poziomie aplikacji:

compile 'com.android.support:appcompat-v7:23.2.1'

jeśli masz w projekcie inne klasy, które muszą korzystać z v7 appCompat, po prostu wyczyść i przebuduj projekt.


6

Przyszedłeś do tego, ponieważ chcesz zastosować Material Design w swoim stylu motywu we wcześniejszych wersjach SDK do 21. ActionBarActivityWymaga to, AppThemewięc jeśli chcesz również zapobiec własnej personalizacji AppTheme, tylko musisz zmienić style.xml (poprzedni do sdk 21), aby w ten sposób można odziedziczyć motyw App Compat.

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">

dla tego:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

6
Zrobił to. Nadal mam problem. Jest więc coś więcej.
— Martin

6

Zmień styl nadrzędny stylu motywu na

 parent="Theme.AppCompat"

To działało dla mnie ...


6

Masz wiele rozwiązań tego błędu.

  1. Powinieneś użyć Activity lub FragmentActivity zamiast ActionbarActivity lub AppCompatActivity

  2. Jeśli chcesz użyć ActionbarActivity lub AppCompatActivity , powinieneś zmienić w styles.xml Theme.Holo.xxxx na Theme.AppCompat.Light (w razie potrzeby dodaj do DarkActionbar )

Jeśli nie potrzebujesz zaawansowanych atrybutów dotyczących paska akcji lub AppCompat , nie musisz używać Actionbar lub AppCompat .


6

W manifeście Androida wystarczy zmienić motyw aktywności na AppTheme, postępując zgodnie z fragmentem kodu

<activity
  android:name=".MainActivity"
  android:label="@string/app_name"
  android:theme="@style/AppTheme">
</activity>

<aktywność android: nazwa = ". MainActivity" android: label = "@ string / nazwa_aplikacji" android: theme = "@ style / AppTheme"> </activity>
— shikha

6

To jest, gdy chcesz AlertDialog we fragmencie

            AlertDialog.Builder adb = new AlertDialog.Builder(getActivity());
            adb.setTitle("My alert Dialogue \n");
            adb.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                  //some code

            } });
            adb.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                 dialog.dismiss();

                } });
            adb.show();

6

W moich doświadczeniach problemem był kontekst, w którym pokazałem swój dialog. Wewnątrz przycisku kliknięcia tworzę instancję AlertDialog w następujący sposób:

builder = new AlertDialog.Builder(getApplicationContext());

Ale kontekst był niepoprawny i spowodował błąd. Zmieniłem to za pomocą kontekstu aplikacji w następujący sposób:

W sekcji deklaracji:

Context mContext;

w metodzie onCreate

mContext = this;

I wreszcie w kodzie, w którym potrzebuję AlertDialog:

start_stop = (Button) findViewById(R.id.start_stop);
start_stop.setOnClickListener( new View.OnClickListener()
     {
                @Override
                public void onClick(View v)
                {
                    if (!is_running)
                    {
                        builder = new AlertDialog.Builder(mContext);
                        builder.setMessage("MYTEXT")
                                .setCancelable(false)
                                .setPositiveButton("SI", new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                    Task_Started = false;
                                    startTask();
                                    }
                                })
                                .setNegativeButton("NO",
                                        new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                        dialog.cancel();
                                    }
                                });
                        AlertDialog alert = builder.create();
                        alert.show();
                    }
            }
        }

To jest dla mnie rozwiązanie.


Masz rację, że nie powinieneś używać kontekstu aplikacji w sposób, w jaki go pierwotnie posiadałeś. Zamiast tego użyjesz działania jako kontekstu. Nie jest to jednak kontekst aplikacji ani jego podklasa. Dlatego nie można powiedzieć, że używasz kontekstu aplikacji w inny sposób.
— Hod

5

Ten działał dla mnie:

<application
           android:allowBackup="true"
           android:icon="@mipmap/ic_launcher"
           android:label="@string/app_name"
           android:theme="@style/AppTheme" >
           <activity
               android:name=".MainActivity"
               android:label="@string/app_name"
               android:theme="@style/Theme.AppCompat.NoActionBar">

               <intent-filter>
                   <action android:name="android.intent.action.MAIN" />

                   <category android:name="android.intent.category.LAUNCHER" />
               </intent-filter>
           </activity>
</application>

5

Twoja aktywność rozszerza ActionBarActivity, która wymaga zastosowania AppCompat.theme . Zmiana z ActionBarActivity na Activity lub FragmentActivity rozwiąże problem.

Jeśli nie używasz paska akcji, wówczas:

android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" 

5

Miałem ten sam problem. Ponieważ tworzyłem niestandardową szufladę nawigacji. Ale zapomniałem wspomnieć o temacie w moim manifeście w ten sposób

android:theme="@style/Theme.AppCompat.NoActionBar"

Gdy tylko dodałem powyższy motyw do mojego manifestu, rozwiązało to problem.


4

Szybkie rozwiązanie

Zmień nadrzędny motyw podstawowy w styles.xml

Zamień z

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

do

<style name="AppTheme" parent="Theme.AppCompat">

nie pomaga mi, wyjątek wciąż się uruchamia
— Eugene Gr. Philippov

3

To rozwiązanie działało dla mnie.

Biblioteka projektu zależy od Support Support v4 i AppCompat Library, więc nie używaj innej wersji dla appcompat i biblioteki projektów w gradate.

posługiwać się

 compile 'com.android.support:appcompat-v7:23.0.0'
 compile 'com.android.support:design:23.0.0'

zamiast

 compile 'com.android.support:appcompat-v7:23.0.0'
 compile 'com.android.support:design:23.1.0'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.