ActionBarCompat: java.lang.IllegalStateException: Bạn cần sử dụng Theme.AppCompat


102

Tôi đang nhận được RuntimeException trên Android 2.3.5 nhưng tôi đang sử dụng Theme.AppCompat (res / values ​​/ themes.xml). Đây là điện thoại: 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>

Đây là tệp cho các giá trị-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>

Đây là lỗi.

 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

Xin lỗi mọi người, tôi cũng có định nghĩa android: theme = "@ style / Theme.Styled" trong AndroidManifest.xml.


1
Bản kê khai của bạn có tham chiếu Theme.Styledkhông?
CommonsWare

3
bạn có một thư mục giá trị khác tham chiếu đến Theme.Styled nhưng không sử dụng chủ đề AppCompat không?
tyczj

@tyczj Tôi đã thêm tệp res / values-v11 / themes.xml và nó không tham chiếu đến Theme.Styled
AG1

@tyczj Bạn có thể sử dụng sử dụng nhận xét của bạn như một câu trả lời vì nó có thể là một vấn đề phổ biến (me too)
Valentino Dell'Aica

Câu trả lời:


96

Nếu bạn đang mở rộng ActionBarActivity trong MainActivity của mình, bạn cũng sẽ phải thay đổi chủ đề chính trong giá trị-v11.
Vì vậy, style.xml trong giá trị-v11 sẽ là:

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

CHỈNH SỬA: Tôi khuyên bạn nên ngừng sử dụng ActionBar và bắt đầu sử dụng bố cục AppBar có trong Thư viện hỗ trợ thiết kế Android


5
Tuyệt vời, tôi đã bỏ lỡ điều này. Đừng quên tất cả các thư mục -vXX khác, nếu không nó sẽ hoạt động tốt trong env thử nghiệm của bạn, chỉ để cắn bạn khi ai đó sử dụng một trong các phiên bản đó.
falstro

1
Cảm ơn! Vừa thay đổi ActionBarActivity thành Hoạt động! :)
Inoy

66

Để chỉ cần thêm ActionBar Compat, hoạt động hoặc ứng dụng của bạn nên sử dụng chủ đề @ style / Theme.AppCompat trong AndroidManifest.xml như sau:

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

Thao tác này sẽ thêm thanh hành động vào hoạt động (hoặc tất cả các hoạt động nếu bạn đã thêm chủ đề này vào ứng dụng)


Nhưng thông thường bạn cần phải tùy chỉnh thanh hành động của mình. Để thực hiện việc này, bạn cần tạo hai kiểu với cha mẹ Theme.AppCompat, ví dụ, "@ style / Theme.AppCompat.Light". Cái đầu tiên sẽ dành cho api 11> = (phiên bản Android có bản dựng trong thanh hành động android), cái thứ hai dành cho api 7-10 (không có bản dựng trong thanh hành động).

Hãy nhìn vào phong cách đầu tiên. Nó sẽ nằm trong res / values-v11 / styles.xml . Nó sẽ trông giống thế này:

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

Và bạn cần phải có cùng một phong cách cho api 7-10. Nó sẽ được đặt trong res / values ​​/ styles.xml , NHƯNG vì các cấp api chưa biết về các mục kiểu actionbar android ban đầu, chúng ta nên sử dụng một cái do thư viện hỗ trợ cung cấp. Các mục ActionBar Compat được xác định giống như android gốc nhưng không có phần "android:" ở phía trước:

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

Vui lòng đánh dấu rằng, ngay cả khi các cấp api cao hơn 10 đã có thanh tác vụ, bạn vẫn nên sử dụng các kiểu AppCompat. Nếu không, bạn sẽ gặp lỗi này khi khởi chạy Acitvity trên các thiết bị chạy Android 3.0 trở lên:

java.lang.IllegalStateException: Bạn cần sử dụng chủ đề Theme.AppCompat (hoặc hậu duệ) với hoạt động này.

Đây là liên kết bài viết gốc này http://android-developers.blogspot.com/2013/08/actionbarcompat-and-io-2013-app-source.html được viết bởi Chris Banes.

Tái bút xin lỗi vì tiếng anh của tôi


đóng đinh nó! ĐÃ CẬP NHẬT
tony gil

20

Kiểm tra và đảm bảo rằng bạn không có thư mục giá trị khác tham chiếu đến theme.styled và không sử dụng chủ đề AppCompat

tức là values-v11thư mục


Đây cũng là vấn đề của tôi. Tôi có một dự án thư viện và phải nhập thư viện appcompat-v7 và làm cho tất cả các chủ đề mở rộng các chủ đề AppCompat. Vấn đề là, dự án chính của tôi có tùy chọn công cụ: Replace = "android: icon, android: theme" được thêm vào <ứng dụng> và nên loại bỏ các kiểu từ các dự án khác. Vì một số lý do mà nó không hoạt động.
speedynomads

16

Thử cái này...

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

Của bạn Activityđang mở rộng ActionBarActivityyêu cầu AppCompat.themephải được áp dụng. Thay đổi từ ActionBarActivitytới Activityhay FragmentActivity, nó sẽ giải quyết vấn đề.


4

Chỉ cần thực hiện Xây dựng -> Dự án sạch. Tôi nghĩ rằng điều này sẽ giải quyết vấn đề của bạn.


3

Tệp kê khai của tôi không tham chiếu đến bất kỳ chủ đề nào ... nó không cần phải AFAIK

Chắc chắn rồi. Không có gì sẽ áp dụng một cách kỳ diệu Theme.Styledcho một hoạt động. Bạn cần khai báo các hoạt động của mình - hoặc toàn bộ ứng dụng - đang sử dụng Theme.Styled, ví dụ:

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

Tôi đã sai, tôi có android: theme = "@ style / Theme.Styled" trong AndroidManifest.xml của mình (tôi không thấy nó lần đầu tiên).
AG1

3

Tôi đã gặp lỗi này khi cố gắng tạo DialogBox khi một số hành động được thực hiện bên trong lớp CustomAdapter. Đây không phải là một Activity mà là một lớp Adapter. Sau 36 giờ nỗ lực và tìm kiếm giải pháp, tôi đã nghĩ ra điều này.

Gửi Activity dưới dạng tham số trong khi gọi CustomAdapter.

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

Xác định các biến trong Bộ điều hợp tùy chỉnh.

Activity parentActivity;
Context context;

Gọi hàm tạo như thế này.

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

Và cuối cùng khi tạo hộp thoại bên trong lớp bộ điều hợp, hãy làm như thế này.

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

and so on..

Tôi hy vọng cái này sẽ giúp bạn


2

Tôi vừa nhận được ứng dụng của mình chuyển từ ActionBarSherlock sang ActionBarCompat. Hãy thử khai báo chủ đề cũ của bạn như thế này:

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

Sau đó, đặt chủ đề trong AndroidManifest.xml của bạ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

Tôi đã gặp sự cố như vậy trên các thiết bị Samsung mặc dù hoạt động đã sử dụng Theme.AppCompat . Nguyên nhân gốc rễ liên quan đến các tối ưu hóa kỳ lạ của phía 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

Giải pháp của tôi chỉ là gỡ bỏ android:launchMode="singleTask"


1
Bạn có một nguồn cho điều này? Tôi đã theo dõi một lỗi tương tự trong ứng dụng của mình trong một thời gian và điều này có vẻ như một sự dẫn đầu đầy hứa hẹn.
Dmitry Brant

Ở đây cũng vậy! Rất thích biết thêm về điều này! Tôi cũng đang theo dõi một lỗi tương tự trong ứng dụng của mình. Thật không may, tôi không sử dụng android:launchMode="singleTask".
acrespo

Tôi quan sát vấn đề tương tự. Nó đang xảy ra đối với Galaxy Tab 10.1 Một (Android 7.0, không bắt rễ và SM-A320FL (Android 7.0, không bắt nguồn từ) Tôi không sử dụng. android:launchMode="singleTask"Và mọi hoạt động của tôi sử dụng theme AppCompat: /
user2990759

2

trong trường hợp của tôi, tôi làm một tùy chỉnh xem tôi thêm vào giao diện tùy chỉnh constructor

new RoomView(getAplicationContext());

ngữ cảnh đúng là hoạt động nên đã thay đổi nó thành:

new RoomView(getActivity());

hoặc là

new RoomView(this);

1

Đối với chế độ xem danh sách của tôi, tôi đang sử dụng Bộ điều hợp tùy chỉnh mở rộng ArrayAdapter. trong listiview, tôi có 2 nút, một trong những nút là Custom AlertDialogBox. Ví dụ: Activity parentActivity; Bộ tạo cho Bộ điều hợp `

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

`gọi Bộ điều hợp từ MainActivty

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

bây giờ hãy viết thêm alertdialog bên trong nút ur nằm trong lớp Bộ điều hợp

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 Resolutionver o meu problemma, eu apenas adicionei na minha MainActivity ("Theme = Để giải quyết vấn đề của tôi, tôi vừa thêm nó vào MainActivity (" Theme = "@ style / MyTheme" ") trong đó MyTheme là tên chủ đề của tôi

[Activity(Label = "Name Label", MainLauncher = true, Icon = "@drawable/icon", LaunchMode = LaunchMode.SingleTop, Theme = "@style/MyTheme")]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.