Кнопка с плавающим действием не отображается в свернутом состоянии нижнего листа - PullRequest
6 голосов
/ 11 января 2020

У меня есть BottomSheetFragment с кнопками recyclerview и fab. У меня проблема с отображением Floating action button в BottomSheetBehavior.STATE_COLLAPSED. Кнопка Fab появляется, как только я раскрываю нижний лист в полноэкранный режим, я попробовал несколько способов, но ни один из них не работает.

Я попробовал другой вариант потрясающего отображения в макете, чтобы сделать его видимым, но пока не повезло.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    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/topBarBottomSheet"
    android:clipToPadding="true"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    >

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/topBarBottomSheet">
        <include layout="@layout/progressbar_framelayout" />

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recycleviewGallery"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clipToPadding="false"
            android:paddingTop="@dimen/list_item_spacing_half"
            android:paddingBottom="@dimen/list_item_spacing_half"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            tools:listitem="@layout/recycler_view_item_3"
            tools:spanCount="3"
            tools:layoutManager="GridLayoutManager" />



    </FrameLayout>
    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fabBottomSheet"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        app:backgroundTint="@color/greenElaxer"
        app:fabSize="normal"
        app:srcCompat="@drawable/ic_check"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"

        android:overScrollMode="always"

         >

    </com.google.android.material.floatingactionbutton.FloatingActionButton>


</RelativeLayout>

BottomSheetFragment

public class BottomSheet extends BottomSheetDialogFragment {

    FloatingActionButton fab;
    RecyclerView recyclerView;
    // TODO: Customize parameters
    public static BottomSheet newInstance() {
        /*final Bundle args = new Bundle();
        args.putInt(ARG_ITEM_COUNT, itemCount);
        fragment.setArguments(args);*/

        return new BottomSheet();
    }

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

        return inflater.inflate(R.layout.fragment_bottemsheet_list_dialog, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        recyclerView = view.findViewById(R.id.recycleviewGallery);
        fab = view.findViewById(R.id.fabBottomSheet);     
      BottomSheetAdapter bottomSheetAdapter = new BottomSheetAdapter();
      GridLayoutManager gridLayoutManager=new GridLayoutManager(getActivity(),2);
        recyclerView.setLayoutManager(gridLayoutManager);
        recyclerView.setHasFixedSize(true);
        recyclerView.setAdapter(bottomSheetAdapter);
    }


    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        BottomSheetDialog dialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState);
        dialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                //Get the BottomSheetBehavior
                BottomSheetDialog d = (BottomSheetDialog) dialog;
                FrameLayout bottomSheet = d.findViewById(com.google.android.material.R.id.design_bottom_sheet);
                if (bottomSheet != null) {
                    bottomSheet.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
                    bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);
                    bottomSheet.setMinimumHeight(350);
                    bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
                        @Override
                        public void onStateChanged(@NonNull View view, int i) {
                            switch (i){
                                case BottomSheetBehavior.STATE_COLLAPSED:
                                    Log.d(TAG,"Collapsed");

                                    break;
                                case BottomSheetBehavior.STATE_DRAGGING:
                                    Log.d(TAG,"Dragging");

                                    break;
                                case BottomSheetBehavior.STATE_EXPANDED:
                                    Log.d(TAG,"Expanded");

                                    break;
                                case BottomSheetBehavior.STATE_HALF_EXPANDED:
                                    Log.d(TAG,"Half Expanded");
                                    break;
                                case BottomSheetBehavior.STATE_HIDDEN:
                                    Log.d(TAG,"Hidden");
                                    dismiss();
                                    break;
                                case BottomSheetBehavior.STATE_SETTLING:
                                    Log.d(TAG,"Settling");
                                    break;

                            }
                        }

                        @Override
                        public void onSlide(@NonNull View view, float v) {

                        }
                    });
                }
            }
        });

        return dialog;
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        final Fragment parent = getParentFragment();
        Log.d(TAG,"Parent = "+parent+" Context "+context);
        if (parent != null) {
            mListener = (Listener) parent;
        } else {
            mListener = (Listener) context;
        }
    }

    @Override
    public void onDetach() {
        mListener = null;
        super.onDetach();
    }


}

Всякий раз, когда я сворачивал нижний лист, потрясающая кнопка также опускалась с нижним листом. Мне нужно, чтобы моя потрясающая кнопка придерживалась того же места, независимо от того, расширяюсь я или свернутый нижний лист. Заранее спасибо.

Мне нужно придерживаться того же макета (Относительный макет)

1 Ответ

0 голосов
/ 03 февраля 2020

Вы не можете заставить элемент пользовательского интерфейса из определенного фрагмента оставаться при выходе из этого фрагмента. Если нижняя таблица свернута, все ее элементы пользовательского интерфейса свернуты. Вы не можете сделать что-то на месте.

Вы можете написать дубликат, который будет отображаться после закрытия нижней таблицы в нижележащем фрагменте.

Например, у меня есть этот код в моей нижней таблице, чтобы выйдите из диалогового окна нижнего листа.

nextButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mBottomSheetDialog.dismiss();
            mTimePickerDialogController.show(0, 0, makeTimePickerDialogTag());
        }});

Когда вы закрываете нижний лист, вы можете использовать следующий код для отображения или исчезновения потрясающего элемента в нижележащем фрагменте.

mFloatingActionButton.hide();
mFloatingActionButton.show();

Редактировать: A лучшее решение для обработки второго потрясающего.

BottomSheetBehavior sheetBehavior;
    sheetBehavior = BottomSheetBehavior.from(yourBottomSheet);

    sheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {
            switch (newState) {
                case BottomSheetBehavior.STATE_HIDDEN:
                    mFloatingActionButton.show();
                case BottomSheetBehavior.STATE_EXPANDED: {
                    mFloatingActionButton.hide();
                }
                break;
                case BottomSheetBehavior.STATE_COLLAPSED: {
                    mFloatingActionButton.show();
                }
            }
        }
...