私はAndroidネイティブ開発、およびIMEアクションボタンをカスタマイズする方法を見つけようとしています。Googleドキュメントを見てきましたが、非常に少ない予想される動作に関する情報。
公式ガイド から、属性を使用してキーボードアクションボタンを構成できることを理解しています。
しかし、いくつかの経験的な試みの後、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で、入力領域に表示されるボタンはCustom/ 666、imeActionLabelおよびimeActionId属性に応じて。
APIレベル16、17、18-4.1.2、4.2.2、4.3
ポートレートモードとランドスケープモードの両方で、キーとボタンはCustomラベルで表示され、666 idにバインドされ、imeOptions属性を無視します。
この動作の不一致は、次の理由で非常に迷惑です。
API 15と16+の両方でこれを取得する方法を知っていますか?または、APIバージョン全体(または少なくとも一部)で一貫した動作を取得する方法がある場合はどうでしょうか。
IMEの設定に、異なる動作を正当化できる何かが欠けているのかもしれません...
どうもありがとうございました!
設定した値の処理方法を決定するのは、実際にはAndroidフレームワーク自体ではなく、インプットメソッドアプリ次第です。
Androidフレームワークは、設定した値を入力メソッドに渡すだけです。入力メソッドは、キーボードに表示するボタンまたは全画面表示で「抽出された」EditText
を選択できます。 Androidフレームワークは、2つの方法でEditorInfo
に影響します。
それを EditorInfo.makeCompatible
に渡し、その値がキーボードとアプリのtargetApiVersion
sの間で互換性があることを確認します。現時点では、これはエディターアクションではなく、いくつかのInputType
値にのみ影響しますが、新しいエディターアクション(または完全に新しい設定)が導入された場合、これは変更される可能性があります。
入力メソッドのdefault動作を設定します。これには、フルスクリーンエディターに関する動作も含まれます。入力メソッドがこのデフォルトの動作をオーバーライドしないことを選択した場合、Androidバージョン間で異なる動作になる可能性があります。多くのキーボードは、Androidバージョン間で一貫した方法で、独自の動作を設定することを選択します。
そのため、特定のEditorInfo
フィールドが特定のバージョンに特定の影響を与えると言うのはそれほど簡単ではなく、1つのAndroidバージョンであっても一貫した動作を保証する方法はありません。あなたがしているのは、ユーザーへの提示方法を選択するインプットメソッドにヒントを提供することだけです。
Javaコードで.setImeActionLabel()
をプログラムで呼び出すだけで、actionIDを(もう一度)希望するものに設定できます。
editText.setImeActionLabel(getString(R.string.xxx), EditorInfo.IME_ACTION_GO);
新しいAndroidプロジェクトを開始すると、質問に対する良いヒントが得られます。デフォルトのログイン画面として作成できるLoginActivity
というアクティビティがあります。このアクティビティはEditText
を生成します:
<EditText
Android:id="@+id/password"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="@string/Prompt_password"
Android:imeActionId="@+id/login"
Android:imeActionLabel="@string/action_sign_in_short"
Android:imeOptions="actionUnspecified"
Android:inputType="textPassword"
Android:maxLines="1"
Android:singleLine="true"/>
documentation を読むと、imeOptions
属性を使用してテキストフィールドに追加のアクションを指定できることがわかります。たとえば、ポップアップするキーボードの右下隅に「次へ」などのアクションがあります。 imeOptions
を使用すると、Androidが提供する事前定義リストから別のアクションを選択できます。 「actionSend」や「actionSearch」などを指定できます。
アクティビティを実行するために、setOnEditorActionListener
イベントハンドラーを使用してそのアクションをリッスンできます。
mPasswordView = (EditText) findViewById(R.id.password);
mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
if (id == R.id.login || id == EditorInfo.IME_NULL) {
attemptLogin();
return true;
}
return false;
}
});
ここでimeActionId
をターゲットにする方法に注目してください。アクティビティのEditText
をターゲットにする別の方法ですが、キーボード入力のアクションを変更する柔軟性も備えています。
誰かが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;
}
}
これで、カスタムキーボードは、imeActionLabelのxmlファイルで定義されている内容に基づいて適切なラベルを表示します。