Как установить MaterialToolbar в качестве ActionBar без поддержки библиотек

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