先日 Xamarin.Android で、プロジェクトテンプレートによって Activity のベースクラスが違う話を書きました。
今回は Activity クラスがベースクラスとなるテンプレートで作ったプロジェクトの MainActivity クラスのベースクラスを AppCompatActivity に変更してみます。
■ NuGet パッケージのインストール
Activity クラスと AppCompatActivity クラスは定義されているアセンブリが異なります。
クラス | 名前空間付 | アセンブリ |
---|---|---|
Activity | Android.App.Activity | Mono.Android |
AppCompatActivity | Android.Support.V7.App.AppCompatActivity | Xamarin.Android.Support.v7.AppCompat |
Xamarin.Android.Support.v7.AppCompat アセンブリを NuGet から取得します。
■ Activity のベースクラスを変更
Activity のベースクラスを変更します。
変更前
[Activity(Label = "Activity", MainLauncher = true, Icon = "@mipmap/icon")] public class MainActivity : Activity
変更後
[Activity(Label = "Activity", MainLauncher = true, Icon = "@mipmap/icon")] public class MainActivity : Android.Support.V7.App.AppCompatActivity
この状態で実行すると 例外が発生 します。
Java.Lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. が発生しました
Activity にテーマを設定していきます。
■ Activity にテーマを設定
Resources
フォルダの中の values
フォルダに styles.xml
というファイルを作ります。
<resources> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> </style> </resources>
style の中に子要素は特に作らなくても大丈夫でした。
Activity で設定する
このテーマを適用するように Activity の属性を変更します。
変更前
[Activity(Label = "Activity", MainLauncher = true, Icon = "@mipmap/icon")] public class MainActivity : Android.Support.V7.App.AppCompatActivity
変更後
[Activity(Label = "Activity", MainLauncher = true, Icon = "@mipmap/icon", Theme = "@style/AppTheme")] public class MainActivity : Android.Support.V7.App.AppCompatActivity
, Theme = "@style/AppTheme"
を追加しています。
これで出来上がりです。
■ エラーになる場合
正しく手順通りに作業しても、なぜかエラーや例外になってしまう場合があります。そんな時は、あわてず クリーン > リビルド
を試してみてください。それでもダメなときは エクスプローラで obj フォルダと bin フォルダの中身を削除して クリーン > リビルド
を試してみてください。結構解消します。