底部菜单下拉行为

6

我成功地在Fragment中创建了一个ListView。我也成功地加载了底部弹出窗口。

  1. 如果我点击列表中的第一项"One",则底部弹出窗口会出现。

  2. 如果我在底部弹出窗口外面单击,则底部弹出窗口会消失。

  3. 如果我再次点击列表中的第二项"Two",底部弹出窗口会再次出现。

  4. 如果我再次执行1),然后向下滑动底部弹出窗口并尝试执行3),屏幕仍然会变成灰色,就好像底部弹出窗口仍然显示但不可见...???

我该如何解决这个问题?

以下是我的代码。

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>

我猜你的BottomSheet Java对象是一个自定义实现,有你自己的自定义方法,你也会展示那段代码,因为显然在你展示的代码中你没有改变任何地方的bottomSheet文本。 - marcos E.
我不需要更改底部表格中的文本 - 即那是静态文本。我没有BottomSheet.java文件 - 我需要吗?如果我按原样编译应用程序并运行它,它正好做我想要的事情...当然除了上面描述的问题。 - Ibrahim Fawaz
1个回答

4

我从这篇文章中找到了解决方法,你需要在你的片段/活动中使用一个带有行为“android.support.design.widget.BottomSheetBehavior”的CoordinatorLayout作为根布局。它的工作方式是扩展BottomSheetDialogFragment并像这样从你的活动/片段中显示它。

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

}


除了我的情况是使用的是 fragmentManager 而不是 getSupportFragmentManager!但感谢提供的链接 - 它解决了我的问题! - Ibrahim Fawaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接