ActionBarCompat: java.lang.IllegalStateException: คุณต้องใช้ Theme.AppCompat


102

ฉันได้รับ RuntimeException บน Android 2.3.5 แต่ฉันกำลังใช้ Theme.AppCompat (ความละเอียด / ค่า / themes.xml) นี่คือโทรศัพท์: 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>

นี่คือไฟล์สำหรับ 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>

นี่คือข้อผิดพลาด

 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

ขออภัยฉันยังมี android: theme = "@ style / Theme.Styled" ที่กำหนดไว้ใน AndroidManifest.xml


1
รายการของคุณอ้างอิงTheme.Styledหรือไม่
CommonsWare

3
คุณมีโฟลเดอร์ค่าอื่นที่อ้างอิง Theme.Styled แต่ไม่ได้ใช้ธีม AppCompat หรือไม่?
tyczj

@tyczj ฉันได้เพิ่มไฟล์ res / values-v11 / themes.xml และไม่ได้อ้างอิง Theme.Styled
AG1

@tyczj คุณสามารถใช้ความคิดเห็นของคุณเป็นคำตอบได้เนื่องจากอาจเป็นปัญหาทั่วไป (ฉันก็เช่นกัน)
Valentino Dell'Aica

คำตอบ:


96

หากคุณกำลังขยาย ActionBarActivity ใน MainActivity ของคุณคุณจะต้องเปลี่ยนธีมหลักใน values-v11 ด้วย
ดังนั้น style.xml ใน values-v11 จะเป็น -

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

แก้ไข: ฉันขอแนะนำให้คุณหยุดใช้ ActionBar และเริ่มใช้เค้าโครง AppBar ที่รวมอยู่ในAndroid Design Support Library


5
ยอดเยี่ยมฉันพลาดสิ่งนี้ อย่าลืมโฟลเดอร์ -vXX อื่น ๆ ทั้งหมดด้วยไม่เช่นนั้นจะทำงานได้ดีในสภาพแวดล้อมการทดสอบของคุณจะกัดคุณเมื่อมีคนใช้เวอร์ชันใดเวอร์ชันหนึ่งเท่านั้น
falstro

1
ขอบคุณ! เพิ่งเปลี่ยน ActionBarActivity เป็น Activity! :)
อินอย

66

หากต้องการเพิ่ม ActionBar Compat กิจกรรมหรือแอปพลิเคชันของคุณควรใช้ธีม @ style / Theme.AppCompat ใน AndroidManifest.xml ดังนี้:

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

สิ่งนี้จะเพิ่มแถบการทำงานในการเปิดใช้งาน (หรือกิจกรรมทั้งหมดหากคุณเพิ่มธีมนี้ในแอปพลิเคชัน)


แต่โดยปกติคุณต้องปรับแต่งแถบการทำงานของคุณเอง ในการทำเช่นนี้คุณต้องสร้างสองสไตล์ด้วยแม่แบบ Theme.AppCompat เช่น "@ style / Theme.AppCompat.Light" อันแรกจะเป็นสำหรับ api 11> = (เวอร์ชันของ android ที่มี build ใน android actionbar) อันที่สองสำหรับ api 7-10 (ไม่มี build ใน actionbar)

มาดูสไตล์แรกกัน มันจะตั้งอยู่ในความละเอียด / ค่า-v11 / styles.xml จะมีลักษณะดังนี้:

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

และคุณต้องมีสไตล์เดียวกันสำหรับ api 7-10 มันจะอยู่ในres / values ​​/ styles.xmlแต่เนื่องจากระดับ api นั้นยังไม่ทราบเกี่ยวกับไอเท็มสไตล์แถบแอ็คชั่นดั้งเดิมของ Android เราควรใช้อย่างใดอย่างหนึ่งโดยไลบรารีสนับสนุน รายการ ActionBar Compat มีการกำหนดเช่นเดียวกับ Android ดั้งเดิม แต่ไม่มีส่วน "android:" ที่ด้านหน้า:

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

โปรดทำเครื่องหมายว่าแม้ว่าระดับ api ที่สูงกว่า 10 จะมีแถบการทำงานแล้วคุณก็ยังควรใช้สไตล์ AppCompat หากคุณไม่ทำคุณจะพบข้อผิดพลาดนี้เมื่อเปิดตัว Acitvity บนอุปกรณ์ที่ใช้ Android 3.0 ขึ้นไป:

java.lang.IllegalStateException: คุณต้องใช้ธีม Theme.AppCompat (หรือลูกหลาน) กับกิจกรรมนี้

นี่คือลิงค์บทความต้นฉบับนี้http://android-developers.blogspot.com/2013/08/actionbarcompat-and-io-2013-app-source.htmlเขียนโดย Chris Banes

ปล. ขอโทษสำหรับภาษาอังกฤษของฉัน


ตอกมัน! UPVPTED
tony gil

20

ตรวจสอบให้แน่ใจว่าคุณไม่มีโฟลเดอร์ค่าอื่นที่อ้างอิง theme.styled และไม่ได้ใช้ธีม AppCompat

เช่นvalues-v11โฟลเดอร์


นี่เป็นปัญหาของฉันเหมือนกัน ฉันมีโครงการไลบรารีและต้องนำเข้าไลบรารี appcompat-v7 และทำให้ธีมทั้งหมดขยายธีม AppCompat สิ่งนี้คือโปรเจ็กต์หลักของฉันมีเครื่องมือ: ตัวเลือกแทนที่ = "android: icon, android: theme" ใน <แอปพลิเคชัน> และควรละสไตล์จากโปรเจ็กต์อื่น ๆ ด้วยเหตุผลบางอย่างที่ไม่ได้ผล
speedynomads

16

ลองนี่ ...

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

ของคุณActivityกำลังขยายActionBarActivityซึ่งจำเป็นต้องAppCompat.themeใช้ เปลี่ยนจากActionBarActivityเป็นActivityหรือFragmentActivityมันจะแก้ปัญหาได้


4

เพียงแค่สร้าง -> โครงการสะอาด ฉันคิดว่านี่จะช่วยแก้ปัญหาของคุณได้


3

ไฟล์ Manifest ของฉันไม่ได้อ้างอิงธีมใด ๆ ... มันไม่ควรต้อง AFAIK

แน่นอนว่ามันไม่ ไม่มีสิ่งใดที่จะนำTheme.Styledไปใช้กับกิจกรรมได้อย่างน่าอัศจรรย์ คุณต้องประกาศว่ากิจกรรมของคุณหรือแอปพลิเคชันทั้งหมดของคุณกำลังใช้Theme.Styledงานอยู่เช่น:

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

ฉันไม่ถูกต้องฉันมี android: theme = "@ style / Theme.Styled" ใน AndroidManifest.xml ของฉัน (ฉันไม่เห็นมันในครั้งแรก)
AG1

3

ฉันพบข้อผิดพลาดนี้เมื่อพยายามสร้างกล่องโต้ตอบเมื่อมีการดำเนินการบางอย่างภายในคลาส CustomAdapter นี่ไม่ใช่กิจกรรม แต่เป็นคลาสอะแดปเตอร์ หลังจาก 36 ชั่วโมงของความพยายามและค้นหาวิธีแก้ปัญหาฉันก็ได้พบกับสิ่งนี้

ส่ง Activity เป็นพารามิเตอร์ขณะเรียก CustomAdapter

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

กำหนดตัวแปรในอะแดปเตอร์แบบกำหนดเอง

Activity parentActivity;
Context context;

เรียกตัวสร้างแบบนี้

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

และสุดท้ายเมื่อสร้างกล่องโต้ตอบภายในคลาสอะแดปเตอร์ให้ทำเช่นนี้

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

and so on..

ฉันหวังว่านี่จะช่วยคุณได้


2

ฉันเพิ่งย้ายแอปพลิเคชันจาก ActionBarSherlock เป็น ActionBarCompat ลองประกาศธีมเก่าของคุณดังนี้:

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

จากนั้นตั้งค่าธีมใน AndroidManifest.xml ของคุณ:

<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

ฉันมีความผิดพลาดดังกล่าวในซัมซุงอุปกรณ์แม้ว่ากิจกรรมได้ใช้Theme.AppCompat สาเหตุที่แท้จริงเกี่ยวข้องกับการเพิ่มประสิทธิภาพแปลก ๆ ในฝั่ง 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

วิธีแก้ปัญหาของฉันก็แค่เอาออก android:launchMode="singleTask"


1
คุณมีแหล่งที่มาสำหรับสิ่งนี้หรือไม่? ฉันติดตามข้อบกพร่องที่คล้ายกันในแอปของฉันมาระยะหนึ่งแล้วและดูเหมือนว่าจะเป็นโอกาสในการขายที่ดี
Dmitry Brant

ที่นี่! จะชอบมากขึ้นเกี่ยวกับเรื่องนี้! ฉันได้ติดตามข้อบกพร่องที่คล้ายกันในแอปของฉันด้วย android:launchMode="singleTask"แต่น่าเสียดายที่ฉันไม่ได้ใช้
เอเคอร์

ฉันสังเกตปัญหาเดียวกัน มันเกิดขึ้นกับ Galaxy Tab A 10.1 (Android 7.0 ไม่รูทและ SM-A320FL (Android 7.0 ไม่รูท) ฉันไม่ได้ใช้android:launchMode="singleTask"และกิจกรรมทั้งหมดของฉันใช้ธีม AppCompat: /
user2990759

2

ในกรณีของฉันฉันทำเองดูผมเพิ่มไปยังมุมมองที่กำหนดเองคอนสตรัค

new RoomView(getAplicationContext());

บริบทที่ถูกต้องคือกิจกรรมจึงเปลี่ยนเป็น:

new RoomView(getActivity());

หรือ

new RoomView(this);

1

สำหรับมุมมองรายการของฉันฉันใช้อะแดปเตอร์แบบกำหนดเองซึ่งขยาย ArrayAdapter ในรายการวิวฉันมี 2 ปุ่มหนึ่งในปุ่มเป็น Custom AlertDialogBox เช่นกิจกรรม parentActivity; ตัวสร้างสำหรับอะแดปเตอร์ "

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

`เรียกอะแดปเตอร์จาก MainActivty

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

ตอนนี้เขียน ur alertdialog ภายในปุ่ม ur ซึ่งอยู่ในคลาส 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 = เพื่อแก้ปัญหาของฉันฉันเพิ่งเพิ่มใน MainActivity (" Theme = "@ style / MyTheme" ") โดยที่ MyTheme เป็นชื่อธีมของฉัน

[Activity(Label = "Name Label", MainLauncher = true, Icon = "@drawable/icon", LaunchMode = LaunchMode.SingleTop, Theme = "@style/MyTheme")]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.