EditText теряет фокус при появлении клавиатуры; требует двойного касания для редактирования
Я разрабатываю приложение, которое содержит расширяемый список. В конце каждого списка пустая EditText
готова к отправке комментариев. У меня есть следующая проблема; когда я касаюсь EditText
, экран слегка изменяется (не проблема, поскольку изменение размера не всегда происходит, в зависимости от моего макета и положения списка EditText
int it), и появляется мягкая клавиатура. Однако во время этих событий EditText
теряет фокус и не восстанавливает его. Это довольно неудобно, так как без фокуса, несмотря на доступность клавиатуры, вход с клавиатуры не достигает EditText
. Как только я снова коснусь его, EditText
будет вести себя так, как ожидалось.
Это становится еще страннее. Когда клавиатура все еще отображается, я могу коснуться другого EditText
, и это произойдет; он теряет фокус. Однако, как только я прошел начальную потерю фокуса, я могу свободно перемещаться между ранее затронутыми EditText
без каких-либо проблем, связанных с фокусом. Только когда я скрою мягкую клавиатуру, исчезнет "состояние", и мне нужно будет дважды нажать EditText
, прежде чем сможете их редактировать.
Вот выдержки из моего кода. Во-первых, empty_comment.xml
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/blank_box"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="textCapSentences"
android:imeOptions="actionDone"
android:hint="@string/hint"
android:layout_marginLeft="30dip" >
</EditText>
</LinearLayout>
Здесь выдержка из фрагмента, где я использую рассматриваемый макет:
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.comment_empty, null);
final EditText editText = (EditText) convertView.findViewById(R.id.blank_box);
editText.setOnEditorActionListener(new OnEditorActionListener()
{
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
{
if(actionId == EditorInfo.IME_ACTION_DONE)
{
// Unrelated code
}
return true;
}
});
Я не указываю ничего конкретного в моем файле манифеста, но я мог бы предоставить его, если сочтет это полезным.
Update:
Добавление строки в Activity
для настройки панорамирования android:windowSoftInputMode="adjustPan"
частично решает проблему. Он заменяет текущее неожиданное поведение проблемой, что EditText
виды могут быть скрыты с помощью мягкой клавиатуры.
В настоящее время не найдено ни одного идеального решения, а подходило. Взгляните на комментарии в принятом ответе, они могут оказаться полезными для вас!
Ответы
Ответ 1
Вам нужно изменить свой AndroidManifest.xml
Добавьте android:windowSoftInputMode="adjustPan"
в действие, содержащее listview. Это решит вашу проблему.
<activity android:name=".MyEditTextInListView"
android:label="@string/app_name"
android:windowSoftInputMode="adjustPan">
Ответ 2
Решение состоит в том, чтобы опубликовать задержанную runnable, которая проверяет, все ли сфокусировано на просмотре EditText, а если нет, сосредоточьте его.
editText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(final View v, boolean hasFocus) {
if (hasFocus) {
// Request focus in a short time because the
// keyboard may steal it away.
v.postDelayed(new Runnable() {
@Override
public void run() {
if (!v.hasFocus()) {
v.requestFocus();
}
}
}, 200);
}
}
});
Ответ 3
У меня была та же проблема... Я решил это, расширив EditText.
Я создал onClickListener, и в этом методе у меня есть следующий код:
public OnClickListener clickListener = new OnClickListener() {
@Override
public void onClick(View v) {
EditTextInput.this.setFocusable(true);
EditTextInput.this.setFocusableInTouchMode(true);
EditTextInput.this.requestFocus();
}
};
Затем я поместил следующий код в обратный вызов onKeyPreIme. Вам нужно будет расширить EditText, чтобы получить к нему доступ.
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK & event.getAction() == KeyEvent.ACTION_UP) {
EditTextInput.clearFocus();
EditTextInput.this.setFocusable(false);
EditTextInput.this.setFocusableInTouchMode(false);
return false;
}
return super.dispatchKeyEvent(event);
}
Я нахожу, что мне нужно переключить флаговый флаг, чтобы принести клавиатуру с самого первого щелчка. Надеюсь, это поможет... работает для меня.
Ответ 4
Вы можете попробовать что-то вроде:
editText.requestFocus();
Вы также можете установить это:
android:windowSoftInputMode="stateHidden"
в файле манифеста
Ответ 5
вы можете попробовать этот ниже код для android manifest.xml
добавить код в android manifest android: windowSoftInputMode = "adjustPan"
А также добавьте в макет xml
<EditText
android:background="#FFFFFF"
android:capitalize="sentences"
android:inputType="textVisiblePassword"
android:layout_height="35px"
>
<requestFocus />
Ответ 6
У меня была эта проблема с android.support.design.widget.TextInputEditText
, и она была решена из изменения порядка флага в манифесте из:
android:windowSoftInputMode="stateHidden|adjustPan"
to
android:windowSoftInputMode="adjustPan|stateHidden"
Ответ 7
В дополнение к android:windowSoftInputMode="adjustPan"
попробуйте ниже:
- Установите
android:descendantFocusability="afterDescendants"
на ListView
.
- Установите
android:focusable="true"
и android:focusableInTouchMode="true"
на EditText
.