新しいBottomSheet
in Android support。を試しました。BottomSheet
の中にTextView
とScrollView
を入れました。 BottomSheet
はうまく表示されますが、私が見つけた唯一の問題は、ScrollView
の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
。
「jobbert」の答えへの追加:
常に「false」を返す場合、ボトムシートがまったく機能していない可能性があります。これは、ボトムシートコーディネーターレイアウト内でビューページャーも使用したときに起こりました。実際に修正するには、タッチがネストされたスクロールビュー内にあるかどうかを確認する必要があります。これは簡単に計算でき、最も一般的なソリューションにつながります。
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)
}
以下のカスタムボトムシートの動作を使用する
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;
}
}
私は以下のことを行うことで問題を解決しました-
最初: CoordinatorLayoutを使用している場合、ユーザーNestedScrollViewの代わりにScrollViewを使用しないでください。
2番目:下部に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" />
これは私にとってはうまくいきました。最初に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>
@Aghil C Mの回答は機能しましたが、自動翻訳ではうまくいかなかったため、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
}
}