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łowemthis ”, 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.