как адаптировать раскладку при показе клавиатуры? - PullRequest
0 голосов
/ 30 сентября 2018

Я бы хотел "проинструктировать" андроида, как правильно адаптировать раскладку экрана, когда пользователь делает что-то, что выдает клавиатуру.

На самом деле, когда клавиатура показана, андроид просто рисует ее поверх элементов днаэкрана.Хотя это простой, а иногда и правильный подход

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

другой сценарий - это когда клавиатура покрывает толькочастично какой-то предмет, затем андроид впадает в сумасшедшее состояние, когда экран становится нестабильным

enter image description here

изображение не отображается, но эти две частично покрытые кнопкимигают, как сумасшедшие, когда клавиатура всплывает

Итак, опять вопрос: как я могу сказать андроиду, какие элементы макета он может уменьшить или просто удалить с экрана, чтобы создать пространство для отображения клавиатуры?

================= ОБНОВЛЕНИЕ ==============

Я думаю, что вся эта клавиатураСитуация макета имеет 2 возможных «лучших сценария»:
1 - информация, которую я хочу показать пользователю, находится вверху экрана, поэтому я хотел бы, чтобы клавиатура закрывала внизу
2 - информация, которую я хочу показать, находится внизутак что я хочу клавиатуру "толкать" тон показывает вверх, чтобы пользователь мог видеть то, что внизу, как на следующей фотографии

enter image description here

идеальное решение - это не конфигурация "приложения в широком масштабе", так какПоведение должно быть выбрано макетом по макету

Ответы [ 5 ]

0 голосов
/ 09 октября 2018

Вы можете использовать следующий подход для решения вашей проблемы.

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:clickable="true"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:orientation="vertical"
        android:padding="16dp">

        <ImageView
            android:id="@+id/image_logo"
            android:layout_width="240dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="24dp"
            android:adjustViewBounds="true"
            android:src="@drawable/demo"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <EditText
            android:id="@+id/edit_login"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/image_logo" />

        <EditText
            android:id="@+id/edit_password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/edit_login" />

        <Button
            android:id="@+id/btn_login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/login"
            android:textAllCaps="false"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/edit_password" />

        <Button
            android:id="@+id/btn_password"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:text="@string/login_with"
            android:textAllCaps="false"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/edit_password" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="24dp"
            android:text="@string/forgot_password_q"
            android:textSize="16sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/btn_login"
            app:layout_constraintVertical_bias="0.0" />

    </android.support.constraint.ConstraintLayout>

</ScrollView>

В этом случае вы можете использовать defaultSoftInputMode по умолчанию.

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

В результате пользователь может прокручивать пользовательский интерфейс при появлении программной клавиатуры.

до прокрутки

после прокрутки

программная клавиатура исчезла

0 голосов
/ 09 октября 2018

Я обычно делал это с помощью Rx (это позволяет легко отписаться, когда просмотр разрушен) Внутри моего BaseFragment:

protected fun setSoftwareKeyboardListener(root: View) {
    addDisposable(Flowable.create<Boolean>({ emitter ->
        root.viewTreeObserver.addOnGlobalLayoutListener {
            val parentHeight = root.rootView.height
            val heightDiff = parentHeight - root.height
            emitter.onNext(heightDiff > parentHeight / 4)
        }
    }, BUFFER)
        .subscribe { if (it) onKeyboardOpened() else onKeyboardClosed() })
}

protected open fun onKeyboardOpened() {}

protected open fun onKeyboardClosed() {}

И внутри фрагмента, расширяющего BaseFragment:

override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    view?.let { setSoftwareKeyboardListener(it) }
}
0 голосов
/ 03 октября 2018

Использование

android:windowSoftInputMode="adjustPan"

И на вашем экране вы задаете корень ScrollView с android:fitSystemView="true"

Также установите свою кнопку, расположенную ниже, от edittext до focusable, а focusableInTouchMode - true.

0 голосов
/ 08 октября 2018

Я использовал «особый» (??) подход, чтобы скрыть / изменить какой-либо интерфейс, когда отображается клавиатура: скрытый полноэкранный режим. Видно, что когда клавиатура становится видимой, ее высота изменяется, а разница - это количество пикселей, занимаемое отклавиатура.Это событие легко перехватить, используя:

View.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        //the resize event will be triggered here
        ...
    }
});
0 голосов
/ 30 сентября 2018

вы можете добавить эту строку к вашему manifest (в вашем activity tag)

android:windowSoftInputMode="adjustPan|adjustResize"

, при этом будут прокручиваться представления, поэтому soft keyboard не будет охватывать представление,

но я не знаю, могли бы вы сказать андроиду, какие предметы покрыть ...

...