ユーザーが値を入力するためのEditTextを備えたキーボードの上にボトムシートが表示されるUIを実装しています。問題は、ビューがキーボードによって部分的に重なっており、ボトムシートの下部を覆っていることです。
これは、ボトムシートであり、キーボードはありません。
キーボードが表示されている下のシートです。
ボトムシート全体を表示するための最良の方法は何ですか?
ありがとう。
このため、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)
}
この質問から@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)
}
これは私のデバイスでどのように見えるかです:
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に感謝)
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();
_
私の答えは、まだ解決策を探している人に役立つかもしれません。キーボードが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);
}
}
}