web-dev-qa-db-ja.com

ActionBarCompat:Java.lang.IllegalStateException:Theme.AppCompatを使用する必要があります

私はAndroid 2.3.5でRuntimeExceptionを取得していますが、私はam 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>

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

申し訳ありませんが、AndroidManifest.xmlにAndroid:theme = "@ style/Theme.Styled"も定義されています。

102
AG1

MainActivityでActionBarActivityを拡張している場合は、values-v11でも親テーマを変更する必要があります。
values-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 Design Support Libraryに含まれているAppBarレイアウトを使い始めることを勧めます

96
Nishad

単にActionBar Compatを追加するには、あなたのアクティビティやアプリケーションは、次のようにAndroidManifest.xmlの@ style/Theme.AppCompatテーマを使用するべきです。

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

これにより、アクションバー(またはこのテーマをアプリケーションに追加した場合はすべてのアクティビティ)にアクションバーが追加されます。


しかし、通常はアクションバーをカスタマイズする必要があります。これを行うには、 "@ style/Theme.AppCompat.Light"のように、Theme.AppCompatを親として2つのスタイルを作成する必要があります。 1つ目はapi 11> =(AndroidアクションバーにビルドがあるAndroidのバージョン)、2つ目はapi 7-10(アクションバーにビルドがない)です。

最初のスタイルを見てみましょう。これはres/values-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>

10より高いAPIレベルが既にアクションバーを持っている場合でも、AppCompatスタイルを使用する必要があることに注意してください。そうでない場合は、Android 3.0以降を搭載したデバイスでAcitvityを起動するとこのエラーが発生します。

Java.lang.IllegalStateException:このアクティビティでは、Theme.AppCompatテーマ(またはその子孫)を使用する必要があります。

これはこの元の記事へのリンクです http://Android-developers.blogspot.com/2013/08/actionbarcompat-and-io-2013-app-source.html Chris Banesによって書かれました。

P.S私の英語でごめんね

66
molokoka

Theme.styledを参照し、AppCompatテーマを使用しない別のvaluesフォルダがないことを確認してください。

すなわちvalues-v11フォルダ

20
tyczj

これを試して...

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

あなたのActivityActionBarActivityを拡張しているため、AppCompat.themeを適用する必要があります。 ActionBarActivityからActivityまたはFragmentActivityに変更すると、問題が解決します。

11
Elenasys

ビルド - >クリーンプロジェクトを実行するだけです。これであなたの問題は解決すると思います。

4
Valeriy Bilyk

CustomAdapterクラス内で何らかのアクションが実行されたときにDialogBoxを作成しようとしたときにこのエラーが発生しました。 これはアクティビティではなくアダプタクラスでした。 36時間の努力と解決策の検討の後、私はこれを思いつきました。

CustomAdapterを呼び出しながら、Activityをパラメータとして送信します。

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

私はこれがあなたを助けることを願っています

3
Harshit Koolwal

私のマニフェストはテーマを参照していません...それは私の知る限りではないはずです

もちろんです。 Theme.Styledをアクティビティに魔法のように適用するものは何もありません。以下のように、あなたの活動、あるいはあなたのアプリケーション全体がTheme.Styledを使っていることを宣言する必要があります。

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

私の場合、私はカスタムビューにカスタムビューを追加しましたコンストラクタ

new RoomView(getAplicationContext());

正しいコンテキストはアクティビティなので、以下のように変更しました

new RoomView(getActivity());

または

new RoomView(this);
2
amorenew

アクティビティがTheme.AppCompatを使用したにもかかわらず、Samsungデバイスでこのようなクラッシュが発生しました。根本的な原因は、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"を削除することでした

2
goRGon

私は自分のアプリケーションを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
Tsung Goh

私のリストビューには、ArrayAdapterを拡張するカスタムアダプタを使用しています。 listiviewで私はカスタムAlertDialogBoxとしてボタンのうちの2つのボタンを持っています。例:アクティビティのparentActivity。アダプタのコンストラクタ

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

`MainActivtyからAdapterを呼び出す

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

adapterクラスにあるurボタンの中にur alertdialogを書くようになりました

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();

            }
        });
1
Ramesh kumar