新しくリリースされたv22.1.0 AppCompatを使用するようにアプリをアップグレードしたところ、アプリを開くと次の例外が発生します。
Caused by: Java.lang.IllegalArgumentException: AppCompat does not support the current theme features
at Android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.Java:360)
at Android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.Java:246)
at Android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.Java:106)
どうやって直すの?
AppCompatは、テーマウィンドウのフラグで期待されるものに対してより厳密になり、フレームワークから得られるものとより厳密に一致するようになりました。
この背景にある主な理由は、このリリースで追加した AppCompatDialogs をサポートすることです。彼らは以前AppCompatがあまり注意を払っていなかったwindowNoTitle
フラグを多用しています。
だからあなたの問題を解決するには2つの選択肢があります:
簡単な方法はTheme.AppCompat.NoActionBar
を親テーマとして使うことです。これは常に正しいことをします。
それができない場合(おそらく、アクションバーをサポートし、アクションバーをサポートしない必要があるかもしれません)、以下を実行する必要があります。
<style name="MyTheme" parent="Theme.AppCompat">
...
</style>
<style name="MyTheme.NoActionBar">
<!-- Both of these are needed -->
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
今軌道に戻っているはずです。
これらすべての修正の後にまだエラーを受けている人たち。
継承してください
Theme.AppCompat.Light.NoActionBar
そして使わないで
<item name="windowActionBar">false</item>
そうすれば、エラーにはなりません。
追加した
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
しかしそれは十分ではなかった。最後に、アクティビティのsetContentViewの前にsuper.onCreateを移動する - 私の問題を修正しました:)
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.v2_main_dash);
...
Values-v21フォルダーのstyle.xml
でこれを使用するだけで、他の編集は不要です。
<style name="AppTheme" parent="Theme.AppCompat">
<!-- theme customizations -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
アクティビティファイルに何も追加しないでください。
public class Main extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}