底部 Sheet 向下滑动行为

Bottom Sheet Swipe Down Behavior

我已经在 Fragment 中成功创建了 ListView。从列表中我也成功地加载了底部 sheet。

  1. 如果我点击列表中的第一项 "One",底部 sheet 就会出现。

  2. 如果我在底部 sheet 之外点击,底部 sheet 就会消失。

  3. 如果我点击列表中的第二个项目 "Two" 底部 sheet 再次出现。

  4. 如果我再次执行 1) 然后向下滑动底部 sheet 并尝试执行 3),屏幕保持灰色,就好像底部 sheet仍然显示但不可见... ???

我该如何纠正?

下面是我的代码。

SecondFragment.java:

/**
 * A simple {@link Fragment} subclass.
 */
public class SecondFragment extends Fragment {
    public SecondFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_second, container, false);

        String[] faList = { 
                "One",
                "Two",
        };

        ListView listView = (ListView) view.findViewById(R.id.listFa);

        ArrayAdapter<String> listviewAdapter = new ArrayAdapter<String>(
                getActivity(),
                android.R.layout.simple_list_item_1,
                faList
        );

        listView.setAdapter(listviewAdapter);

        // Inflate the layout for this fragment
        // return view;


        final BottomSheetDialog bottomsheet = new BottomSheetDialog(this.getContext());
        View bottomSheetView = inflater.inflate(R.layout.bottom_sheet, null);
        bottomsheet.setContentView(bottomSheetView);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

                bottomsheet.show();
            }
        });
        return view;
    }
}

fragment_second.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.ifavaz.talker.SecondFragment">

    <!-- TODO: Update blank fragment layout -->
    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/listFa" />
</FrameLayout>

bottom_sheet.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="right"
    app:layout_behavior="android.support.design.widget.BottomSheetBehavior">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="30dp">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="horizontal"
                android:layout_marginTop="30dp">

                <FrameLayout
                    android:layout_width="280dp"
                    android:layout_height="wrap_content">

                    <TextView
                        android:id="@+id/textView2"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="text is my text is my text text is my text is my text text is my text is my text text is my text is my text "
                        android:textSize="18sp"
                        android:textAlignment="textStart"
                        android:paddingRight="30dp" />
                </FrameLayout>

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"

                android:orientation="horizontal"
                android:layout_marginTop="30dp">

                <FrameLayout
                    android:layout_width="280dp"
                    android:layout_height="wrap_content">

                    <TextView
                        android:id="@+id/textView3"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="text is my text is my text text is my text is my text text is my text is my text text is my text is my text "
                        android:textSize="18sp"
                        android:paddingRight="30dp" />
                </FrameLayout>

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="horizontal"
                android:layout_marginTop="30dp">

                <FrameLayout
                    android:layout_width="280dp"
                    android:layout_height="wrap_content">

                    <TextView
                        android:id="@+id/textView2"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="text is my text is my text text is my text is my text text is my text is my text text is my text is my text "
                        android:textSize="18sp"
                        android:textAlignment="textStart"
                        android:paddingRight="30dp" />
                </FrameLayout>

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="horizontal"
                android:layout_marginTop="30dp">

                <FrameLayout
                    android:layout_width="280dp"
                    android:layout_height="wrap_content">

                    <TextView
                        android:id="@+id/textView2"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="text is my text is my text text is my text is my text text is my text is my text text is my text is my text "
                        android:textSize="18sp"
                        android:textAlignment="textStart"
                        android:paddingRight="30dp" />
                </FrameLayout>
            </LinearLayout>
        </LinearLayout>
    </ScrollView>
</FrameLayout>

我从这个 post 开始工作,您将需要作为片段内的根布局 / activity 具有行为的 CoordinatorLayout --> "android.support.design.widget.BottomSheetBehavior" ,它的工作方式是扩展 BottomSheetDialogFragment 并从你的 activity / 片段中显示它,就像这样

    TutsPlusBottomSheetDialogFragment fragment = new TutsPlusBottomSheetDialogFragment();
    fragment.show(getSupportFragmentManager(),bottomSheetDialogFragment.getTag());

这个自定义DialogFragment的实现是:

    public class TutsPlusBottomSheetDialogFragment extends BottomSheetDialogFragment {

        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) {
        }
    };

    @Override
    public void setupDialog(Dialog dialog, int style) {
        super.setupDialog(dialog, style);
        View contentView = View.inflate(getContext(), R.layout.bottom_sheet, null);
        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);
        }
    }

}