Я'м довольно новыми для Android собственной разработки, и я'м пытаясь выяснить, как настроить кнопки действий име. Я'вэ посмотрел в документации по Google, но я могу найти очень мало информации об ожидаемом поведении.
От официальное руководство я понимаю, что кнопки клавиатуры могут быть настроены с помощью атрибутов:
Но после некоторых эмпирических попыток я'вэ нашел различное поведение между 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 15 и 16+? Или если есть способ, чтобы получить последовательное поведение во всех (или хотя бы часть) версии API?
Может быть, я упускаю что-то в настройках IME, что может оправдать поведения...
Большое спасибо!
Просто позвони.setImeActionLabel()` programtically в Java коды для установки ID действий (снова) на ваш желаемый.
editText.setImeActionLabel(getString(R.string.xxx), EditorInfo.IME_ACTION_GO);
Это's фактически до метод ввода приложение, не самой платформой Android, чтобы решить, что делать с указанными вами значениями.
Платформа Андроид просто передает значения через метод ввода, который затем можно выбрать, какие кнопки на клавиатуре или на "добывают" В полей EditText в полноэкранном режиме. Платформы Android влияет на
EditorInfo` двумя способами:-
Он проходит через EditorInfo.makeCompatible
для обеспечения значения в нем совместимы между клавиатурой's и приложение'ы `targetApiVersion это. На данный момент это влияет только на некоторые помощью свойства inputType ценности, а не действия, редакторе, но это может измениться в случае введения новых действий редактора (или совершенно новые параметры) являются.
Устанавливает по умолчанию поведение для метода ввода, в том числе поведение вокруг полноэкранных редакторов. Если входной метод решает не переопределить это поведение по умолчанию, то это может закончиться поведения, что'ы отличаются между версиями Android. Много клавиатур сделать выбор, чтобы установить их собственное поведение, таким образом, что'ы, согласующиеся между версиями Android.
По этой причине, это's не так просто, чтобы сказать, что некий EditorInfo
поле имеет определенный эффект на какой-либо определенной версии, и там's нет способа, чтобы гарантировать последовательное поведение, даже на одной версии Андроида. Все, что вы're делая это указания на способ ввода, который выбирает, как представить их пользователю.
Когда вы начинаете новый проект 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"/>
Теперь, если вы читали документации, Вы бы знали, что атрибут 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;
}
}
Теперь ваш заказ клавиатура показывает правильное этикетки на основе того, что определено в XML-файл для imeActionLabel.