Сдвиньте нижний лист - PullRequest
       26

Сдвиньте нижний лист

0 голосов
/ 22 января 2020

Я пытаюсь сделать нижний лист, как показано на фотографии ниже (первый показывает, что я пытаюсь сделать, а второй - что я имею сейчас). Я пробовал разные способы и посмотрел вокруг SO и в Интернете, чтобы увидеть, есть ли какая-либо документация по этому вопросу, и, кажется, не так много. Код, который я имею ниже, является самым близким, я могу сделать это подобным, но что-то кажется неправильным. Буду признателен за любую помощь с кодом для создания этого или любого другого полезного материала.

enter image description here

enter image description here

enter image description here

MainActivity.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
            val sheet = DemoBottomSheetFragment()
            sheet.show(supportFragmentManager, "DemoBottomSheetFragment")
    }
}

class DemoBottomSheetFragment : SuperBottomSheetFragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        super.onCreateView(inflater, container, savedInstanceState)
        return inflater.inflate(R.layout.fragment_demo_sheet, container, false)
    }

    override fun getCornerRadius() = context!!.resources.getDimension(R.dimen.demo_sheet_rounded_corner)

}

activity_main

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</androidx.constraintlayout.widget.ConstraintLayout>

фрагмент_demo_sheet

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
    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="wrap_content">

    <TextView
        android:id="@+id/show_sheet"
        android:layout_width="wrap_content"
        android:layout_height="1000dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

Ответы [ 2 ]

1 голос
/ 22 января 2020

Вы должны сделать это следующим образом:

Activity_main. xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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"
    android:animateLayoutChanges="true"
    tools:context=".activites.MainActivity">

    <include layout="@layout/content_main" />

    <include layout="@layout/bottom_sheet" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

content_main. xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btnFeedback"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:paddingHorizontal="30dp"
        android:text="Feedback" />

</RelativeLayout>

bottom_sheet. xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/bottom_sheet"
    android:layout_width="match_parent"
    android:layout_height="444dp"
    android:background="#F0F0F1"
    android:descendantFocusability="beforeDescendants"
    android:focusableInTouchMode="true"
    android:orientation="vertical"
    android:padding="10dp"
    app:behavior_hideable="true"
    app:behavior_peekHeight="120dp"
    app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">

    <ImageView
    android:id="@+id/imageClose"
    android:layout_width="34dp"
    android:layout_height="34dp"
    android:layout_gravity="right"
    android:src="@drawable/btn_close" />

    //Whatever controls you want to show in bottomsheet should be put here

</LinearLayout>

MainActivity.kt

class MainActivity : AppCompatActivity(), View.OnClickListener {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }

    private fun init() {

        btnFeedback.setOnClickListener(this)

        val bottomSheetBehavior = BottomSheetBehavior.from(bottom_sheet)
        bottomSheetBehavior.setBottomSheetCallback(object :
            BottomSheetBehavior.BottomSheetCallback() {
            override fun onStateChanged(bottomSheet: View, newState: Int) {
                if (newState == BottomSheetBehavior.STATE_DRAGGING) {
                    bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED)
                }
            }

            override fun onSlide(bottomSheet: View, slideOffset: Float) {
            }
        })
    }

    override fun onClick(v: View?) {

        when (v!!.id) {
            R.id.btnFeedback -> {
                val bottomSheetBehavior = BottomSheetBehavior.from(bottom_sheet)
                if (bottomSheetBehavior.getState() != BottomSheetBehavior.STATE_EXPANDED) {
                    bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED)

                } else {
                    bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED)
                }
            }

            R.id.imageClose -> {
                val bottomSheetBehavior = BottomSheetBehavior.from(bottom_sheet)
                bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED)
            }
        }
    }
}
1 голос
/ 22 января 2020

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

   app:layout_behavior="app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior""

используйте в файле класса

используйте глобальную переменную

   private var mBottomSheetBehavior: BottomSheetBehavior<*>? = null

В представлении создано

    mBottomSheetBehavior = BottomSheetBehavior.from(view);
     mBottomSheetBehavior?.peekHeight = 0
    setBottomSheetAndCallBackBottomSheetBehaviour();
    bottomSheetCollapsed();
    bottomSheet?.visibility = View.VISIBLE

и при создании вашего представления вызывается метод и передается идентификатор макета и высота просмотра используется в первый раз для скрытого просмотра.

/**
 * set bottom sheet behavior and state
 */
private fun setBottomSheetAndCallBackBottomSheetBehaviour() {


    mBottomSheetBehavior?.state = BottomSheetBehavior.STATE_HIDDEN

    //callback
    mBottomSheetBehavior?.setBottomSheetCallback(object :
        BottomSheetBehavior.BottomSheetCallback() {
        override fun onStateChanged(bottomSheet: View, newState: Int) {
            if (newState == BottomSheetBehavior.STATE_COLLAPSED) {
                bottomSheetCollapsed()
            }
        }

        override fun onSlide(bottomSheet: View, slideOffset: Float) {}
    })
}

и Используйте следующий метод для расхода и свертывания.

 private fun bottomSheetExpand() {
    mBottomSheetBehavior?.state = BottomSheetBehavior.STATE_EXPANDED
}

private fun bottomSheetCollapsed() {
    mBottomSheetBehavior?.state = BottomSheetBehavior.STATE_COLLAPSED
}

и по щелчку просмотра используйте

  fun isExpendCollapse(){
     if (mBottomSheetBehavior?.state == BottomSheetBehavior.STATE_COLLAPSED) {
                bottomSheetExpand()
            } else {
                bottomSheetCollapsed()
            }
}

check xml file CoordinatorLayout необходим для поведения нижнего листа

 <android.support.design.widget.CoordinatorLayout
    android:id="@+id/bottomSheet"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:clipToPadding="true"
    android:visibility="gone"
    app:behavior_hideable="true"
    app:behavior_peekHeight="0dp"
    android:layout_alignParentBottom="true"

    >



<View
    android:id="@+id/view"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:background="@color/colorAccent"
    app:layout_behavior="app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"
   />
</android.support.design.widget.CoordinatorLayout> 

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

...