Подтвердить что ты не робот

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 виды могут быть скрыты с помощью мягкой клавиатуры.

В настоящее время не найдено ни одного идеального решения, а подходило. Взгляните на комментарии в принятом ответе, они могут оказаться полезными для вас!

4b9b3361

Ответ 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" попробуйте ниже:

  1. Установите android:descendantFocusability="afterDescendants" на ListView.
  2. Установите android:focusable="true" и android:focusableInTouchMode="true" на EditText.