Просмотр проблемы привязки с макетом <Include>
Я использую Android Studio 3.6.2 и включил функцию привязки просмотра.
Столкновение с трудностями при добавлении представления с использованием тега include через привязку.
Toolbar.xml
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.appbar.MaterialToolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
style="?toolbarStyle"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:elevation="0dp" />
MainActivity.xml
<?xml version="1.0" encoding="utf-8"?>
<include
android:id="@+id/toolbar"
layout="@layout/toolbar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
app:defaultNavHost="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar"
app:navGraph="@navigation/merchant_navigation_graph" />
MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
setTheme(R.style.AvailsTheme_DayNight)
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
val toolbarBinding = binding.toolbar
setContentView(binding.root)
}
}
2 ответа
Вы получаете доступ к привязке включенного макета, а не к панели инструментов, которая находится внутри включенного макета. Я вижу, что ты не далMaterialToolbar
любой ID. Таким образом, вам нужно дать объекту панели инструментов в XML идентификатор и включить его в макет, а затем указать идентификатор, а затем в своем файле Kotlin получить доступ к нему, напримерval toolbar = binding.includedLayout.toolbar
. Кроме того, вы открывали представление раньшеsetContentView(binding.root)
что неправильно. Перед тем, как пытаться получить доступ к представлениям, необходимо настроить макет.
Toolbar.xml
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.appbar.MaterialToolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/toolbar"
style="?toolbarStyle"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:elevation="0dp" />
MainActivity.xml
<include
android:id="@+id/includedLayout"
layout="@layout/toolbar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
setTheme(R.style.AvailsTheme_DayNight)
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val toolbar = binding.includedLayout.toolbar
}
}
Оберните свой toolbar.xml с помощью layout
тег и дайте и ID. Так будет так:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<com.google.android.material.appbar.MaterialToolbar
style="?toolbarStyle"
android:id="@+id/my_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:elevation="0dp" />
</layout>
И получить доступ так:
val toolbarBinding = binding.toolbar.myToolbar