Android - Показать BottomSheetDialogFragment над клавиатурой - PullRequest
0 голосов
/ 08 мая 2018

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

Вот что происходит, когда я поднимаю BottomSheetDialogFragment, вы можете видеть, что он выбирает Card Number EditText, но охватывает другой контент.

BottomSheetDialogFragment covering up content

В идеале, это то, что я ищу, вы можете видеть как EditTexts, так и отступ от View.

BottomSheetDialogFragment not covering up content

Я пробовал много решений, вращающихся вокруг windowSoftInputMode, но, похоже, ничего не работает. Я установил значение adjustResize для родителя Activity и фактическое значение BottomSheetDialogFragment через

dialog.window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)

И я также попытался изменить свой макет, изменив его с FrameLayout на ScrollView на CoordinatorLayout, чтобы посмотреть, как это повлияло на положение макета, но, похоже, ничего не работает .

Если кто-нибудь знает, как это сделать, это будет очень признательно, спасибо.

Ответы [ 6 ]

0 голосов
/ 17 июня 2019

Возможно, поздний ответ, но, вероятно, поможет.

Ничто другое не помогло мне. Но это решение работает

Обтекание макета внутри NestedScrollView

<androidx.core.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

     <--Rest of the layout-->
</androidx.core.widget.NestedScrollView>

Внутренние стили:

    <style name="BottomSheetDialogTheme" parent="Theme.Design.Light.BottomSheetDialog">
        <item name="bottomSheetStyle">@style/AppModalStyle</item>
        <item name="android:windowIsFloating">false</item>
        <item name="android:windowSoftInputMode">adjustResize</item>
    </style>

    <style name="AppModalStyle" parent="Widget.Design.BottomSheet.Modal">
        <item name="android:background">@drawable/rounded_corner_dialog</item>
    </style>

Здесь android:windowIsFloating должно быть ложным, а android:windowSoftInputMode должно быть adjustResize

0 голосов
/ 02 июня 2019

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

KeyboardVisibilityEvent library: https://android -arsenal.com / details / 1/2519

  KeyboardVisibilityEvent.setEventListener(activity) { isOpen ->
            setDialogHeight(isOpen)
  }

Поддержка минимальной версии SDK 14 для 2.0.0

И установить высоту диалога на 80% при открытии клавиатуры:

    /**
     * Changes size of dialog based on keyboard visibility state
     */
    private fun setDialogHeight(expanded: Boolean) {
        val dialog = dialog as BottomSheetDialog?
        val bottomSheet =
            dialog!!.findViewById<View>(com.google.android.material.R.id.design_bottom_sheet) as FrameLayout?
        val behavior = BottomSheetBehavior.from(bottomSheet!!)

        val displayMetrics = activity!!.resources.displayMetrics

        val width = displayMetrics.widthPixels
        val height = displayMetrics.heightPixels

        val maxHeight = (height * 0.88).toInt()

        behavior.peekHeight = if (expanded) maxHeight else -1
    }
0 голосов
/ 06 мая 2019

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

<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <View
        android:id="@+id/top_space"
        android:layout_width="match_parent"
        android:layout_height="10dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        />

    <!-- Other views -->

    <View
        android:id="@+id/bottom_space"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/button"
        app:layout_constraintVertical_weight="1"
        />

</android.support.constraint.ConstraintLayout>
0 голосов
/ 28 февраля 2019

Попробуйте этот BottomSheetDialogFragment:

import android.graphics.Rect; 
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.BottomSheetBehavior;
import android.support.design.widget.BottomSheetDialog;
import android.support.design.widget.BottomSheetDialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;

public class TestBottomSheetDialog extends BottomSheetDialogFragment {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View fragmentView = LayoutInflater.from(getContext()).inflate(R.layout.fragment_bottom_sheet, container, false);
        if (getDialog().getWindow() != null) {
           getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
        }
        if (getActivity() != null) {
            View decorView = getActivity().getWindow().getDecorView();
            decorView.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
                Rect displayFrame = new Rect();
                decorView.getWindowVisibleDisplayFrame(displayFrame);
                int height = decorView.getContext().getResources().getDisplayMetrics().heightPixels;
                int heightDifference = height - displayFrame.bottom;
                if (heightDifference != 0) {
                    if (fragmentView.getPaddingBottom() != heightDifference) {
                        fragmentView.setPadding(0, 0, 0, heightDifference);
                    }
                } else {
                    if (fragmentView.getPaddingBottom() != 0) {
                        fragmentView.setPadding(0, 0, 0, 0);
                    }
                }
            });
        }
        getDialog().setOnShowListener(dialog -> {
            BottomSheetDialog d = (BottomSheetDialog) dialog;
            View bottomSheetInternal = d.findViewById(android.support.design.R.id.design_bottom_sheet);
            if (bottomSheetInternal == null) return;
             BottomSheetBehavior.from(bottomSheetInternal).setState(BottomSheetBehavior.STATE_EXPANDED);
        });
        return fragmentView;
    }
}
0 голосов
/ 18 мая 2018

Добавление отступов к виртуальной клавиатуре не поддерживается самой ОС Android, но есть хакерские способы получить ее.

Одним из способов было бы прослушать фокус текста редактирования и прокрутить ScrollView чуть больше так:

edittext.setOnFocusChangeListener(new OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus)
             scrollView.scrollBy(0, 100);

    });

Как я уже сказал, этот способ хакерский и не рекомендуется.

Другим способом (который зависит от вашего макета и лучше, если он будет работать) было бы установить windowSoftInputMode в adjustPan или adjustResize (в зависимости от вашего макета) для вашей активности в AndroidManifest.xml.

0 голосов
/ 17 мая 2018

Этот следующий шаг может помочь решить ваши проблемы.

Сначала добавьте следующую строку в ваш EditText в XML-файле

android:imeOptions="actionSend|flagNoEnterAction"

Например:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:hint="Card number"
    android:imeOptions="actionSend|flagNoEnterAction"/>

Затем добавьте следующую строку в тег активности в файле AndroidManifest.xml

android:windowSoftInputMode="stateVisible|adjustResize"

Например:

<activity android:name=".stack.MainActivity"
    android:windowSoftInputMode="stateVisible|adjustResize">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

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

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

...