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


102

私は、Android 2.3.5でのRuntimeExceptionを取得していますが、私は午前 Theme.AppCompat(RES /値/ 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"も定義しています。


1
あなたのマニフェストは参照していますTheme.Styledか?
CommonsWare 2013

3
Theme.Styledを参照するが、AppCompatテーマを使用しない別の値フォルダーがありますか?
tyczj 2013

@tyczj res / values-v11 / themes.xmlファイルを追加しましたが、Theme.Styledを参照していません
AG1

@tyczj一般的な問題になる可能性があるため、コメントを回答として使用できます(私も)
Valentino Dell'Aica

回答:


96

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レイアウトの使用を開始することをお勧めします


5
すばらしい、これを逃した。他のすべての-vXXフォルダーも忘れないでください。そうしないと、テスト環境で正常に機能します。誰かがこれらのバージョンのいずれかを使用したときにのみ、噛み付きます。
falstro 2014年

1
ありがとう!ActionBarActivityをActivityに変更しました!:)
2014年

66

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テーマ(または子孫)を使用する必要があります。

ここに、Chris Banesによって作成されたこの元の記事http://android-developers.blogspot.com/2013/08/actionbarcompat-and-io-2013-app-source.htmlへのリンクがあります。

PS私の英語でごめんね


ばっちり成功!UPVPTED
tony gil、

20

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

すなわちvalues-v11フォルダ


これも私の問題でした。ライブラリプロジェクトがあり、appcompat-v7ライブラリをインポートして、すべてのテーマでAppCompatテーマを拡張する必要がありました。実は、私のメインプロジェクトでは、<application>にtools:replace = "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がある拡張ActionBarActivityAppCompat.themeです。以下からの変化ActionBarActivityへのActivityかはFragmentActivity、それが問題を解決します。



3

私のマニフェストはテーマを参照していません...知る必要はありません

もちろんです。魔法のようにTheme.Styledアクティビティに適用されるものはありません。あなたはあなたの活動を宣言する必要があります-またはあなたのアプリケーション全体-は使用していますTheme.Styled、例えば:

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

私は間違っていました。AndroidManifest.xmlにandroid:theme = "@ style / Theme.Styled"が含まれています(初めて表示されませんでした)。
AG1 2013

3

CustomAdapterクラス内で何らかのアクションが実行されたときにDialogBoxを作成しようとしたときに、このエラーが発生しました。 これはアクティビティではなく、アダプタクラスでした。 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を使用したにもかかわらず、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
これのソースはありますか?私はしばらくの間、アプリ内の同様のバグを追跡してきましたが、これは有望な見込みのようです。
ドミトリーブラント

こっちも一緒!これについてもっと知りたいです!アプリでも同様のバグを追跡してきました。残念ながら、私はを使用していませんandroid:launchMode="singleTask"
acrespo 2016

私は同じ問題を観察します。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を拡張するカスタムアダプターを使用しています。listiviewには2つのボタンがあり、そのうちの1つはカスタム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ボタン内に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();

            }
        });


-2

para resolver o meu problema、eu apenas adicionei na minha MainActivity( "Theme = My problem to my solution、just I added it my myActivitytivity(" Theme = "@ style / MyTheme" ")MyTheme is my name of my theme

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