You*_* Qi 15 android bottom-sheet
我BottomSheet使用这种DialogFragment方法实现了.我有一个TabLayout和ViewPager在BottomSheet.该ViewPager托管2页,每一个膨胀RecyclerView.第一个(咖啡标签)RecyclerView滚动很好.我现在遇到的问题是,对于第二个(Milk选项卡),滚动不起作用.知道我该如何解决这个问题?谢谢!
您可以使用我在这里创建的演示项目进行测试:https:// github.com/choongyouqi/ bottomsheet`
将此视图用作根视图:
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.LinearLayout;
public class DisallowInterceptView extends LinearLayout {
public DisallowInterceptView(Context context) {
super(context);
requestDisallowInterceptTouchEvent(true);
}
public DisallowInterceptView(Context context, AttributeSet attrs) {
super(context, attrs);
requestDisallowInterceptTouchEvent(true);
}
public DisallowInterceptView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
requestDisallowInterceptTouchEvent(true);
}
public boolean dispatchTouchEvent(MotionEvent ev) {
getParent().requestDisallowInterceptTouchEvent(true);
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
requestDisallowInterceptTouchEvent(false);
break;
}
return super.onTouchEvent(event);
}
}
Run Code Online (Sandbox Code Playgroud)
然后在用于 bottmSheet 的布局中:
<?xml version="1.0" encoding="utf-8"?>
<com.your.package.DisallowInterceptView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:maxHeight="400dp"
android:minHeight="300dp"
android:orientation="vertical"
>
...
</LinearLayout>
</com.your.package.DisallowInterceptView>
Run Code Online (Sandbox Code Playgroud)
正如R.Zagórski所提到的,我在这里描述了这种滚动行为的原因,即BottomSheetBehavior只支持一个滚动子项.然而,这个答案并没有集中在底部对话框上.
因此 - 就像R.Zagórski一样 - 我扩展了我自己的库,克服了这个限制.从0.0.3开始,支持底部对话框!您可以在此处找到库和示例应用程序:https: //github.com/laenger/ViewPagerBottomSheet
要在项目中使用,只需将maven repo url添加到build.gradle:
repositories {
maven { url "https://raw.github.com/laenger/maven-releases/master/releases" }
}
Run Code Online (Sandbox Code Playgroud)
将库添加到依赖项:
dependencies {
compile "biz.laenger.android:vpbs:0.0.3"
}
Run Code Online (Sandbox Code Playgroud)
使用ViewPagerBottomSheetDialogFragment作为对话片段超类.然后在内容视图中设置任何ViewPager:
public class DialogFragment extends ViewPagerBottomSheetDialogFragment {
@Override
public void setupDialog(Dialog dialog, int style) {
super.setupDialog(dialog, style);
final View contentView = View.inflate(getContext(), R.layout.dialog_bottom_sheet, null);
final ViewPager viewPager = (ViewPager) contentView.findViewById(R.id.viewpager);
// ...
BottomSheetUtils.setupViewPager(viewPager);
dialog.setContentView(contentView);
}
}
Run Code Online (Sandbox Code Playgroud)
在尝试在 StackOverflow 上查找问题时,我发现了这个线程。它描述了错误(至少我是这么看的),BottomSheetBehaviour它只适用于它找到的第一个可滚动子项。它还提出了不同的CoordinatorLayout.Behavior建议和发布在这里的用法。
但是,您的情况有点不同。BottomSheetDialogFragment用来。这就是提供的解决方案不起作用的地方。但是,我设法克服了这个问题。已发布的存储库,您的项目被修改为可以在其中工作。它使用ViewPagerBottomSheetBehavior前面提到的库中的 。
基本上,进行了以下更改:
StatisticFragment扩展ViewPagerBottomSheetDialogFragment而不是BottomSheetDialogFragmentStatisticsFragment更改了onCreateDialog 函数:
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
ViewPagerBottomSheetDialog dialog = (ViewPagerBottomSheetDialog) super.onCreateDialog(savedInstanceState);
View rootView = View.inflate(getContext(), R.layout.sheet_main, null);
viewPager = (ViewPager) rootView.findViewById(R.id.viewpager);
tabLayout = (TabLayout) rootView.findViewById(R.id.tabs);
dialog.setContentView(rootView);
mBehavior = ViewPagerBottomSheetBehavior.from((View) rootView.getParent());
mBehavior.setPeekHeight(400);
if (viewPager != null && tabLayout != null) {
initViewPager();
}
return dialog;
}
Run Code Online (Sandbox Code Playgroud)在 上调用以下函数ViewPager:
BottomSheetUtils.setupViewPager(viewPager);
Run Code Online (Sandbox Code Playgroud)这就是全部。该项目有效。
以下是在幕后完成的:
BottomSheetDialogFragment 只有一种方法:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new BottomSheetDialog(getContext(), getTheme());
}
Run Code Online (Sandbox Code Playgroud)
有BottomSheetDialog返回。但是,它的静态定义行为设置为BottomSheetBehavior。需要的是覆盖ViewPagerBottomSheetDialogFragment以返回ViewPagerBottomSheetDialog其CoordinatorLayout.Behavior设置为ViewPagerBottomSheetBehavior. 此外,BottomSheet需要覆盖自定义以适应ViewPagerBottomSheetBehavior.
| 归档时间: |
|
| 查看次数: |
9814 次 |
| 最近记录: |