質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

3回答

2700閲覧

Xamarin.AndroidでIMEを実装したい。

Kyome

総合スコア6

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2017/09/26 15:17

編集2017/09/27 05:14

###前提・実現したいこと
Visual Studio 2017 for Mac と Xamarin.Androidを使ってカスタムキーボード(IME)を作成しようと思っています。
http://aics-app.sakura.ne.jp/blog/2015/03/02/ソフトウェアキーボードの作り方android/
こちらのサイトを参考にして、まずはAndroid Studioにてキーボードを作ってみてAndroidエミュレータにてIMEのリストに追加、実行が可能なことを確認しました。その後Visual StudioとXamarin.Android環境下でもそれを再現して実行をしてもAndroidエミュレータのIMEのリストに追加されず困っています。

ソースコードはgithubに上げてあります。
https://github.com/Kyome22/DroidCustomKeyboard

xml

1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 android:versionCode="1" android:versionName="1.0" 4 package="com.kyome.DroidCustomKeyboard" android:installLocation="auto"> 5 <uses-sdk android:minSdkVersion="23" /> 6 <application android:allowBackup="true" android:label="@string/app_name"> 7 <service android:name="TestKeyboard" android:label="@string/test_keyboard" android:permission="android.permission.BIND_INPUT_METHOD"> 8 <meta-data android:name="android.view.im" android:resource="@xml/method"></meta-data> 9 <intent-filter> 10 <action android:name="android.view.InputMethod"></action> 11 </intent-filter> 12 </service> 13 <!-- <activity android:name="com.kyome.DroidCustomKeyboard.Preferences" android.label="@string/settings_name"> 14 <intent-filter> 15 <action android:name="android.intent.action.MAIN"></action> 16 </intent-filter> 17 </activity> --> 18 </application> 19</manifest>

###やってみたこと
実行の設定をいじってエントリポイントをアクティビティではなくサービスにしてみたりしましたが反応は変わりませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

Android Studioでの開発方法とは違って、Manifestにサービスの設定をしてもサービスとして認識されないということがわかりました。

Manifestの変更前後とサービスの変更前後のコードを載せます。

Manifest変更前

xml

1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 android:versionCode="1" android:versionName="1.0" 4 package="com.kyome.DroidCustomKeyboard" > 5 <uses-sdk android:minSdkVersion="23" /> 6 7 <application 8 android:allowBackup="true" 9 android:label="@string/app_name" > 10 11 <service 12 android:name="TestKeyboard" 13 android:label="@string/test_keyboard" 14 android:permission="android.permission.BIND_INPUT_METHOD"> 15 <meta-data android:name="android.view.im" android:resource="@xml/method"></meta-data> 16 <intent-filter> 17 <action android:name="android.view.InputMethod"></action> 18 </intent-filter> 19 </service> 20 21 </application> 22</manifest>

Manifest変更後

xml

1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 android:versionCode="1" android:versionName="1.0" 4 package="com.kyome.DroidCustomKeyboard" > 5 <uses-sdk android:minSdkVersion="23" /> 6 <application 7 android:allowBackup="true" 8 android:label="@string/app_name" > 9 </application> 10</manifest>

サービス変更前

c#

1using Android.App; 2using Android.Content; 3using Android.Views; 4using Android.Views.InputMethods; 5using Android.InputMethodServices; 6using Java.Lang; 7 8namespace DroidCustomKeyboard 9{ 10 11 public class TestKeyboard : InputMethodService, KeyboardView.IOnKeyboardActionListener 12 { 13 public KeyboardView kv; 14 public Keyboard k; 15 16 public override View OnCreateInputView() 17 { 18 kv = (KeyboardView)this.LayoutInflater.Inflate(Resource.Layout.keyboard, null); 19 k = new Keyboard(this, Resource.Xml.test_keyboard); 20 kv.Keyboard = k; 21 kv.OnKeyboardActionListener = this; 22 return kv; 23 } 24 25262728 } 29}

サービス変更後

c#

1using Android.App; 2using Android.Content; 3using Android.Views; 4using Android.Views.InputMethods; 5using Android.InputMethodServices; 6using Java.Lang; 7 8namespace DroidCustomKeyboard 9{ 10 11 [Service(Permission = "android.permission.BIND_INPUT_METHOD")] 12 [IntentFilter(new[] { "android.view.InputMethod" })] 13 [MetaData("android.view.im", Resource = "@xml/method")] 14 public class TestKeyboard : InputMethodService, KeyboardView.IOnKeyboardActionListener 15 { 16 public KeyboardView kv; 17 public Keyboard k; 18 19 public override View OnCreateInputView() 20 { 21 kv = (KeyboardView)this.LayoutInflater.Inflate(Resource.Layout.keyboard, null); 22 k = new Keyboard(this, Resource.Xml.test_keyboard); 23 kv.Keyboard = k; 24 kv.OnKeyboardActionListener = this; 25 return kv; 26 } 27 28293031 } 32}

投稿2017/09/27 10:36

Kyome

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

intent-filter要素の上に書いてあったのですね。それは見落としていました。しかし、繰り返しになりますが、いずれにしろJavaプロジェクトできちんと動いていたものを移植しなければ、Xamarin.Androidで動くことはないと思います。subtypeをsuptypeを打ち間違えたりとかしているみたいですし。

(ちなみにその間違い自体はadb logcatの出力に原因がちゃんと出ていたので分かりました。)

投稿2017/09/27 06:28

編集2017/09/27 06:30
atsushieno

総合スコア121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kyome

2017/09/27 10:30

subtypeをsuptypeと間違えていたのは痛恨のミスでした。これを修正することでIMEのリストには認識されるようになりましたが、キーボードそのものが表示されないという次の段階になりました。 結果的にはManifestにサービスの設定を書いても意味がなく、サービスのcsファイルに書かなければならないことが判明して解決しました。
guest

0

Android公式ドキュメントで記載されている <meta-data android:name="android.view.im" android:resource="@xml/method" /> が無いみたいですけど、それで動くんですか?

// 本当にちゃんと「Javaで動いたコード」がXamarin.Androidに移植できているかどうかを外の人が確認するには、Javaのプロジェクトのソースも確認したいところです。

投稿2017/09/27 02:13

atsushieno

総合スコア121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kyome

2017/09/27 05:10

AndroidManifest.xml の中のserviceタグの中に書いてありますが、場所が悪いんでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問