web-dev-qa-db-ja.com

imeOptions、imeActionId、imeActionLabelの動作

私はAndroidネイティブ開発、およびIMEアクションボタンをカスタマイズする方法を見つけようとしています。Googleドキュメントを見てきましたが、非常に少ない予想される動作に関する情報。

公式ガイド から、属性を使用してキーボードアクションボタンを構成できることを理解しています。

  • Android:imeOptionsは、スペースキーの近くに表示されるボタンのテキスト/ IDを事前定義された値に設定できます(たとえば、actionGoキーラベルをGoおよびid to 2)
  • Android:imeActionLabelキーボードが全画面表示のとき、通常は横長モードのときに入力領域内に表示されるボタンのラベルを設定します。任意の文字列値に設定できます。
  • Android:imeActionId前と同じですが、コールバックメソッドに渡される数値IDを設定します

しかし、いくつかの経験的な試みの後、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レベル> = 16では、キーボタンと入力エリアボタンを区別できません
  • aPIレベル= 15では、キーボタンにカスタムテキストを設定できません。

API 15と16+の両方でこれを取得する方法を知っていますか?または、APIバージョン全体(または少なくとも一部)で一貫した動作を取得する方法がある場合はどうでしょうか。

IMEの設定に、異なる動作を正当化できる何かが欠けているのかもしれません...

どうもありがとうございました!

44
Alessandro

設定した値の処理方法を決定するのは、実際にはAndroidフレームワーク自体ではなく、インプットメソッドアプリ次第です。

Androidフレームワークは、設定した値を入力メソッドに渡すだけです。入力メソッドは、キーボードに表示するボタンまたは全画面表示で「抽出された」EditTextを選択できます。 Androidフレームワークは、2つの方法でEditorInfoに影響します。

  • それを EditorInfo.makeCompatible に渡し、その値がキーボードとアプリのtargetApiVersionsの間で互換性があることを確認します。現時点では、これはエディターアクションではなく、いくつかのInputType値にのみ影響しますが、新しいエディターアクション(または完全に新しい設定)が導入された場合、これは変更される可能性があります。

  • 入力メソッドのdefault動作を設定します。これには、フルスクリーンエディターに関する動作も含まれます。入力メソッドがこのデフォルトの動作をオーバーライドしないことを選択した場合、Androidバージョン間で異なる動作になる可能性があります。多くのキーボードは、Androidバージョン間で一貫した方法で、独自の動作を設定することを選択します。

そのため、特定のEditorInfoフィールドが特定のバージョンに特定の影響を与えると言うのはそれほど簡単ではなく、1つのAndroidバージョンであっても一貫した動作を保証する方法はありません。あなたがしているのは、ユーザーへの提示方法を選択するインプットメソッドにヒントを提供することだけです。

8
Dan Hulme

Javaコードで.setImeActionLabel()をプログラムで呼び出すだけで、actionIDを(もう一度)希望するものに設定できます。

editText.setImeActionLabel(getString(R.string.xxx), EditorInfo.IME_ACTION_GO);
10
Cloudream

新しい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をターゲットにする別の方法ですが、キーボード入力のアクションを変更する柔軟性も備えています。

2
Donato

誰かが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ファイルで定義されている内容に基づいて適切なラベルを表示します。

2
Hamid