私はAndroidネイティブ開発の初心者で、IMEのアクションボタンをカスタマイズする方法を見つけようとしています。Googleのドキュメントを見ましたが、期待される動作についての情報はほとんど見当たりません。
公式ガイド]1から、キーボードのアクションボタンは属性を使用して設定できることを理解しました。
しかし、いくつかの経験的な試みの後、私はAPIレベル15と次のAPIレベルの間で異なる動作を発見しました。
単純なEditText要素に、以下の属性を設定しました。
<EditText
...
android:imeOptions="actionGo"
android:imeActionLabel="Custom"
android:imeActionId="666"
android:inputType="text"/>
で、縦書きと横書きの両方で、異なるAPIレベルで効果を確認しました。以下はその結果です。
APIレベル15 - 4.0.3 です。
ポートレートモードでは、キーラベルはGoで、コールバックメソッドに渡されるアクションIDは、imeOptionsの設定に従って、2です。
ランドスケープモードでは、キーラベル/IDはポートレートモードと同様にGo/2、入力エリアに表示されるボタンは、imeActionLabelおよびimeActionId属性に従って、Custom/666となります。
APIレベル16、17、18 - 4.1.2、4.2.2、4.3。
ポートレートモードとランドスケープモードの両方で、キーとボタンはCustomラベルで表示され、666 IDにバインドされ、imeOptions属性は無視されます。
この動作の不一致は、かなり厄介です。
API15と16+の両方で取得する方法をご存じでしょうか? あるいは、すべてのAPIバージョン(または少なくともその一部)で一貫した動作を得る方法があれば教えてください。
もしかしたら、私はIMEの設定の中で、異なる動作を正当化できる何かを見逃しているのかもしれません。
どうもありがとうございました。
設定した値をどうするかは、実はAndroidフレームワーク自体ではなく、入力メソッドアプリが決めることなのです。
Androidフレームワークは設定された値を入力メソッドに渡すだけで、入力メソッドはキーボードに表示するボタンやフルスクリーン表示のEditText
を抽出したものを選択することができます。Androidフレームワークは、2つの方法でEditorInfo
に影響を与えます。
キーボードとアプリの targetApiVersion
の間で互換性があることを確認するために、EditorInfo.makeCompatible
を通過させます。現時点では、これはエディターアクションではなく、いくつかの InputType
値にのみ影響しますが、新しいエディターアクション(または完全に新しい設定)が導入された場合は変更される可能性があります。
フルスクリーンエディターの挙動を含む、入力メソッドの default の挙動を設定します。入力メソッドがこのデフォルトの挙動を上書きしないことを選択した場合、Androidのバージョン間で異なる挙動になってしまう可能性があります。多くのキーボードは、Androidのバージョン間で一貫性のある方法で、独自の動作を設定することを選択します。
そのため、ある特定のEditorInfo
フィールドが、ある特定のバージョンに特定の効果をもたらすと言うのは、それほど簡単ではありませんし、あるAndroidバージョンであっても、一貫した振る舞いを保証する方法はないのです。あなたがしていることは、入力メソッドにヒントを提供することであり、入力メソッドはそれをどのようにユーザーに表示するかを選択するのです。
Androidのカスタムキーボードを設計している人がいて、Enterキーのラベルに問題がある場合、次のようにします。Androidのカスタムキーボードのサンプルでは、SoftKeyboard.javaに以下のメソッドを用意しています。
@Override
public void onStartInput(EditorInfo attribute, boolean restarting)
{
super.onStartInput(attribute, restarting);
.
. // the implementation
.
mCurKeyboard.setImeOptions(getResources(), attribute.imeOptions);
}
最後の行を以下の行に変更します。
mCurKeyboard.setImeOptions(getResources(), attribute);
次に、LatinKeyboard.javaのsetImeOptionsメソッドを以下のように変更します。
void setImeOptions(Resources res, EditorInfo ei)
{
if (mEnterKey == null)
{
return;
}
switch (ei.imeOptions & (EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION))
{
case EditorInfo.IME_ACTION_SEND:
mEnterKey.iconPreview = null;
mEnterKey.icon = null;
mEnterKey.label = res.getText(R.string.label_send_key);
break;
case EditorInfo.IME_ACTION_GO:
mEnterKey.iconPreview = null;
mEnterKey.icon = null;
mEnterKey.label = res.getText(R.string.label_go_key);
break;
case EditorInfo.IME_ACTION_NEXT:
mEnterKey.iconPreview = null;
mEnterKey.icon = null;
mEnterKey.label = res.getText(R.string.label_next_key);
break;
case EditorInfo.IME_ACTION_SEARCH:
mEnterKey.icon = res.getDrawable(R.drawable.sym_keyboard_search);
mEnterKey.label = null;
break;
default:
mEnterKey.iconPreview = null;
mEnterKey.label = res.getText(R.string.label_enter_key);
mEnterKey.icon = null;
break;
}
if (ei.actionLabel != null)
{
mEnterKey.iconPreview = null;
mEnterKey.icon = null;
mEnterKey.label = ei.actionLabel;
}
}
これで、カスタムキーボードには、xmlファイルで定義されているimeActionLabelに基づいた適切なラベルが表示されるようになりました。