wal*_*mar 1 android android-softkeyboard bottom-sheet
我有一个Bottomsheet片段,显示给用户回答他的评论.在底部的底部我们有编辑文本,用户可以在其中添加新评论.因此,当软键盘打开时,底部板位于键盘上方,其顶部远离屏幕.但是当键盘打开时,底部应该调整大小.
这是我的代码:
<android.support.design.widget.CoordinatorLayout
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">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<include android:id="@+id/toolbar_layout"
layout="@layout/partial_toolbar" />
<android.support.v7.widget.RecyclerView
android:id="@+id/list_comments"
android:layout_below="@+id/toolbar_layout"
android:layout_width="match_parent"
android:overScrollMode="always"
android:layout_height="match_parent"/>
<View
android:layout_width="match_parent"
android:layout_height="3dp"
android:layout_above="@+id/comment_container"
android:layout_alignBaseline="@+id/list_comments"
android:background="@drawable/elevation_bottom"/>
<LinearLayout
android:id="@+id/comment_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ebffffff"
android:layout_alignParentBottom="true"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingBottom="@dimen/vertical_spacing"
android:paddingEnd="@dimen/horizontal_spacing"
android:paddingStart="8dp"
android:paddingTop="@dimen/vertical_spacing">
<android.support.v7.widget.AppCompatImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/transparent"
android:src="@drawable/ic_add_blue_small"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:background="@drawable/bg_message_field"
android:gravity="center_vertical"
android:orientation="horizontal">
<android.support.v7.widget.AppCompatEditText
android:id="@+id/edit_comment"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@color/transparent"
android:hint="@string/comments_add_comment_hint"
android:inputType="textMultiLine"
android:maxLength="200"
android:maxLines="3"
android:minLines="1"
android:paddingBottom="8dp"
android:paddingEnd="0dp"
android:paddingStart="8dp"
android:paddingTop="8dp"
android:textSize="14sp"
app:fontFamily="@font/lora_regular"/>
<android.support.v7.widget.AppCompatImageButton
android:id="@+id/button_send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:background="@color/transparent"
app:srcCompat="@drawable/ic_send_message"/>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
</android.support.design.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)
清单上的活动(此活动打开对话框)
<activity
android:name=".presentation.ui.category.CategoryDetailsActivity"
android:configChanges="locale|orientation|screenSize|keyboard"
android:windowSoftInputMode="adjustResize"
android:windowTranslucentNavigation="true"
android:windowTranslucentStatus="true"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.Main.NoActionBar" />
Run Code Online (Sandbox Code Playgroud)
我也把这个代码放到方法中 setupDialog
dialog.getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
Run Code Online (Sandbox Code Playgroud)
ibh*_*ana 11
从这里得到了这个答案
正如我在其中一个项目中遇到同样的问题,
在BottomSheetFragment中的onCreateDialog中使用它
new KeyboardUtil(getActivity(), rootView);
Run Code Online (Sandbox Code Playgroud)
通过使用以下类
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我最终使用以下代码获得了令人满意的结果:在 BottomSheetFragment 的 setupDialog(dialog: Dialog, style: Int) 方法中使用它
dialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
dialog.setOnShowListener {
val bottomSheetDialog = dialog as BottomSheetDialog
val bottomSheet = bottomSheetDialog.findViewById<View>(android.support.design.R.id.design_bottom_sheet) as FrameLayout?
BottomSheetBehavior.from(bottomSheet!!).state = BottomSheetBehavior.STATE_EXPANDED
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3439 次 |
| 最近记录: |