EditText OnKeyListener с setFocus не работает, как ожидалось - PullRequest
0 голосов
/ 20 февраля 2019

Я использую устройство Android с физической аппаратной клавиатурой.У меня есть два EditTexts (номер детали и кол-во) и два Buttons (сброс и сохранение) на экране.После того, как пользователь введет Qty, он хочет нажать клавишу Enter на физической клавиатуре, чтобы вызвать функцию «Сохранить».Моя текущая функция сохранения сохранит данные в файл, очистит данные на экране и установит фокус на номер детали.

Похоже, что мой onKeyListener не вернул значение True, как только оно было использовано, и вызывает другое действие клавиши Enter.чтобы переместить мой курсор в поле Qty (по праву он должен остаться в поле Part No).Я думал, что возврат True будет означать, что этот ключ Enter был использован, я правильно понимаю?

Мои два EditText помещаются непосредственно под ConstraintLayout (не под любым под-макетом).Любая идея о том, где мой код идет не так?

Ниже мой кусок кода для макета.

<EditText
    android:id="@+id/etPart"
    android:layout_width="200dp"
    android:maxLength="20"
    android:layout_height="wrap_content"
    android:layout_marginLeft="10dp"
    android:layout_marginTop="10dp"
    android:maxLines="1"
    android:inputType="text"
    android:imeOptions="actionNext"
    app:layout_constraintLeft_toRightOf="@+id/tvPart"
    app:layout_constraintTop_toTopOf="parent"/>

 <EditText
    android:id="@+id/etQty"
    android:layout_width="100dp"
    android:maxLength="5"
    android:layout_height="wrap_content"
    android:layout_marginLeft="10dp"
    android:inputType="number"
    android:maxLines="1"
    android:imeOptions="actionDone"
    app:layout_constraintLeft_toRightOf="@+id/tvQty"
    app:layout_constraintTop_toBottomOf="@id/etPart"
    android:nextFocusDown="@id/etPart"/>

Ниже приведен мой код Java.Это в методе onCreate.

etQty.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View view, int i, KeyEvent keyEvent) {
            if(i == KeyEvent.KEYCODE_ENTER){
                saveData(null);
                // I tried to use return true here, sames result, no different.
            }
            return false;
        }
    });

Это функции.

public void saveData(View view) {
    // check and save data to file logic.
    // ...... etc.
    mProductViewModel.insert(product);

    resetView(null);
}

 public void resetView(View view) {
    etPart.setText(null);
    etQty.setText(null);

    // I am expecting the focus will stay in Part No box but it is not. It will jump to Qty field.
    etPart.requestFocus();
}

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

После проверки со специалистом я понял, что мне также нужно обрабатывать Action Up (Key Up).

Ниже приведен рабочий код.

    etQty.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View view, int i, KeyEvent keyEvent) {
            if(i == KeyEvent.KEYCODE_ENTER && keyEvent.getAction() == KeyEvent.ACTION_UP){
                saveData(null);
                return true;
            }
            return false;
        }
    });
0 голосов
/ 20 февраля 2019

Обычно это вызвано программной клавиатурой, попробуйте этот код?

etPart.requestFocus();
final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.restartInput(etPart);
imm.showSoftInput(etPart, 0);
...