ActionBarCompat: java.lang.IllegalStateException: आपको एक Theme.AppCompat का उपयोग करने की आवश्यकता है


102

मुझे एंड्रॉइड 2.3.5 पर एक RuntimeException मिल रही है लेकिन मैं Theme.AppCompat (Res / values ​​/ 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>

यहां मानों-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

क्षमा करें दोस्तों, मेरे पास AndroidManifest.xml में परिभाषित किया गया android: theme = "@ style / Theme.Styled" भी है।


1
क्या आपका प्रकट संदर्भ Theme.Styled?
कॉमन्सवेयर

3
क्या आपके पास एक और मान फ़ोल्डर है जो Theme.Styled को संदर्भित करता है लेकिन AppCompat विषय का उपयोग नहीं करता है?
ticzj

@tyczj मैंने Res / मान-v11 / themes.xml फ़ाइल जोड़ी है और यह संदर्भ नहीं देता है। थीम
AG1

@tyczj आप एक टिप्पणी के रूप में अपनी टिप्पणी का उपयोग कर सकते हैं क्योंकि यह एक सामान्य मुद्दा हो सकता है (मुझे भी)
वैलेंटिनो डेल'अिका

जवाबों:


96

यदि आप अपने MainActivity में ActionBarActivity का विस्तार कर रहे हैं, तो आपको मूल विषय को मूल्यों-v11 में भी बदलना होगा।
तो मानों- v11 में 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>

संपादित करें: मैं आपको ActionBar का उपयोग बंद करने और Android डिज़ाइन समर्थन लाइब्रेरी में शामिल AppBar लेआउट का उपयोग शुरू करने की सलाह दूंगा


5
बहुत बढ़िया, मुझे यह याद आया। के रूप में अच्छी तरह से सभी अन्य -vXX फ़ोल्डर भूल नहीं है, या यह आपके परीक्षण env में ठीक काम करेगा, केवल एक बार जब कोई उन संस्करणों में से एक का उपयोग करता है तो आपको काटने के लिए।
फाल्स्ट्रो

1
धन्यवाद! बस ActionBarActivity को गतिविधि में बदल दिया! :)
Inoy

66

बस एक्शनबार जोड़ने के लिए अपनी गतिविधि या एप्लिकेशन को संगत करें @ Android / मेनिफेस्ट में @ style / Theme.AppCompat विषय का उपयोग करना चाहिए।

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

यह सक्रियता में एक्शनबार जोड़ देगा (या यदि आपने इस विषय को एप्लिकेशन में जोड़ा है तो सभी गतिविधियाँ)


लेकिन आमतौर पर आपको एक्शनबार को कस्टमाइज़ करने की आवश्यकता होती है। ऐसा करने के लिए आपको Theme.AppCompat जनक के साथ दो शैलियाँ बनाने की आवश्यकता है, उदाहरण के लिए, "@ style / Theme.AppCompat.Light"। पहला एक एपीआई 11> = (एंड्रॉइड एक्शनबार में बिल्ड के साथ एंड्रॉइड के वर्जन) के लिए होगा, दूसरा एपी 7-10 (एक्शनबार में कोई बिल्ड नहीं) के लिए होगा।

आइए पहले शैली को देखें। यह रेस / वैल्यू-वी 11 / स्टाइल.एक्सएमएल में स्थित होगा । यह इस तरह दिखेगा:

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

और आपको एपीआई 7-10 के लिए एक ही शैली की आवश्यकता है। यह Res / मान / स्टाइल.xml , BUT में स्थित होगा क्योंकि एपीआई के स्तर अभी तक मूल एंड्रॉइड एक्शनबार शैली आइटम के बारे में नहीं जानते हैं, हमें एक का उपयोग करना चाहिए, जो समर्थन पुस्तकालय द्वारा प्रदान किया गया है। ActionBar कम्पोज़िट आइटम्स को मूल एंड्रॉइड की तरह ही परिभाषित किया गया है, लेकिन बिना "एंड्रॉइड:" भाग के सामने:

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

कृपया चिह्नित करें, भले ही आपी का स्तर 10 से अधिक हो, पहले से ही एक्शनबार है, फिर भी आपको AppCompat शैलियों का उपयोग करना चाहिए। यदि आप नहीं करते हैं, तो आपको Android 3.0 और उससे अधिक वाले उपकरणों पर Acitvity के लॉन्च पर यह त्रुटि होगी:

java.lang.IllegalStateException: आपको इस गतिविधि के साथ एक Theme.AppCompat विषय (या वंशज) का उपयोग करने की आवश्यकता है।

यहाँ इस मूल लेख को लिंक किया गया है http://android-developers.blogspot.com/2013/08/actionbarcompat-and-io-2013-app-source.html क्रिस बेंस द्वारा लिखित।

PS मेरी अंग्रेजी के लिए क्षमा करें


बिल्कुल सही किया! UPVPTED
टोनी गिल

20

जाँच करें और सुनिश्चित करें कि आपके पास एक और मान फ़ोल्डर नहीं है जो theme.styled को संदर्भित करता है और AppCompat थीम का उपयोग नहीं करता है

यानी values-v11फ़ोल्डर


मेरी भी यही समस्या थी। मेरे पास एक लाइब्रेरी प्रोजेक्ट था और उसे appcompat-v7 लाइब्रेरी को इम्पोर्ट करना था और सभी विषयों को AppCompat थीम का विस्तार करना था। बात यह है, मेरी मुख्य परियोजना में उपकरण हैं: प्रतिस्थापन = "एंड्रॉइड: आइकन, एंड्रॉइड: थीम" विकल्प <एप्लिकेशन> में जोड़ा गया है और अन्य परियोजनाओं से शैलियों को छोड़ देना चाहिए। किसी कारण से जो काम नहीं कर रहा था।
स्पीडिनोमैड्स

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

मेरा प्रकटन किसी भी विषय को संदर्भित नहीं करता है ... यह AFAIK को नहीं होना चाहिए

ज़रूर करता है। जादुई रूप Theme.Styledसे किसी गतिविधि पर लागू होने के लिए कुछ भी नहीं किया जा रहा है । आपको अपनी गतिविधियों को घोषित करने की आवश्यकता है - या आपका पूरा आवेदन - उपयोग कर रहा है Theme.Styled, जैसे:

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

मैं गलत था, मेरे AndroidManifest.xml में एंड्रॉइड: थीम = "@ स्टाइल / थीम। स्टाइल" है (मैंने इसे पहली बार नहीं देखा था)।
एजी

3

मुझे इस त्रुटि का सामना तब करना पड़ा जब मैं कस्टम एडॉप्टर वर्ग के अंदर कुछ कार्रवाई करने पर डायलॉगबॉक्स बनाने की कोशिश कर रहा था। यह एक गतिविधि नहीं बल्कि एक एडॉप्टर क्लास थी। 36 घंटे के प्रयासों और समाधान की तलाश के बाद, मैं इसे लेकर आया।

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 का उपयोग किया था । मूल कारण सैमसंग की तरफ अजीब अनुकूलन से संबंधित था:

- 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
क्या इसके लिए आपके पास स्रोत है? मैं थोड़ी देर के लिए अपने ऐप में एक समान बग को ट्रैक कर रहा हूं, और यह एक आशाजनक लीड की तरह लगता है।
दिमित्री ब्रेंट

मुझे भी! इस बारे में और अधिक पसंद करेंगे! मैं अपने ऐप में भी इसी तरह के बग को ट्रैक कर रहा हूं। दुर्भाग्य से, मैं उपयोग नहीं करता हूं android:launchMode="singleTask"
acrespo

मैं उसी मुद्दे का निरीक्षण करता हूं। यह गैलेक्सी टैब ए 10.1 (Android 7.0, रूट नहीं हुआ और SM-A320FL (Android 7.0, रूट नहीं) के लिए हो रहा है। मैं उपयोग नहीं करता हूं android:launchMode="singleTask"और मेरी सभी गतिविधियां
AppCompat

2

मेरे मामले में मैंने एक कस्टम व्यू बनाया जिसे मैंने कस्टम व्यू कंस्ट्रक्टर में जोड़ा

new RoomView(getAplicationContext());

सही संदर्भ गतिविधि है इसलिए इसे बदल दिया गया है:

new RoomView(getActivity());

या

new RoomView(this);

1

मेरी सूची देखने के लिए कस्टम एडाप्टर का उपयोग कर रहा हूं जो ArrayAdapter का विस्तार करता है। listiview में 2 बटन में से एक बटन को कस्टम AlertDialogBox के रूप में है। Ex: गतिविधि 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);

अब url बटन के अंदर ur alertdialog लिखें जो कि 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 ("थीम = मेरी समस्या को हल करने के लिए, मैंने अभी इसे अपने MainActivity में जोड़ा (" थीम = "@ शैली / MyTheme") जहां MyTheme मेरी थीम का नाम है

[Activity(Label = "Name Label", MainLauncher = true, Icon = "@drawable/icon", LaunchMode = LaunchMode.SingleTop, Theme = "@style/MyTheme")]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.