47

私は Android ネイティブ開発にまったく慣れていないので、IME アクション ボタンをカスタマイズする方法を理解しようとしています。Google のドキュメントを見てきましたが、予想される動作に関する情報はほとんど見つかりません。

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

  • android:imeOptionsは、スペース キーの近くに表示されるボタンのテキスト/ID をいくつかの定義済みの値に設定できます (たとえば、actionGo はキー ラベルをGoに設定し、ID を 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 ですが、入力領域に表示されるボタンは、imeActionLabel および imeActionId 属性に従ってカスタム/666 になります。

API レベル 16、17、および 18 - 4.1.2、4.2.2、および 4.3

縦向きと横向きの両方のモードで、キーとボタンはカスタムラベルで表示され、imeOptions 属性を無視して 666 ID にバインドされます。

この動作の不一致は、次の理由で非常に厄介です。

  • API レベル >= 16 では、キー ボタンと入力領域ボタンを区別できません。
  • API レベル = 15 では、キー ボタンにカスタム テキストを設定できません。

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

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

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

4

4 に答える 4

10

Javaコードでプログラム的に呼び出すだけ.setImeActionLabel()で、actionIDを(再び)目的のものに設定できます。

editText.setImeActionLabel(getString(R.string.xxx), EditorInfo.IME_ACTION_GO);
于 2014-03-21T02:43:06.977 に答える
2

誰かが 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 ファイルで定義されている内容に基づいて、カスタム キーボードに適切なラベルが表示されます。

于 2015-01-14T20:53:02.830 に答える