#android #kotlin #android-activity #android-actionbar #android-toolbar
#Android #kotlin #android-активность #android-actionbar #android-панель инструментов
Вопрос:
Есть ли способ установить a MaterialToolbar
как Activity
‘s ActionBar
? Всякий раз, когда я пытаюсь установить свой, Android Studio продолжает запрашивать a Toolbar
из библиотеки поддержки.
Требуется: панель инструментов? — Найдено: MaterialToolbar
XML
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.appbar.AppBarLayout
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"
android:id="@ id/myAppBarLayout">
<com.google.android.material.appbar.CollapsingToolbarLayout
android:id="@ id/myCollapsingToolbarLayout"
android:layout_width="match_parent"
android:layout_height="250dp"
android:fitsSystemWindows="true"
app:layout_scrollFlags="scroll|snap|exitUntilCollapsed">
<com.google.android.material.appbar.MaterialToolbar
android:id="@ id/myToolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:contentInsetStartWithNavigation="0dp"
app:layout_collapseMode="pin" />
</com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout>
Kotlin
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.collapsingtoolbar_and_recyclerview)
val mCoordinatorLayout = findViewById<CoordinatorLayout>(R.id.myCoordinatorLayout)
val mCollapsingToolbarLayout = findViewById<CollapsingToolbarLayout>(R.id.myCollapsingToolbarLayout)
val mToolbar = findViewById<MaterialToolbar>(R.id.myToolbar)
// ...Do other stuff here
setActionBar(mCollapsingToolbarLayout)
mCollapsingToolbarLayout.title = "Hello, world!"
}
}
Ответ №1:
setActionBar()
требуется фреймворк Toolbar
. MaterialToolbar
правильно расширяет AndroidX Toolbar
, что означает, что вы должны использовать AppCompatActivity
and setSupportActionBar()
, а не Activity
and setActionBar()
.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.collapsingtoolbar_and_recyclerview)
//[...]
val toolbar = findViewById<MaterialToolbar>(R.id.myToolbar)
setSupportActionBar(toolbar)
// ...Do other stuff here
supportActionBar.title = "My MainActivity"
supportActionBar.setDisplayHomeAsUpEnabled(true)
}
}
Комментарии:
1. Ну, это не идеально, если пытаться переместить мой проект в компоненты Material Design. API 29 — это минимум моего проекта.
2. Вы уже
AppCompat
подключаетесь как зависимость, темы материалов уже распространяются наAppCompat
темы и т. Д. И т. Д. Вы также обнаружите, что ~ все компоненты архитектуры и, в основном, любые другие строительные блоки современного Android также требуют, чтобы вы использовали что-то другое, кроме базовогоActivity
класса — вы не получите ~ ничего, установив minSdkVersion равным 29, чего вы не получили бы, установив minSdkVersion равным 24 или даже 21.3. Я вообще не использую эту зависимость мне не нужно поддерживать более старые версии Android.
4. AppCompat — это транзитивная зависимость компонентов Material Design, поэтому вы используете его, если используете компоненты Material Design. Независимо от того, поддерживаете вы более старые версии Android или нет, ~ ни один из рекомендуемых инструментов, которые вы используете в современной разработке Android, не привязан к платформе Android каким-либо значимым образом.
5. Так следует ли использовать AppCompat для всех действий, которые я создаю? Что произойдет, если я не буду использовать зависимость AppCompat?
Ответ №2:
Вы также можете объявить mToolbar как MaterialToolbar:
val mToolbar: MaterialToolbar = findViewById(R.id.toolbar)
setSupportActionBar(mToolbar)
или используйте привязку представления, см. https://developer.android.com/topic/libraries/view-binding
private lateinit var binding: ActivityMainBinding
и в onCreate():
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
setSupportActionBar(binding.toolbar)