ActionBarCompat: java.lang.IllegalStateException: Bir Theme.AppCompat kullanmanız gerekir


102

Ben Android 2.3.5 üzerinde RuntimeException alıyorum ama am Theme.AppCompat (res / değerleri / themes.xml) kullanılarak. Bu telefon: http://www.gsmarena.com/samsung_galaxy_y_s5360-4117.php

 <!-- res/values/themes.xml -->
 <?xml version="1.0" encoding="utf-8"?>
 <resources>

     <style name="Theme.Styled" parent="@style/Theme.AppCompat">
         <item name="actionBarStyle">@style/QueryActionBar</item>
         <item name="android:actionBarStyle">@style/QueryActionBar</item>
     </style>

     <style name="QueryActionBar" parent="@style/Widget.AppCompat.ActionBar">
         <item name="background">@color/blueback</item>
         <item name="android:background">@color/blueback</item>
         <item name="backgroundSplit">@color/blueback</item>
         <item name="android:backgroundSplit">@color/blueback</item>
     </style>

 </resources>

İşte değerler-v11 dosyası.

 <!-- res/values-v11/themes.xml -->
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
    <style name="QueryTheme" parent="@android:style/Theme.Holo">
    <!-- Any customizations for your app running on devices with Theme.Holo here -->
    </style>
 </resources>

İşte hata.

 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.txt2lrn.www/com.txt2lrn.www.LandingActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
 at android.app.ActivityThread.access$1500(ActivityThread.java:117)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
 at android.os.Handler.dispatchMessage(Handler.java:99)
 at android.os.Looper.loop(Looper.java:130)
 at android.app.ActivityThread.main(ActivityThread.java:3687)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:507)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
 at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
 at android.support.v7.app.ActionBarActivityDelegate.onCreate(ActionBarActivityDelegate.java:102)
 at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:98)
 at com.txt2lrn.www.LandingActivity.onCreate(LandingActivity.java:95)
 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
 ... 11 more

Üzgünüm millet, ayrıca AndroidManifest.xml'de tanımlanmış android: theme = "@ style / Theme.Styled" var.


1
Bildiriniz referans veriyor Theme.Styledmu?
CommonsWare

3
Theme.Styled'e başvuran ancak AppCompat temasını kullanmayan başka bir değerler klasörünüz var mı?
tyczj

@tyczj res / values-v11 / themes.xml dosyasını ekledim ve Theme.Styled
AG1

@tyczj Yaygın bir sorun olabileceğinden (ben de) yorumunuzu yanıt olarak kullanabilirsiniz
Valentino Dell'Aica

Yanıtlar:


96

MainActivity'de ActionBarActivity'yi genişletiyorsanız, values-v11'deki ana temayı da değiştirmeniz gerekecektir.
Yani, değerler-v11'deki style.xml -

 <!-- res/values-v11/themes.xml -->
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
    <style name="QueryTheme" parent="@style/Theme.AppCompat">
    <!-- Any customizations for your app running on devices with Theme.Holo here -->
    </style>
 </resources>

DÜZENLEME: ActionBar'ı kullanmayı bırakmanızı ve Android Tasarım Destek Kitaplığı'nda bulunan AppBar düzenini kullanmaya başlamanızı öneririm


5
Mükemmel, bunu kaçırdım. Diğer tüm -vXX klasörlerini de unutmayın, yoksa test ortamınızda iyi çalışır, yalnızca biri bu sürümlerden birini kullandığında sizi ısırmak için.
falstro

1
Teşekkürler! ActionBarActivity, Activity olarak değiştirildi! :)
Inoy

66

ActionBar Uyumluluğunu basitçe eklemek için etkinliğiniz veya uygulamanız AndroidManifest.xml'deki @ style / Theme.AppCompat temasını şu şekilde kullanmalıdır:

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

Bu, etkinliğe eylem çubuğu ekleyecektir (veya bu temayı uygulamaya eklediyseniz tüm etkinlikleri)


Ancak genellikle eylem çubuğunuzu özelleştirmeniz gerekir. Bunu yapmak için, Theme.AppCompat parent ile iki stil oluşturmanız gerekir, örneğin, "@ style / Theme.AppCompat.Light". Birincisi api 11> = (android eylem çubuğunda derlenmiş android sürümleri), ikincisi api 7-10 (eylem çubuğunda derleme yok) için olacaktır.

Birinci stile bakalım. Bu yer alacaktır res / values-v11 / styles.xml . Bunun gibi görünecek:

<style name="Theme.Styled" parent="@style/Theme.AppCompat.Light">
    <!-- Setting values in the android namespace affects API levels 11+ -->
    <item name="android:actionBarStyle">@style/Widget.Styled.ActionBar</item>
</style>

<style name="Widget.Styled.ActionBar" parent="@style/Widget.AppCompat.Light.ActionBar">
    <!-- Setting values in the android namespace affects API levels 11+ -->
    <item name="android:background">@drawable/ab_custom_solid_styled</item>
    <item name="android:backgroundStacked"
      >@drawable/ab_custom_stacked_solid_styled</item>
    <item name="android:backgroundSplit"
      >@drawable/ab_custom_bottom_solid_styled</item>
</style>

Ve api 7-10 için aynı stile sahip olmanız gerekir. Bu yer alacaktır res / değerler / styles.xml ANCAK bu API seviyeleri henüz orijinal android İşlem Çubuğu tarzı öğeleri hakkında bilmiyorum çünkü biz destek kitaplığı tarafından sağlanan birini kullanmalıdır. ActionBar Uyumluluk öğeleri, tıpkı orijinal android gibi tanımlanır, ancak ön kısımda "android:" bölümü yoktur:

<style name="Theme.Styled" parent="@style/Theme.AppCompat.Light">
    <!-- Setting values in the default namespace affects API levels 7-11 -->
    <item name="actionBarStyle">@style/Widget.Styled.ActionBar</item>
</style>

<style name="Widget.Styled.ActionBar" parent="@style/Widget.AppCompat.Light.ActionBar">
    <!-- Setting values in the default namespace affects API levels 7-11 -->
    <item name="background">@drawable/ab_custom_solid_styled</item>
    <item name="backgroundStacked">@drawable/ab_custom_stacked_solid_styled</item>
    <item name="backgroundSplit">@drawable/ab_custom_bottom_solid_styled</item>
</style>

Lütfen işaretleyin, 10'dan yüksek api seviyeleri zaten eylem çubuğuna sahip olsa bile, yine de AppCompat stillerini kullanmanız gerekir. Bunu yapmazsanız, Android 3.0 ve sonraki sürümlere sahip cihazlarda Acitvity başlatıldığında şu hatayı alırsınız:

java.lang.IllegalStateException: Bu etkinlikle bir Theme.AppCompat teması (veya soyundan gelen) kullanmanız gerekir.

İşte Chris Banes tarafından yazılan bu orijinal makalenin bağlantısı http://android-developers.blogspot.com/2013/08/actionbarcompat-and-io-2013-app-source.html .

PS İngilizcem için özür dilerim


başarmak! UPVPTED
tony gil

20

Theme.styled'e başvuran ve AppCompat temasını kullanmayan başka bir değerler klasörünüzün olmadığından emin olun ve emin olun.

ie values-v11klasörü


Bu benim de sorunumdu. Bir kitaplık projem vardı ve appcompat-v7 kitaplığını içe aktarmak ve tüm temaları AppCompat temalarını genişletmek zorunda kaldım. Mesele şu ki, ana projem <application> 'a eklenen araçlar: replace = "android: icon, android: theme" seçeneği ve diğer projelerin stillerini dışarıda bırakmalı. Nedense işe yaramadı.
speedynomads

16

Bunu dene...

styles.xml

<resources>
 <style name="Theme.AppCompat.Light.NoActionBar" parent="@style/Theme.AppCompat.Light">
    <item name="android:windowNoTitle">true</item>
 </style>
</resources>

AndroidManifest.xml

   <activity
        android:name="com.example.Home"
        android:label="@string/app_name" 
        android:theme="@style/Theme.AppCompat.Light.NoActionBar"
        >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

11

Uygulanmasını gerektiren sizin Activitygenişletiliyor . Dan değiştirin etmek veya bu sorunu çözecek.ActionBarActivityAppCompat.themeActionBarActivityActivityFragmentActivity



3

Bildirim herhangi bir temaya referans vermiyor ... AFAIK olması gerekmemeli

Elbette öyle. Theme.StyledBir aktiviteye hiçbir şey sihirli bir şekilde uygulanamaz . Faaliyetlerinizi veya tüm uygulamanızın kullandığını beyan etmeniz gerekir Theme.Styled, örneğin:

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.Styled">

Hatalıydım, AndroidManifest.xml dosyamda android: theme = "@ style / Theme.Styled" var (ilk seferde görmedim).
AG1

3

CustomAdapter sınıfı içinde bazı eylemler gerçekleştirildiğinde bir DialogBox oluşturmaya çalışırken bu hatayla karşılaştım. Bu bir Etkinlik değil, Adaptör sınıfıydı. 36 saatlik çabadan ve çözüm arayışlarından sonra bunu buldum.

CustomAdapter çağrılırken Aktiviteyi bir parametre olarak gönderin.

CustomAdapter ca = new CustomAdapter(MyActivity.this,getApplicationContext(),records);

Özel Bağdaştırıcıdaki değişkenleri tanımlayın.

Activity parentActivity;
Context context;

Yapıcıyı böyle arayın.

public CustomAdapter(Activity parentActivity,Context context,List<Record> records){
    this.parentActivity=parentActivity;
    this.context=context;
    this.records=records;
}

Ve son olarak, adaptör sınıfının içinde iletişim kutusunu oluştururken, bunu şöyle yapın.

AlertDialog ad = new AlertDialog.Builder(parentActivity).setTitle("Your title");

and so on..

umarım bu sana yardımcı olur


2

Uygulamamın ActionBarSherlock'tan ActionBarCompat'a taşınmasını sağlıyorum. Eski temanızı şu şekilde ilan etmeyi deneyin:

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

Ardından temayı AndroidManifest.xml dosyanızda ayarlayın:

<application
    android:debuggable="true"
    android:name=".activity.MyApplication"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.Event.Home"
     >

2

Etkinlik Theme.AppCompat'ı kullanmasına rağmen Samsung cihazlarında böyle bir çökme yaşadım . Temel neden, Samsung tarafındaki garip optimizasyonlarla ilgiliydi:

- 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

Benim çözümüm sadece kaldırıyordu android:launchMode="singleTask"


1
Bunun için kaynağın mevcut mu? Bir süredir uygulamamdaki benzer bir hatayı izliyorum ve bu umut verici bir ipucu gibi görünüyor.
Dmitry Brant

Burada aynı! Bu konuda daha fazlasını isterim! Uygulamamda da benzer bir hatayı izliyorum. Maalesef kullanmıyorum android:launchMode="singleTask".
acrespo

Ben de aynı sorunu gözlemliyorum. Galaxy Tab A 10.1 (Android 7.0, köklü değil ve SM-A320FL (Android 7.0, köklü değil) için gerçekleşiyor. Kullanmıyorum android:launchMode="singleTask"ve tüm etkinliklerim
AppCompat

2

benim durumumda özel görünüm oluşturucuya ekledim özel bir görünüm yaptım

new RoomView(getAplicationContext());

doğru bağlam etkinliktir, dolayısıyla şu şekilde değiştirilmiştir:

new RoomView(getActivity());

veya

new RoomView(this);

1

Liste görünümüm için ArrayAdapter'ı genişleten özel Bağdaştırıcı kullanıyorum. Liste görünümünde 2 düğme var, düğmelerden biri Özel UyarıDialogBox. Ör: Activity parentActivity; Bağdaştırıcı için Oluşturucu ''

public CustomAdapter(ArrayList<Contact> data, Activity parentActivity,Context context) {
        super(context,R.layout.listdummy,data);
        this.mContext   =   context;
        this.parentActivity  =   parentActivity;
    }

`MainActivty'den Adapter'ı arıyor

adapter = new CustomAdapter(dataModels,MainActivity.this,this);

şimdi Adapter sınıfında bulunan ur butonunun içine alarm diyalogu yaz

viewHolder.update.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View view) {
            

                AlertDialog.Builder alertDialog =   new AlertDialog.Builder(parentActivity);
                alertDialog.setTitle("Updating");
                alertDialog.setCancelable(false);

                LayoutInflater layoutInflater   = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                 @SuppressLint("InflateParams") final View view1   =   layoutInflater.inflate(R.layout.dialog,null);
                alertDialog.setView(view1);
                alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.cancel();
                    }
                });
                alertDialog.setPositiveButton("Update", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {

                    //ur logic
                            }
                    }
                });
                  alertDialog.create().show();

            }
        });


-2

para çözümleyici o meu problema, eu apenas adicionei na minha MainActivity ("Tema = Sorunumu çözmek için onu MainActivity'de (" Theme = "@ style / MyTheme" ") ekledim burada MyTheme temamın adıdır

[Activity(Label = "Name Label", MainLauncher = true, Icon = "@drawable/icon", LaunchMode = LaunchMode.SingleTop, Theme = "@style/MyTheme")]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.