アレアレ

お役立ち情報、お悩み解決情報を発信!

visual studio for mac

Visual Studio for MacでAndroidアプリ開発時に戸惑うJavaとC#のイベント制御の違い

Visual Studio for MacでAndroidアプリ開発時に戸惑うJavaとC#のイベント制御の違い

今回は、Visual Studio for MacでAndroidアプリ開発を考えている人にお伝えしたいお役立ち情報です。

対象読者としては、これまでAndroid StudioでAndroidのアプリの開発経験があり、その一方でVisual Studioでの開発経験がない方をイメージしています。

「Visual Studio for Macって言うのが出たみたいから、いっちょ試してみるか」と、これから初めてVisual Studio for MacでのAndroidアプリ開発に挑戦しようとして入る人にお伝えしたい内容です。

ほぼ同じようにC#に移植されているが戸惑うポイントもある

Visual Studio for MacでのAndroidアプリ開発ですが、「Android Appプロジェクト」と言うテンプレートを使う場合は、Android Studioで培った経験が活かせます。

と言うのも、Android Appプロジェクトは、AndroidのJavaのAPIを、C#向けに移植したようなものとなっているからです。なので、JavaとC#の言語の違いによる細かな違いはあるものの、大枠では、Javaでの開発経験がそのまま活かせます。

ただ、ほぼ同じようにC#に移植されたVisual Studio for MacのAndroid AppプロジェクトのAPIも、C#に慣れていないと、そのちょっとした違いから戸惑うことがあるんですね。

JavaのListenerとC#のeventの違い

そのように戸惑うこととして、イベント制御の違いがあります。具体的には、「Viewがタップされた」などのコードを実装するときの、JavaのListenerとC#のeventの違いです。

例えば、ボタンがタップされたときのコードの実装方法ですが、JavaでListenerを使う場合は、次のように書けますよね。

Javaの例

findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    }
});

それが、C#では、次のように書くことになります。

C#の例

FindViewById<Button>(Resource.Id.button1).Click += (object sender, EventArgs e) => { };
FindViewById<Button>(Resource.Id.button1).Click += (sender, e) => { };
FindViewById<Button>(Resource.Id.button1).Click += delegate { };

このC#の例では、3通りの書き方をご紹介していますが、そのどの書き方でも、ボタンがタップされたときの処理を記述できます。

このような感じで、Visual Studio for MacのAndroid Appプロジェクトでは、JavaでListenerを使ってのイベント処理が、C#の言語的特性を利用したイベント処理に置き換わっています。その点に注意が必要です。

同じイベント処理でもJavaとC#で実装の仕方が異なることがある

で、このようなイベント制御ですが、稀にJavaとC#で、同じイベント処理でもその実装の仕方が異なることがあります。

例えば、Androidアプリにおいて、ユーザー設定情報を管理するのに使う、Preference APIにおいて、Preference.OnPreferenceChangeListenerを利用する場合です。

OnPreferenceChangeListenerは、Preference APIを利用して作ったユーザー画面で、その設定値の入力に変更があった場合に、それを検知するために利用するものです。

例えば、数値のみを入力させたい設定値に、ユーザーが数値以外を入力してきた場合、「それを弾く」と言うことができます。

で、Javaの場合は、このListenerのonPreferenceChangeメソッドを利用することで、それが可能です。このメソッドの戻り値をtrueにすれば「OK」、falseにすれば「不正な値」としてキャンセルすることができるわけです。

一方、C#の場合は、次のようにPreferenceChangeに対するイベントハンドラとして実装します。

C#の例

var pre = FindPreference("editTextPreferenceKey") as EditTextPreference;
pre.PreferenceChange += (object sender, Preference.PreferenceChangeEventArgs e) => { };

この場合、Javaのように戻り値で不正な入力値かどうかを返すことができません。イベントハンドラの戻り値はvoidだからです。

では、どのように入力値の判定結果を設定するのかと言うと、次のようにします。

var pre = FindPreference("editTextPreferenceKey") as EditTextPreference;
pre.PreferenceChange += (object sender, Preference.PreferenceChangeEventArgs e) => 
{ 
    e.Handled = true;
};

このような実装方法は、C#でのイベント制御方法に慣れていないと、わからないんですね。

Visual Studio for MacでのAndroidアプリ開発には、今回、ご紹介してきたようなJavaとC#の微妙な違いによって戸惑うことが、意外とあります。そのため、Javaでの実装方法が、そのまま使えず悩むことになる場面も出てきますのでご注意ください。

Return Top