DialogFragment фокусирует EditText на диалоге, открытом для API 28 - PullRequest
1 голос
/ 28 мая 2019

Я хочу сфокусировать первое TextInputEditText в макете и автоматически отображать экранную клавиатуру при отображении диалогового окна

Я нацеливаюсь на уровень API 28.

Компоновка:

        <com.google.android.material.textfield.TextInputLayout
            android:id="@+id/d_add_edit_name_til"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/activity_vertical_margin"
            android:layout_marginTop="@dimen/activity_vertical_margin"
            android:layout_marginEnd="@dimen/activity_vertical_margin"
            android:theme="@style/TextInputLayoutAppearance"
            >
            <com.google.android.material.textfield.TextInputEditText
                android:id="@+id/d_add_edit_name_et"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="User email"
                android:imeOptions="actionDone"
                android:inputType="textCapSentences"
                android:singleLine="true"
                android:focusableInTouchMode="true"
                android:focusable="true"
            >
                <requestFocus />
            </com.google.android.material.textfield.TextInputEditText>
        </com.google.android.material.textfield.TextInputLayout>

DialogFragment код:

@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
    final Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    return dialog;
}

....

@Override
public void onResume(){
    super.onResume();

    int dialogWidth = Functions.convertDpToPixel(300,activity);
    int dialogHeight = Functions.convertDpToPixel(250,activity);

    new Handler().post(() -> {
        getDialog().getWindow().setLayout(dialogWidth, dialogHeight);
    });
}

Ответы от этой темы помогли мне решить проблему с API <28. </p>

Я знаю по документации по изменениям Android 9 , что:

Кроме того, действия больше неявно назначают начальный фокус в сенсорном режиме. Вместо этого вы можете явно запросить начальный фокус, если хотите.

Один из способов явного запроса начального фокуса (, как описано здесь ) заключается в добавлении тега <requestFocus /> внутри EditText, но все еще безуспешно для уровня API 28 + DialogFragment

* Обратите внимание, что DialogFragment из библиотеки andoridx (androidx.fragment.app.DialogFragment)

Кто-нибудь еще имеет эту проблему?

Edit: Единственный способ сделать эту работу - добавить следующий код в onViewCreated:

    new Handler().postDelayed(() -> {
        nameEt.requestFocus();
        InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(nameEt, InputMethodManager.SHOW_IMPLICIT);
    },200);

Я не считаю это правильным ответом, поскольку использование потоков таким образом делает код непредсказуемым. Все еще жду хорошего ответа

Ответы [ 2 ]

1 голос
/ 28 мая 2019
EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);
0 голосов
/ 28 мая 2019
TextInputEditText textInputEditText= (TextInputEditText) findViewById(R.id.d_add_edit_name_et);
textInputEditText.requestFocus();
...