如何将 CastButton 添加到 MaterialToolbar(不是 appcompat Toolbar)

How to add CastButton to MaterialToolbar (not appcompat Toolbar)

我正在尝试将 CastSdk 实施到我使用 MaterialToolbar 的应用程序。

因此,在一对夫妇尝试将 CastButton 添加到我的 material 工具栏之后,我终于在上面添加了一个按钮,但它是灰色的...

一开始我以为是receiver app id不对,可能manifest文件有问题。但是后来发现是MaterialToolbar的问题。 迁移到 appcompat 工具栏可以解决这个问题,但是如果我不想从 materialToolbar 迁移到它怎么办?

material工具栏上带有灰色按钮的代码:

在 MainActivity 中:

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    super.onCreateOptionsMenu(menu)
    menuInflater.inflate(R.menu.top_app_bar, menu)
    val mediaRouteItem: MenuItem = menu.findItem(R.id.media_route_menu_item)
    val mMediaRouteButton = mediaRouteItem.actionView as MediaRouteButton

    CastButtonFactory.setUpMediaRouteButton(applicationContext, mMediaRouteButton)
    return true
}

在菜单中 xml:

<item
    android:id="@+id/media_route_menu_item"
    android:title="@string/media_route_menu_title"
    app:actionProviderClass="androidx.mediarouter.app.MediaRouteActionProvider"
    app:actionViewClass="androidx.mediarouter.app.MediaRouteButton"
    app:showAsAction="always" />

在 OptionsProvider 实现中:

override fun getCastOptions(context: Context): CastOptions {
    val launchOptions: LaunchOptions = LaunchOptions.Builder()
        .setAndroidReceiverCompatible(true)
        .build()
    return CastOptions.Builder()
        .setReceiverApplicationId(context.getString(R.string.app_id))
        .setLaunchOptions(launchOptions)
        .build()
}

结果:

好的,所以这里的答案很简单: 除了将 castButton 放在 menu.xml 文件中,将它放在 MaterialToolbar 布局中:

<com.google.android.material.appbar.AppBarLayout
    android:id="@+id/topAppBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/app_bar_background"
    app:layout_constraintTop_toTopOf="parent"
    app:liftOnScroll="true">

    <com.google.android.material.appbar.MaterialToolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:layout_marginTop="@dimen/grid_24"
        app:layout_scrollFlags="scroll|enterAlways"
        app:logo="@drawable/rick_morty_icon"
        app:menu="@menu/top_app_bar">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="end">

            <androidx.mediarouter.app.MediaRouteButton
                android:id="@+id/media_route_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:mediaRouteTypes="user"
                android:visibility="visible" />

        </LinearLayout>

    </com.google.android.material.appbar.MaterialToolbar>

</com.google.android.material.appbar.AppBarLayout>

然后在Activity的onCreate方法中:

val mMediaRouteButton = findViewById<View>(R.id.media_route_button) as MediaRouteButton
    CastButtonFactory.setUpMediaRouteButton(applicationContext, mMediaRouteButton)

或者如果您使用 viewBinding:

CastButtonFactory.setUpMediaRouteButton(applicationContext, binding.mediaRouteButton)