rksoftware

Visual Studio とか C# とかが好きです

Activity クラスがベースクラスの Android アプリを AppCompatActivity に変更する

先日 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 フォルダの中身を削除して クリーン > リビルド を試してみてください。結構解消します。