Получение DrawerLayout должно быть измерено с помощью MeasureSpec.ТОЧНО при добавлении компоновки выдвижных ящиков

#android #kotlin #android-fragments #illegalargumentexception #drawerlayout

#Android #kotlin #android-фрагменты #исключение illegalargumentexception #чертежное описание

Вопрос:

Я пытаюсь добавить drawerlayout в свой fragment home. Я получаю java.lang.Исключение IllegalArgumentException: DrawerLayout должен быть измерен с помощью MeasureSpec.ТОЧНО. эта ошибка, когда я попытался прикрепить макет ящика к своему фрагменту.

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

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

Ниже приведен мой код

макет ящика

 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    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">

<androidx.drawerlayout.widget.DrawerLayout

    android:id="@ id/drawer"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <include
        layout="@layout/fragment_home"
        android:visibility="visible" />

    <com.google.android.material.navigation.NavigationView
        android:id="@ id/nav_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        android:layout_gravity="start">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <include
                android:id="@ id/nav_header"
                layout="@layout/nav_header" />

            <ScrollView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fadeScrollbars="true"
                android:scrollbars="none">

                <include
                    android:id="@ id/menuItems"
                    layout="@layout/layout_navigation_menu" />
            </ScrollView>
        </LinearLayout>
    </com.google.android.material.navigation.NavigationView>
</androidx.drawerlayout.widget.DrawerLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
 

Макет фрагмента домашней страницы

 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent">

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:fillViewport="true"
    android:fitsSystemWindows="true">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@ id/root"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <include android:id="@ id/app_bar"
            layout="@layout/app_bar_main"/>

        <RelativeLayout
            android:id="@ id/relative_accept"
            android:layout_width="match_parent"
            android:layout_height="@dimen/margin_55"
            android:orientation="horizontal"
            android:background="@color/green_500"
            app:layout_constraintTop_toBottomOf="@id/app_bar">


            <androidx.appcompat.widget.AppCompatTextView
                android:layout_width="wrap_content"
                android:layout_alignParentStart="true"
                android:layout_centerVertical="true"
                android:textColor="@color/white"
                android:layout_marginLeft="@dimen/margin_16"
                android:layout_marginStart="@dimen/margin_16"
                android:layout_marginRight="@dimen/margin_16"
                android:layout_marginEnd="@dimen/margin_16"
                android:text="@string/accepting_orders"
                android:fontFamily="@font/roboto_regular"
                android:textSize="@dimen/text_size_15"
                android:layout_alignParentLeft="true"
                android:layout_height="wrap_content" />

            <Switch
                android:id="@ id/switch1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:track="@drawable/switch_track_selector"
                android:layout_centerVertical="true"
                android:layout_alignParentEnd="true"
                android:layout_alignParentRight="true"
                tools:ignore="UseSwitchCompatOrMaterialXml" />


        </RelativeLayout>

        <FrameLayout
            android:id="@ id/frameLayout_tab"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:clipToPadding="false"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@ id/relative_accept">

            <com.google.android.material.tabs.TabLayout
                android:id="@ id/tabs"
                android:layout_width="match_parent"
                android:layout_height="42dp"
                android:layout_marginStart="@dimen/margin_16"
                android:layout_marginLeft="@dimen/margin_16"
                android:layout_marginTop="@dimen/margin_20"
                android:layout_marginEnd="@dimen/margin_16"
                android:layout_marginRight="@dimen/margin_16"
                android:background="@drawable/grey_drawable"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:tabGravity="fill"
                app:tabIndicatorHeight="0dp"
                app:tabMode="fixed"
                android:onClick="@{(v)->click.onClick(v)}"
                app:tabBackground="@drawable/tab_selector"
                app:tabSelectedTextColor="@color/white" />
        </FrameLayout>

        <androidx.viewpager.widget.ViewPager
            android:id="@ id/view_pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_constraintTop_toBottomOf="@ id/frameLayout_tab" />


    </androidx.constraintlayout.widget.ConstraintLayout>

</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
 

Фрагмент Home

 class HomeFragment : BaseFragment() , View.OnClickListener{


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

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


    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        init()
        controlInit()
    }

    override fun init() {
        val toggle = ActionBarDrawerToggle(
            (activity as MainActivity),
            drawer,
            R.string.navigation_drawer_open,
            R.string.navigation_drawer_close
        )
        drawer.addDrawerListener(toggle)

        tabs.setupWithViewPager(view_pager)
        bindViewPagerAdapter(view_pager, (activity as MainActivity))
        bindViewPagerTabs(tabs, view_pager)
        tabSettings()
    }
    private fun tabSettings() {

        tabs.bringToFront()

        view_pager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
            override fun onPageScrolled(
                    position: Int, positionOffset: Float, positionOffsetP: Int
            ) {
            }

            override fun onPageSelected(position: Int) {}
            override fun onPageScrollStateChanged(i: Int) {}
        })
    }

    private fun bindViewPagerAdapter(view: ViewPager?, mainActivity: MainActivity) {
        val adapter = OrdersAdapter(view?.context!!, childFragmentManager)
        view.adapter = adapter
    }

    private fun bindViewPagerTabs(view: TabLayout, pagerView: ViewPager?) {
        view.setupWithViewPager(pagerView, true)
    }

    private fun controlInit() {

        imageView_drawer.setOnClickListener(this)

    }

    @SuppressLint("WrongConstant")
    override fun onClick(p0: View) {
        when (p0.id) {
            R.id.imageView_drawer -> {
                drawer.openDrawer(Gravity.START)
            }
        }
    }

    companion object {
        
        @JvmStatic
        fun newInstance() =
                HomeFragment().apply {}
    }
}
 

Пожалуйста, помогите с этим.Спасибо….

Ответ №1:

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

Кроме NavigationView того, компонент предназначен для отображения меню из ресурса меню, а не просто для использования в качестве оболочки для вашего собственного. Либо выберите полное отображение вашего собственного меню, либо используйте их реализацию по назначению. Для этого есть хорошая документация на [веб-сайте Material Design] здесь.

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

Иерархия, которая вам может понадобиться, вероятно, будет выглядеть примерно так:

drawer_layout.xml

 <DrawerLayout>
    <include layout="@layout/home" />
    <NavigationView />
</DrawerLayout>
 

home.xml

 <ScrollView>
    <ConstraintLayout>
        <include layout="@layout/app_bar_main"/>
        <TextView />
        <Switch />
        <TabLayout />
        <ViewPager />
    </ConstraintLayout>
</ScrollView>