web-dev-qa-db-ja.com

キーボードの上にEditTextを使用してボトムシート全体を表示する

ユーザーが値を入力するためのEditTextを備えたキーボードの上にボトムシートが表示されるUIを実装しています。問題は、ビューがキーボードによって部分的に重なっており、ボトムシートの下部を覆っていることです。

これは、ボトムシートであり、キーボードはありません。

Bottom Sheet

キーボードが表示されている下のシートです。

enter image description here

ボトムシート全体を表示するための最良の方法は何ですか?

ありがとう。

10
Advice-Dog

このため、AlertDialogが最適に機能することがわかりました。画面の底面または側面にぴったりとは接触しませんが、それでも十分に見えます。

最初に、ビューでAlertDialogを作成します。

val view = LayoutInflater.from(context).inflate(R.layout.alert, null)

dialog = AlertDialog.Builder(context)
             .setView(view)
             .create()

次に、重力を設定します。

    dialog.window.attributes.gravity = Gravity.BOTTOM

そして最後に、それを見せてください。

dialog.show()

onDismissListenerを使用して、キーボードをダイアログにバインドしてバインドすることもできます。

AlertDialogを表示した後、キーボードを押し上げます。

EditTextを渡して、このメソッドを呼び出します。

fun showKeyboard(view: View?) {
        if (view == null) return;

        val imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
    }

onDismissListener内で却下した場合。

private fun hideKeyboard() {
        val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0)
    }
1
Advice-Dog

この質問から@jblejderを再投稿するだけです キーボードはBottomSheetDialogFragmentを非表示にします

これを変更するのに最も便利な方法は、スタイルを作成することです。

<style name="DialogStyle" parent="Theme.Design.Light.BottomSheetDialog">
    <item name="Android:windowIsFloating">false</item>
    <item name="Android:statusBarColor">@Android:color/transparent</item>
    <item name="Android:windowSoftInputMode">adjustResize</item>
</style>

そして、BottomSheetDialogFragmentのonCreateメソッドでこれを設定します。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setStyle(DialogFragment.STYLE_NORMAL, R.style.DialogStyle)
}

これは私のデバイスでどのように見えるかです:

enter image description here

15
Distra
dialog = new BottomSheetDialog(getContext(), R.style.BottomSheetDialog);  
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    BottomSheetDialog d = (BottomSheetDialog) dialog;
                    FrameLayout bottomSheet = d.findViewById(R.id.design_bottom_sheet);
                    BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);
                    bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
                }
            },0);
        }
    });

このコードは、フラグメントのonCreateViewメソッドで正常に機能します(ADMに感謝)

4
Nordknight

BottomSheetDialogはこれに役立ちます。編集テキストに焦点を合わせてソフトキーボードを開いた状態で開きますが、ユーザーはソフトキーボードを閉じることができ、ダイアログは下にリセットされます。再びフォーカスすると、ダイアログがソフトキーボードの上部に表示されます。

_ public void showDialog()  {
    final BottomSheetDialog dialog=new BottomSheetDialog(this);
    dialog.setContentView(R.layout.item_dialog);
    dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    dialog.show();
}
_

BottomSheetDialogをキーボード上で展開できます。ただし、このためには、SoftKeyboard Openの後に呼び出す必要があります。展開コードはです。

_ BottomSheetDialog d = (BottomSheetDialog) dialog;
            FrameLayout bottomSheet = (FrameLayout) d.findViewById(Android.support.design.R.id.design_bottom_sheet);
            BottomSheetBehavior.from(bottomSheet).setState(BottomSheetBehavior.STATE_EXPANDED);
_

DialogInterface.OnShowListener()でテストしましたが、動作していません。それで動作を1秒遅らせてテストしました。しかし、遅延は解決策ではありません。ダイアログを展開するアクションを決定する必要があります。

_ final BottomSheetDialog dialog=new BottomSheetDialog(this);
    dialog.setContentView(R.layout.item_dialog);
    dialog.getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE|
                    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            FrameLayout bottomSheet = (FrameLayout) dialog.findViewById(Android.support.design.R.id.design_bottom_sheet);
            BottomSheetBehavior.from(bottomSheet).setState(BottomSheetBehavior.STATE_EXPANDED);
        }
    },2000);
    dialog.show();
_
3
ADM

私の答えは、まだ解決策を探している人に役立つかもしれません。キーボードがBottomSheetDialogFragmentの編集テキストをカバーしている場合、setupDialog()メソッドでクラスKeyboardUtilのインスタンスを作成し、ルートビューを渡します。

    @Override
    public void setupDialog(final Dialog dialog, int style) {
        super.setupDialog(dialog, style);
        View view = View.inflate(getActivity(), R.layout.reopen_dialog_layout, null);
        new KeyboardUtil(getActivity(), view);
}

新しいクラスを作成する

    public class KeyboardUtil {
        private View decorView;
        private View contentView;
        //a small helper to allow showing the editText focus
        ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                Rect r = new Rect();
                //r will be populated with the coordinates of your view that area still visible.
                decorView.getWindowVisibleDisplayFrame(r);

                //get screen height and calculate the difference with the useable area from the r
                int height = decorView.getContext().getResources().getDisplayMetrics().heightPixels;
                int diff = height - r.bottom;

                //if it could be a keyboard add the padding to the view
                if (diff != 0) {
                    // if the use-able screen height differs from the total screen height we assume that it shows a keyboard now
                    //check if the padding is 0 (if yes set the padding for the keyboard)
                    if (contentView.getPaddingBottom() != diff) {
                        //set the padding of the contentView for the keyboard
                        contentView.setPadding(0, 0, 0, diff);
                    }
                } else {
                    //check if the padding is != 0 (if yes reset the padding)
                    if (contentView.getPaddingBottom() != 0) {
                        //reset the padding of the contentView
                        contentView.setPadding(0, 0, 0, 0);
                    }
                }
            }
        };

        public KeyboardUtil(Activity act, View contentView) {
            this.decorView = act.getWindow().getDecorView();
            this.contentView = contentView;

            //only required on newer Android versions. it was working on API level 19
            if (Build.VERSION.SDK_INT >= 19) {
                decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);
            }
        }

        /**
         * Helper to hide the keyboard
         *
         * @param act
         */
        public static void hideKeyboard(Activity act) {
            if (act != null && act.getCurrentFocus() != null) {
                InputMethodManager inputMethodManager = (InputMethodManager) act.getSystemService(Activity.INPUT_METHOD_SERVICE);
                inputMethodManager.hideSoftInputFromWindow(act.getCurrentFocus().getWindowToken(), 0);
            }
        }

        public void enable() {
            if (Build.VERSION.SDK_INT >= 19) {
                decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);
            }
        }

        public void disable() {
            if (Build.VERSION.SDK_INT >= 19) {
                decorView.getViewTreeObserver().removeOnGlobalLayoutListener(onGlobalLayoutListener);
            }
        }
    }
0
Fatal Exception