Ответ 1
Надеюсь, вы разобрались в этом, но измените View bottomSheet
на NestedScrollView bottomSheet
.
Я попробовал новый BottomSheet
в поддержку Android. Внутри BottomSheet
я поместил TextView
и ScrollView
. BottomSheet
показывает очень хорошо, единственная проблема, которую я обнаружил, заключается в том, что ScrollView
в BottomSheet
не прокручивается. Каждый раз, когда я пытаюсь прокрутить, либо BottomSheet
макет в основном BottomSheet
изменяем состояние BottomSheet
от свертывания до BottomSheet
.
Это фрагмент моего кода класса активности:
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();
}
Это мой макет 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>
Надеюсь, вы разобрались в этом, но измените View bottomSheet
на NestedScrollView bottomSheet
.
Использовать ниже пользовательское поведение нижнего листа
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;
}
}
Я решил проблему, выполнив ниже вещи -
Во-первых: не использовать ScrollView при использовании CoordinatorLayout, а вместо этого пользователь NestedScrollView работает намного лучше с CoordinatorLayout.
Вторые: помещают пустой вид с android:layout_height
внизу, но внутри вас NestedScrollView
например -
<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" />
@Aghil CM ответ сработал, но перевел его на Kotlin, так как автоматический перевод не сработал.
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
}
}
это сработало для меня, попробуйте использовать сначала scrollView, а затем линейный или относительный макет и использовать также использовать вложенный вид прокрутки над ним
<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>
Дополнение к ответу "Jobbert":
Если вы всегда возвращаете "false", может случиться так, что нижняя таблица вообще не работает. Это случилось со мной, когда я также использую панель просмотра внутри раскладки координаторов нижних листов. Чтобы на самом деле это исправить, нужно проверить, было ли прикосновение внутри nestedscrollview или нет. Это может быть легко вычислено и приводит к наиболее общему решению:
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)
}