Список лет DatePicker не прокручивается при вложении в BottomSheetDialogFragment - PullRequest
0 голосов
/ 03 августа 2020

У меня есть DatePicker в BottomSheetDialogFragment, и когда я нажимаю на «год», чтобы отобразить список года, список не прокручивается, и я не могу прокручивать назад или вперед. Событие прокрутки улавливается bottomSheet, и прокрутка вниз закроет фрагмент. Любая идея, как я могу позволить datePicker получить событие прокрутки? Thx

введите здесь описание изображения

Макет *. xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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/bottomSheetContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <View
        android:id="@+id/line2"
        android:layout_width="24dp"
        android:layout_height="3dp"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="17dp"
        android:background="@drawable/slider_black_background"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="@+id/perl_ic"
        app:layout_constraintStart_toStartOf="@+id/perl_ic"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.core.widget.NestedScrollView
        android:id="@+id/scroll_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="35dp">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingBottom="@dimen/baseline_grid_3x">

            <LinearLayout
                android:id="@+id/from_to_selector"
                android:layout_width="wrap_content"
                android:layout_height="38dp"
                android:layout_marginStart="@dimen/baseline_grid_2x"
                android:layout_marginTop="@dimen/baseline_grid_2x"
                android:layout_marginEnd="@dimen/baseline_grid_2x"
                android:background="@drawable/background_filter_btn_container"
                android:baselineAligned="false"
                android:orientation="horizontal"
                android:padding="@dimen/baseline_grid_0.5x"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@id/line">

                <RelativeLayout
                    android:id="@+id/depart_selection"
                    style="@style/Widget.AppCompat.Button.Borderless"
                    android:layout_width="117dp"
                    android:layout_height="match_parent"
                    android:layout_gravity="center_vertical"
                    android:layout_marginEnd="@dimen/baseline_grid_2x"
                    android:layout_weight="1"
                    android:background="@drawable/background_filter_btn"
                    android:minHeight="0dp">

                    <TextView
                        android:id="@+id/depart_selection_text"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginStart="@dimen/spacing_small"
                        android:textAllCaps="false"
                        style="@style/TextAppearance.Button"
                        android:textColor="@color/filter_button_text_selector"
                        android:textSize="13sp"
                        tools:text="Ab" />

                </RelativeLayout>

                <RelativeLayout
                    android:id="@+id/arrive_selection"
                    style="@style/Widget.AppCompat.Button.Borderless"
                    android:layout_width="117dp"
                    android:layout_height="match_parent"
                    android:layout_gravity="center_vertical"
                    android:layout_weight="1"
                    android:background="@drawable/background_filter_btn"
                    android:minHeight="0dp">

                    <TextView
                        android:id="@+id/arrive_selection_text"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginStart="@dimen/spacing_small"
                        android:textAllCaps="false"
                        style="@style/TextAppearance.Button"
                        android:textColor="@color/filter_button_text_selector"
                        android:textSize="13sp"
                        tools:text="An" />

                </RelativeLayout>

            </LinearLayout>

            <DatePicker
                android:id="@+id/date_picker"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/baseline_grid_2.5x"
                android:theme="@style/datepicker"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/from_to_selector" />

            <Button
                android:id="@+id/finish_btn"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/baseline_grid_2x"
                android:layout_marginTop="@dimen/baseline_grid_1.5x"
                android:layout_marginEnd="@dimen/baseline_grid_2x"
                android:background="@color/colorPrimary"
                android:textColor="@color/cobalt_blue"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/date_picker"
                tools:text="Fertig" />

        </androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.core.widget.NestedScrollView>
</FrameLayout>

Фрагмент:

class CalendarBottomSheetFragment : RoundedBottomSheetDialogFragment() {

    private val strings: Strings
        get() = Strings(requireContext())

    companion object {
        val TAG: String = CalendarBottomSheetFragment::class.java.simpleName
        const val BIRTHDAY_RESULT_CODE = 2734
        const val BIRTHDAY_RESULT_KEY = "BIRTHDAY_RESULT_KEY"

        fun newInstance(selectedDate: Date): CalendarBottomSheetFragment {
            val args = Bundle()
            args.putSerializable(BIRTHDAY_RESULT_KEY, selectedDate)
            val fragment = CalendarBottomSheetFragment()
            fragment.arguments = args
            return fragment
        }
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.calendar_bottom_sheet, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        from_to_selector.visibility = View.GONE

        finish_btn.text = strings.doneButtonText
        finish_btn.setOnClickListener(getFinishClickListener())

        date_picker.setOnTouchListener { view, motionEvent ->
            if (motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) {
                val p = view.parent
                if (p != null)
                    p.requestDisallowInterceptTouchEvent(true);
            }
            false
        }

        dialog?.setOnShowListener {
            val dialog = it as BottomSheetDialog
            val bottomSheet = dialog.findViewById<View>(R.id.design_bottom_sheet) as FrameLayout?
            val bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet!!)
            bottomSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED
            bottomSheetBehavior.skipCollapsed = true
        }

        updateDatePickerWithPassedDate()
    }

    private fun updateDatePickerWithPassedDate() {
        val date = arguments?.getSerializable(BIRTHDAY_RESULT_KEY)
        // Choose time zone in which you want to interpret your Date
        val cal = Calendar.getInstance(TimeZone.getTimeZone("Europe/Paris"))
        cal.time = date as Date?
        val year = cal.get(Calendar.YEAR)
        val month = cal.get(Calendar.MONTH)
        val day = cal.get(Calendar.DAY_OF_MONTH)

        date_picker.updateDate(year, month, day)
    }

    private fun getFinishClickListener(): View.OnClickListener {
        return View.OnClickListener {
            val intent = Intent()
            intent.putExtra(BIRTHDAY_RESULT_KEY, date_picker.getDate)
            val fragment = activity?.supportFragmentManager?.findFragmentByTag(CoTravelerFormFragment.TAG)
            fragment?.onActivityResult(CoTravelerFormFragment.BIRTHDAY_REQUEST_CODE, BIRTHDAY_RESULT_CODE, intent)
            dismiss()
        }
    }

    private class Strings(context: Context) {

        val doneButtonText: String = context.getString(DialectUtils.getStringVariant(
                R.string.global_done,
                R.string.dialect_global_done
        ))
    }
}
...