Reputation: 1724
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>
Upvotes: 12
Views: 11430
Reputation: 928
I had the exact same error. In my ugly case it was Huawei device specific. My activity and dialog themes already had the option:
<item name="android:windowSoftInputMode">adjustResize</item>
The only thing required was:
<item name="android:windowIsFloating">false</item>
So the final bottom sheet dialog style is:
<style name="CustomBottomSheetDialogTheme" parent="Theme.AppCompat.Light.Dialog">
<item name="android:windowBackground">@null</item>
<item name="android:windowIsFloating">false</item>
<item name="android:windowSoftInputMode">adjustResize</item>
</style>
I hope it helps.
Upvotes: 0
Reputation: 309
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);
}
}
Upvotes: 1
Reputation: 709
Please try adding below line in your manifest activity
android:windowSoftInputMode="adjustResize"
For example:
<activity
android:name=".view.activities.StudentDetailActivity"
android:windowSoftInputMode="adjustResize" />
Your dialog size will be adjusted, whenever keyboard gets up. Hope it helps
Upvotes: 0