ActionBarCompat: java.lang.IllegalStateException: Anda perlu menggunakan Theme.AppCompat


102

Saya mendapatkan RuntimeException pada Android 2.3.5 tapi saya saya menggunakan Theme.AppCompat (res / values / themes.xml). Ini adalah teleponnya: 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>

Ini adalah file untuk values-v11.

 <!-- 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>

Inilah kesalahannya.

 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

Maaf teman-teman, saya juga memiliki android: theme = "@ style / Theme.Styled" yang didefinisikan di AndroidManifest.xml.


1
Apakah referensi nyata Anda Theme.Styled?
CommonsWare

3
apakah Anda memiliki folder nilai lain yang mereferensikan Theme.Styled tetapi tidak menggunakan tema AppCompat?
tyczj

@tyczj Saya telah menambahkan file res / values-v11 / themes.xml dan tidak mereferensikan Theme.Styled
AG1

@tyczj Anda dapat menggunakan komentar Anda sebagai jawaban karena ini bisa menjadi masalah umum (saya juga)
Valentino Dell'Aica

Jawaban:


96

Jika Anda memperluas ActionBarActivity di MainActivity, Anda juga harus mengubah tema induk di values-v11.
Jadi style.xml dalam values-v11 akan menjadi -

 <!-- 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>

EDIT: Saya akan merekomendasikan Anda berhenti menggunakan ActionBar dan mulai menggunakan tata letak AppBar yang disertakan dalam Pustaka Dukungan Desain Android


5
Luar biasa, saya melewatkan ini. Jangan lupakan semua folder -vXX lainnya juga, atau itu akan bekerja dengan baik di test env Anda, hanya untuk menggigit Anda setelah seseorang menggunakan salah satu versi tersebut.
falstro

1
Terima kasih! Baru saja mengubah ActionBarActivity menjadi Activity! :)
Inoy

66

Untuk menambahkan ActionBar Compat, aktivitas atau aplikasi Anda harus menggunakan tema @ style / Theme.AppCompat di AndroidManifest.xml seperti ini:

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

Ini akan menambah actionbar dalam aktivitas (atau semua aktivitas jika Anda menambahkan tema ini ke aplikasi)


Tetapi biasanya Anda perlu menyesuaikan bilah tindakan Anda. Untuk melakukan ini, Anda perlu membuat dua gaya dengan induk Theme.AppCompat, misalnya, "@ style / Theme.AppCompat.Light". Yang pertama adalah untuk api 11> = (versi android dengan build di android actionbar), yang kedua untuk api 7-10 (tidak ada build di actionbar).

Mari kita lihat gaya pertama. Ini akan ditempatkan di res / values-v11 / styles.xml . Ini akan terlihat seperti ini:

<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>

Dan Anda harus memiliki gaya yang sama untuk api 7-10. Ini akan ditempatkan di res / values ​​/ styles.xml , TETAPI karena level api itu belum tahu tentang item gaya actionbar android asli, kita harus menggunakan salah satunya, yang disediakan oleh support library. Item ActionBar Compat didefinisikan seperti android asli, tetapi tanpa bagian "android:" di depan:

<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>

Harap tandai bahwa, meskipun level api yang lebih tinggi dari 10 sudah memiliki bilah tindakan, Anda masih harus menggunakan gaya AppCompat. Jika tidak, Anda akan mengalami kesalahan ini saat peluncuran Acitvity di perangkat dengan Android 3.0 dan lebih tinggi:

java.lang.IllegalStateException: Anda perlu menggunakan tema Theme.AppCompat (atau turunan) dengan aktivitas ini.

Berikut ini tautan artikel asli ini http://android-developers.blogspot.com/2013/08/actionbarcompat-and-io-2013-app-source.html yang ditulis oleh Chris Banes.

PS Maaf untuk bahasa Inggris saya


berhasil! DIPERBARUI
tony gil

20

Periksa dan pastikan Anda tidak memiliki folder nilai lain yang mereferensikan theme.styled dan tidak menggunakan tema AppCompat

yaitu values-v11folder


Ini juga masalahku. Saya memiliki proyek perpustakaan dan harus mengimpor perpustakaan appcompat-v7 dan membuat semua tema memperluas tema AppCompat. Masalahnya, proyek utama saya memiliki opsi tools: replace = "android: icon, android: theme" yang ditambahkan ke <application> dan harus meninggalkan gaya dari proyek lain. Untuk beberapa alasan itu tidak berhasil.
speedynomads

16

Coba ini...

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

Anda Activitymemperluas ActionBarActivityyang membutuhkan AppCompat.themeuntuk diterapkan. Ubah dari ActionBarActivitymenjadi Activityatau FragmentActivity, ini akan menyelesaikan masalah.


4

Lakukan saja Build -> Clean Project. Saya pikir ini akan menyelesaikan masalah Anda.


3

Manifes saya tidak mengacu pada tema apa pun ... tidak harus AFAIK

Tentu saja. Tidak ada yang akan secara ajaib berlaku Theme.Styleduntuk suatu aktivitas. Anda perlu mendeklarasikan aktivitas Anda - atau seluruh aplikasi Anda - menggunakan Theme.Styled, misalnya,:

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

Saya salah, saya memiliki android: theme = "@ style / Theme.Styled" di AndroidManifest.xml saya (saya tidak melihatnya pertama kali).
AG1

3

Saya mengalami kesalahan ini ketika saya mencoba membuat DialogBox ketika beberapa tindakan diambil di dalam kelas CustomAdapter. Ini bukanlah sebuah Aktivitas, tetapi kelas Adaptor. Setelah 36 jam berusaha dan mencari solusi, saya menemukan ini.

Kirim Aktivitas sebagai parameter sambil memanggil CustomAdapter.

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

Tentukan variabel di Adaptor kustom.

Activity parentActivity;
Context context;

Panggil konstruktor seperti ini.

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

Dan terakhir saat membuat kotak dialog di dalam kelas adaptor, lakukan seperti ini.

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

and so on..

Saya harap ini membantu Anda


2

Saya baru saja memindahkan aplikasi saya dari ActionBarSherlock ke ActionBarCompat. Coba nyatakan tema lama Anda seperti ini:

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

Kemudian setel tema di AndroidManifest.xml Anda:

<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

Saya mengalami crash seperti itu di Samsung perangkat meskipun aktivitasnya menggunakan Theme.AppCompat . Akar penyebabnya terkait dengan pengoptimalan aneh di sisi Samsung:

- 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

Solusi saya baru saja menghapus android:launchMode="singleTask"


1
Apakah Anda punya sumber untuk ini? Saya telah melacak bug serupa di aplikasi saya untuk sementara waktu, dan ini terdengar seperti petunjuk yang menjanjikan.
Dmitry Brant

Sama disini! Ingin tahu lebih banyak tentang ini! Saya juga telah melacak bug serupa di aplikasi saya. Sayangnya, saya tidak menggunakan android:launchMode="singleTask".
acrespo

Saya mengamati masalah yang sama. Ini terjadi untuk Galaxy Tab A 10.1 (Android 7.0, tidak di-root dan SM-A320FL (Android 7.0, tidak di-root). Saya tidak menggunakan android:launchMode="singleTask"dan semua aktivitas saya menggunakan tema AppCompat: /
user2990759

2

dalam kasus saya, saya membuat tampilan kustom yang saya tambahkan ke konstruktor tampilan kustom

new RoomView(getAplicationContext());

konteks yang benar adalah aktivitas, jadi ubahlah menjadi:

new RoomView(getActivity());

atau

new RoomView(this);

1

Untuk tampilan daftar saya, saya menggunakan Adaptor khusus yang memperluas ArrayAdapter. di listiview saya punya 2 tombol salah satu tombol sebagai Custom AlertDialogBox. Contoh: Activity parentActivity; Pembuat untuk Adaptor `

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

`memanggil Adaptor dari MainActivty

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

sekarang tulis alertdialog ur di dalam tombol ur yang ada di kelas Adapter

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 resolver o meu problema, eu apenas adicionei na minha MainActivity ("Theme = Untuk memecahkan masalah saya, saya baru saja menambahkannya ke MainActivity (" Theme = "@ style / MyTheme" ") di mana MyTheme adalah nama tema saya

[Activity(Label = "Name Label", MainLauncher = true, Icon = "@drawable/icon", LaunchMode = LaunchMode.SingleTop, Theme = "@style/MyTheme")]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.