Scrollview not scrolling in Android bottomsheet
AndroidAndroid LayoutBottom SheetAndroid Problem Overview
I tried the new BottomSheet
in Android support. Inside the BottomSheet
I have put a TextView
and a ScrollView
. The BottomSheet
showing just fine, the only problem I found is that the ScrollView
in the BottomSheet
is not scrolling. Every time I try to scroll, either the layout in main activity that scroll or the BottomSheet
changing state from collapse to expand.
This is snippet of my Activity Class code:
private BottomSheetBehavior behavior;
View bottomSheet;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setTextViewOnClickListener(this, findViewById(R.id.parentLayout));
CoordinatorLayout coordinatorLayout = (CoordinatorLayout) findViewById(R.id.main_content);
// The View with the BottomSheetBehavior
bottomSheet = coordinatorLayout.findViewById(R.id.bottom_sheet);
behavior = BottomSheetBehavior.from(bottomSheet);
behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
// React to state change
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
// React to dragging events
}
});
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.tv1:
setTextViewHeader("Header1");
setTextViewContent("Long_Text_1");
break;
case R.id.tv2:
setTextViewHeader("Header2");
setTextViewContent("Long_Text_2");
break;
case R.id.tv3:
setTextViewHeader("Header3");
setTextViewContent("Long_Text_3");
break;
default:
break;
}
behavior.setPeekHeight(100);
behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
behavior.setHideable(true);
bottomSheet.requestLayout();
}
This is my Layout XML:
<?xml version="1.0" encoding="utf-8"?>
<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:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="com.rapidgrowsolutions.android.MainActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tv1"
style="@style/LightRow"
android:text="some_long_text_here" />
<TextView
android:id="@+id/tv2"
style="@style/DarkRow"
android:text="another_long_text_here" />
<TextView
android:id="@+id/tv3"
style="@style/LightRow"
android:text="another_long_text_here" />
</LinearLayout>
<android.support.v4.widget.NestedScrollView
android:id="@+id/bottom_sheet"
android:layout_width="match_parent"
android:layout_height="250dp"
app:behavior_hideable="true"
android:fillViewport="true"
app:layout_behavior="android.support.design.widget.BottomSheetBehavior">
<android.support.v7.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FF7733"
android:orientation="vertical">
<TextView
android:id="@+id/tvID1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="HEADER"
android:textAppearance="?android:attr/textAppearanceMedium" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="9"
android:background="#ffb773"
android:fillViewport="true">
<TextView
android:id="@+id/tvID2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#3377ff"
android:textAppearance="?android:attr/textAppearanceSmall" />
</ScrollView>
</android.support.v7.widget.LinearLayoutCompat>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
Android Solutions
Solution 1 - Android
Hope you figured out this by now, but change View bottomSheet
to NestedScrollView bottomSheet
.
Solution 2 - Android
I solved the issue by doing below things -
-
First: don't use ScrollView when you are using CoordinatorLayout instead user NestedScrollView its works much better with CoordinatorLayout.
-
Second: put a blank view with
android:layout_height
at the bottom, but inside you NestedScrollView eg -<LinearLayout android:layout_height="wrap_content" android:layout_width="match_parent" android:orientation="vertical"> <ImageView android:background="@drawable/username" android:id="@+id/userImage_info_search" android:layout_gravity="center" android:layout_height="100dp" android:layout_margin="20dp" android:layout_width="100dp" /> <LinearLayout android:layout_height="wrap_content" android:layout_width="match_parent"> <View android:background="@android:color/black" android:layout_height="1dp" android:layout_width="match_parent"></View> </LinearLayout> <LinearLayout android:layout_height="wrap_content" android:layout_width="match_parent" android:orientation="horizontal" android:padding="10dp" android:weightSum="3"> <TextView style="@style/Bottomsheetstyle" android:id="@+id/txtNamelabel_info_search" android:layout_gravity="center" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_weight="1" android:layout_width="0dp" android:text="Name" /> <TextView style="@style/Bottomsheetstyle" android:id="@+id/txtName_info_search" android:layout_gravity="center" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_weight="2" android:layout_width="0dp" android:text="" /> </LinearLayout> <LinearLayout android:layout_height="wrap_content" android:layout_width="match_parent"> <View android:background="@android:color/black" android:layout_height="1dp" android:layout_width="match_parent"></View> </LinearLayout> <LinearLayout android:layout_height="wrap_content" android:layout_width="match_parent" android:orientation="horizontal" android:padding="10dp" android:weightSum="3"> <TextView style="@style/Bottomsheetstyle" android:layout_gravity="center" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_weight="1" android:layout_width="0dp" android:text="Number" /> <LinearLayout android:layout_height="wrap_content" android:layout_weight="2" android:layout_width="0dp" android:orientation="horizontal"> <TextView style="@style/Bottomsheetstyle" android:gravity="center_vertical" android:id="@+id/txtNumber_info_search" android:layout_gravity="center_vertical" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_weight="1.4" android:layout_width="0dp" android:text="+XX (XXX) XXX-XXXX" /> <ImageView android:background="@drawable/call_save" android:id="@+id/call_info_search" android:layout_height="wrap_content" android:layout_weight="0.3" android:layout_width="0dp" /> <View android:layout_gravity="center" android:layout_height="5dp" android:layout_width="5dp"></View> <ImageView android:background="@drawable/comment_save" android:id="@+id/sms_info_search" android:layout_height="wrap_content" android:layout_weight="0.3" android:layout_width="0dp" /> </LinearLayout> </LinearLayout> <LinearLayout android:layout_height="wrap_content" android:layout_width="match_parent"> <View android:background="@android:color/black" android:layout_height="1dp" android:layout_width="match_parent"></View> </LinearLayout> <LinearLayout android:layout_height="wrap_content" android:layout_width="match_parent" android:orientation="horizontal" android:padding="10dp" android:weightSum="3"> <TextView style="@style/Bottomsheetstyle" android:layout_gravity="center" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_weight="1" android:layout_width="0dp" android:text="Email" /> <TextView style="@style/Bottomsheetstyle" android:id="@+id/txtEmail_info_search" android:layout_gravity="center" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_weight="2" android:layout_width="0dp" android:text="" /> </LinearLayout> <LinearLayout android:layout_height="wrap_content" android:layout_width="match_parent"> <View android:background="@android:color/black" android:layout_height="1dp" android:layout_width="match_parent"></View> </LinearLayout> <View android:background="@android:color/transparent" android:layout_height="@dimen/somedp" android:layout_width="match_parent" />
Solution 3 - Android
Addition to the answer of "jobbert":
If you always return "false" it could happen that the bottomsheet is not working at all. This happend to me, when I also use a viewpager inside the bottom-sheets coordinatorlayout. To actually fix it, one needs to check whether the touch was inside the nestedscrollview or not. This can be calculated easily and leads to the most general solution:
override fun onInterceptTouchEvent(parent: CoordinatorLayout, child: V, event: MotionEvent): Boolean {
val nested = child.findViewById<NestedScrollView>(R.id.nested) //NestedScrollView
var x = event.x
var y = event.y
val position = IntArray(2)
nested.getLocationOnScreen(position)
var nestedX = position[0]
var nestedY = position[1]
var boundLeft = nestedX
var boundRight = nestedX + nested.width
var boundTop = nestedY
var boundBottom = nestedY + nested.height
if ((x > boundLeft && x < boundRight && y > boundTop && y < boundBottom) || event.action == MotionEvent.ACTION_CANCEL) {
//Touched inside of the scrollview-> pass the touch event to the scrollview
return false
}
//touched outside, use the parents computation to make the bottomsheet work
return super.onInterceptTouchEvent(parent, child, event)
}
Solution 4 - Android
Use below custom bottom sheet behaviour
public class CustomBottomSheetBehaviour<V extends View> extends BottomSheetBehavior {
public CustomBottomSheetBehaviour() {
super();
}
public CustomBottomSheetBehaviour(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(CoordinatorLayout parent, View child, MotionEvent event) {
return false;
}
}
Solution 5 - Android
@Aghil C M answer worked, but translated it to Kotlin as auto translate didn't do the trick.
class CustomBottomSheetBehaviour<V : View> : BottomSheetBehavior<V> {
constructor() : super()
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
override fun onInterceptTouchEvent(parent: CoordinatorLayout?, child: V, event: MotionEvent?): Boolean {
return false
}
}
Solution 6 - Android
this worked for me try using first scrollView and then linear or relative layout and use also use nested scroll view above it
<RelativeLayout
android:id="@+id/bottom_sheet"
android:layout_width="match_parent"
android:layout_height="250dp"
app:behavior_hideable="true"
app:elevation="4dp"
android:background="@color/colorPrimaryDark"
app:layout_behavior="android.support.design.widget.BottomSheetBehavior"
android:clipToPadding="true">
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
android:text="oh hello this is dummy data"
android:textColor="#FFFFFF"
android:textSize="20sp" />
<ImageView
android:id="@+id/imageView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:srcCompat="@mipmap/ic_launcher" />
<ImageView
android:id="@+id/"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:srcCompat="@mipmap/ic_launcher" />
<ImageView
android:id="@+id/"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:srcCompat="@mipmap/ic_launcher" />
<ImageView
android:id="@+id/"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:srcCompat="@mipmap/ic_launcher" />
<ImageView
android:id="@+id/"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:srcCompat="@mipmap/ic_launcher" />
</LinearLayout>
</ScrollView>
</RelativeLayout>