#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>