Поведение imeOptions, imeActionId и imeActionLabel

Я'м довольно новыми для Android собственной разработки, и я'м пытаясь выяснить, как настроить кнопки действий име. Я'вэ посмотрел в документации по Google, но я могу найти очень мало информации об ожидаемом поведении.

От официальное руководство я понимаю, что кнопки клавиатуры могут быть настроены с помощью атрибутов:

  • для Android:imeOptions можете настроить текст/идентификатор кнопки отображается рядом с пробелом, некоторые определенные значения (например. actionGo установить ключ метка перейти и ID для 2)
  • для Андроид:imeActionLabel установить метку кнопки отображается внутри области ввода, когда клавиатура отображается на весь экран, обычно в ландшафтном режиме. Может быть задано любое строковое значение.
  • для Андроид:imeActionId так же, как предыдущие, но установить числовой идентификатор, передаваемый в метод обратного вызова

Но после некоторых эмпирических попыток я'вэ нашел различное поведение между API уровня 15 и следующие уровни API.

Я'вэ создал простой элемент EditText со следующими атрибутами:

<EditText
        ...
        android:imeOptions="actionGo"
        android:imeActionLabel="Custom"
        android:imeActionId="666"
        android:inputType="text"/>

и я'вэ проверили эффект с различными уровнями API как в портретном, так и ландшафтном режиме. Вот результат.

Уровень API 15 - 4.0.3

В портретном режиме ключ метка перейти и действия ID, переданный в метод обратного вызова-это 2, в соответствии с imeOptions установка.

В ландшафтном режиме наклейка с ключом/ИД идти/2 как в портретном режиме, в то время как кнопка отображается в области ввода имеет пользовательские/666, в соответствии с imeActionLabel и атрибуты imeActionId.

API уровня 16, 17 и 18 - 4.1.2, 4.2.2 и 4.3

Как в портретном, так и ландшафтном режиме ключа и кнопки отображаются с таможня этикетки и обязаны 666 ИД, игнорируя атрибут imeOptions.

Это несоответствие в поведении очень раздражает, потому что:

  • с уровень API >= 16 вы можете'т различать основные кнопки и области ввода кнопка
  • с уровень API = 15 вы можете'т установить любой пользовательский текст для кнопки.

Вы знаете, как получить это в API 15 и 16+? Или если есть способ, чтобы получить последовательное поведение во всех (или хотя бы часть) версии API?

Может быть, я упускаю что-то в настройках IME, что может оправдать поведения...

Большое спасибо!

Просто позвони.setImeActionLabel()` programtically в Java коды для установки ID действий (снова) на ваш желаемый.

editText.setImeActionLabel(getString(R.string.xxx), EditorInfo.IME_ACTION_GO);
Комментарии (2)
Решение

Это's фактически до метод ввода приложение, не самой платформой Android, чтобы решить, что делать с указанными вами значениями.

Платформа Андроид просто передает значения через метод ввода, который затем можно выбрать, какие кнопки на клавиатуре или на "добывают" В полей EditText в полноэкранном режиме. Платформы Android влияет наEditorInfo` двумя способами:-

  • Он проходит через EditorInfo.makeCompatible для обеспечения значения в нем совместимы между клавиатурой's и приложение'ы `targetApiVersion это. На данный момент это влияет только на некоторые помощью свойства inputType ценности, а не действия, редакторе, но это может измениться в случае введения новых действий редактора (или совершенно новые параметры) являются.

  • Устанавливает по умолчанию поведение для метода ввода, в том числе поведение вокруг полноэкранных редакторов. Если входной метод решает не переопределить это поведение по умолчанию, то это может закончиться поведения, что'ы отличаются между версиями Android. Много клавиатур сделать выбор, чтобы установить их собственное поведение, таким образом, что'ы, согласующиеся между версиями Android.

По этой причине, это's не так просто, чтобы сказать, что некий EditorInfo поле имеет определенный эффект на какой-либо определенной версии, и там's нет способа, чтобы гарантировать последовательное поведение, даже на одной версии Андроида. Все, что вы're делая это указания на способ ввода, который выбирает, как представить их пользователю.

Комментарии (3)

Когда вы начинаете новый проект Android, это дает хорошую подсказку на ваш вопрос. Существует упражнение под названием LoginActivity, по которым вы можете создать экран входа в систему по умолчанию. Эта деятельность будет производитьполей EditText` как так:

Теперь, если вы читали документации, Вы бы знали, что атрибут imeOptions позволяет указать дополнительные действия для текстового поля. Например, клавиатура, которая всплывает, имеет действие на нижний правый угол, как"Следующий &quot и;. Используя imeOptions вы можете выбрать другое действие из списка, предоставляемый Android. Вы можете указать что-то вроде как &quot 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 в вашей деятельности, а также иметь гибкость, чтобы изменить действие на ввод с клавиатуры.

Комментарии (0)

Если кто-то проектирует пользовательские клавиатура для 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.

Комментарии (0)