I've searched all over the related questions on SO, tried basically all of their solutions, and have gotten nowhere. I want to have a bottom sheet modal dialog with a a few EditText
and other components in it, using BottomSheetDialogFragment
, which is easy enough.
The problem I am having is that the soft keyboard covers half the dialog. No settings I change seem to make any difference in anything. Did something change in the API? No amount of googling seems to be revealing a solution. What currently happens: keyboard does not cover the edit text that is currently selected, but it covers the dialog below it. I want the whole dialog to be visible at all times and move when the keyboard opens.
Here is my Fragment class:
public class GoalUpdateFormDialogFragment extends BottomSheetDialogFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.goal_update_form, container, false);
assert getDialog().getWindow() != null;
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
return view;
}
}
Here is the dialog layout file I am using:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/goal_update_bottom_sheet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_margin="5dp"
xmlns:android="http://schemas.android.com/apk/res/android"
app:layout_behavior="@string/bottom_sheet_behavior"
xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_margin="5dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/progress_update_hint"/>
<EditText
android:id="@+id/goal_progress_number_picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/goal_progress_box_hint"
android:inputType="number"/>
</LinearLayout>
<EditText
android:id="@+id/goal_update_comment_box"
style="@style/Widget.AppCompat.EditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="top"
android:hint="@string/comment"
android:lines="4"
android:maxLines="6"
android:inputType="textMultiLine"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/image_attachment_file_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/image_file_name_placeholder"
android:layout_marginStart="10dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"/>
<ImageButton
android:id="@+id/delete_attachment_button"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginStart="4dp"
android:layout_gravity="center_vertical"
android:background="@drawable/transparent"
android:alpha="0.54"
android:src="@drawable/ic_delete_black_24dp"/>
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="start">
<ImageButton
android:id="@+id/attach_file_button"
android:layout_width="32dp"
android:layout_height="32dp"
android:background="@drawable/transparent"
android:src="@drawable/ic_attach_file_black_24dp"
android:alpha="0.54"/>
<ImageButton
android:id="@+id/attach_image_button"
android:layout_width="32dp"
android:layout_height="32dp"
android:background="@drawable/transparent"
android:layout_toEndOf="@id/attach_file_button"
android:src="@drawable/ic_add_a_photo_black_24dp"
android:alpha="0.54"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/max_one_attachment"
android:layout_toEndOf="@id/attach_image_button"
android:layout_centerVertical="true"
android:layout_marginStart="10dp"
android:alpha="0.5"/>
<ImageButton
android:id="@+id/submit_button"
android:layout_width="32dp"
android:layout_height="32dp"
android:src="@drawable/ic_send_black_24dp"
android:background="@drawable/transparent"
android:layout_alignParentEnd="true"
android:alpha="0.54"/>
</RelativeLayout>
</LinearLayout>
And here is the activity layout in which the dialog will be displayed over:
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.iepone.classroom.view.activities.StudentDetailActivity"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/todo"
android:layout_gravity="center"
android:textAlignment="center"/>
<Button
android:id="@+id/pick_image_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Pick image"
android:onClick="onClickPickImage"/>
<Button
android:id="@+id/test_comment_box_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Test comment box"
android:onClick="onClickTestCommentBox"/>
<ImageView
android:id="@+id/test_image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</RelativeLayout>
</android.support.design.widget.CoordinatorLayout>
EDIT: Per request, here is the android manifest, with irrelevant bits removed:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="REDACTED">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:replace="android:label">
<activity
android:name=".view.activities.SplashActivity"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".view.activities.MainActivity"
android:theme="@style/MainActivityTheme" />
<activity
android:name=".view.activities.StudentDetailActivity"/>
</application>
</manifest>
You can force Android to hide the virtual keyboard using the InputMethodManager, calling hideSoftInputFromWindow , passing in the token of the window containing your focused view. This will force the keyboard to be hidden in all situations. In some cases, you will want to pass in InputMethodManager.
If you have a very large ui on bottomsheet, best thing is to use NestedScrollView with fixed size;
<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="500dp"
android:background="@color/colorWhite"
android:orientation="vertical">
......Other views
</android.support.v4.widget.NestedScrollView>
also have a BottomSheetBehavior like following in your bottomSheet;
define a member variable
private BottomSheetBehavior.BottomSheetCallback mBottomSheetBehaviorCallback = new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
if (newState == BottomSheetBehavior.STATE_HIDDEN) {
dismiss();
}
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
}
};
and then set it
@Override
public void setupDialog(Dialog dialog, int style) {
super.setupDialog(dialog, style);
View contentView = View.inflate(getContext(), R.layout.content_register, null);
ButterKnife.bind(this, contentView);
dialog.setContentView(contentView);
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) ((View) contentView.getParent()).getLayoutParams();
CoordinatorLayout.Behavior behavior = params.getBehavior();
if( behavior != null && behavior instanceof BottomSheetBehavior ) {
((BottomSheetBehavior) behavior).setBottomSheetCallback(mBottomSheetBehaviorCallback);
((BottomSheetBehavior) behavior).setState(BottomSheetBehavior.STATE_EXPANDED);
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With