【问题标题】:WearableDrawerLayout.DrawerStateCallback's onDrawerClosed not being called (but onDrawerOpened is)WearableDrawerLayout.DrawerStateCallback 的 onDrawerClosed 没有被调用(但是 onDrawerOpened 是)
【发布时间】:2019-09-29 03:40:58
【问题描述】:

我正在为 Wear OS 构建一个独立的应用程序。我的问题是WearableDrawerLayout.DrawerStateCallbackonDrawerClosed() 永远不会被调用。因此,当用户切换抽屉中的某些设置然后关闭抽屉时,这些更改不会反映在活动片段上 (MainFragment)。 (此外,当我滑动关闭 WearableDrawerView 时,屏幕上的活动片段不会调用 onResume(),因此无法选择解决方法。)

以下是我对MainActivity 的布局。 main_contentdrawer_content 都是片段。为了我的问题,我们分别称它们为MainFragmentDrawerFragment

<?xml version="1.0" encoding="utf-8"?>
<androidx.wear.widget.drawer.WearableDrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include layout="@layout/main_content" />

    <androidx.wear.widget.drawer.WearableDrawerView
        android:id="@+id/bottom_action_drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="bottom"
        android:background="@color/overlay_background"
        app:drawerContent="@+id/drawer_content"
        app:peekView="@+id/peek_view">

        <FrameLayout
            android:id="@+id/drawer_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

        <LinearLayout
            android:id="@+id/peek_view"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/navigation_peek_height"
            android:layout_gravity="center"
            android:gravity="center_vertical"
            android:orientation="vertical"
            android:paddingTop="@dimen/action_drawer_peek_top_padding">

            <ImageView
                android:layout_width="@dimen/peek_view_icon_size"
                android:layout_height="@dimen/peek_view_icon_size"
                android:layout_marginTop="@dimen/action_drawer_expand_icon_top_margin"
                android:alpha="0.7"
                android:src="@drawable/ic_expand_less_white_22" />

        </LinearLayout>

    </androidx.wear.widget.drawer.WearableDrawerView>

</androidx.wear.widget.drawer.WearableDrawerLayout>

在我的 MainActivity 中,我实现 DrawerCallback.DrawerCallbackListener 并以编程方式设置我的自定义实现 DrawerStateCallback,一个名为 DrawerCallback 的类。

class MainActivity : FragmentActivity(), DrawerCallback.DrawerCallbackListener {

    override fun onCreate(savedInstanceState: Bundle?) {

        // some initialization stuff
        ...

        mWearableDrawerLayout = findViewById(R.id.drawer_layout)
        mWearableDrawerLayout.setDrawerStateCallback(DrawerCallback(this))
        mWearableActionDrawer =
            findViewById<WearableDrawerView>(R.id.bottom_action_drawer).apply {
                // Peeks action drawer on the bottom.
                controller.peekDrawer()
            }
    }
}
class DrawerCallback(private val listener: DrawerCallbackListener) :
    WearableDrawerLayout.DrawerStateCallback() {

    override fun onDrawerStateChanged(layout: WearableDrawerLayout?, newState: Int) {
        super.onDrawerStateChanged(layout, newState)

        Log.d("onDrawerStateChanged")
    }

    override fun onDrawerClosed(layout: WearableDrawerLayout?, drawerView: WearableDrawerView?) {
        super.onDrawerClosed(layout, drawerView)

        Log.d("onDrawerClosed") // TODO: WHY IS THIS LINE NEVER GETTING HIT??

        listener.onDrawerClosed()
    }

    override fun onDrawerOpened(layout: WearableDrawerLayout?, drawerView: WearableDrawerView?) {
        super.onDrawerOpened(layout, drawerView)

        Log.d("onDrawerOpened")

        listener.onDrawerOpened()
    }

    interface DrawerCallbackListener {
        fun onDrawerClosed()

        fun onDrawerOpened()
    }
}

onDrawerOpened() 在抽屉打开时调用,onDrawerClosed() 在抽屉关闭时不调用。 onDrawerStateChanged() 也被调用,但 newState 整数仅表示其当前的运动状态(空闲、拖动或稳定)。

如何让MainFragment 识别在DrawerFragment 中对某些设置值(例如colorScheme)所做的更改并相应地更新其用户界面?设置的值,如colorScheme,通过MainActivity 在片段之间存储/共享。

【问题讨论】:

    标签: android android-fragments wear-os drawerlayout


    【解决方案1】:

    不是最佳解决方案,但我能够通过创建一个新实例并在检测到数据中的更改时使用片段事务替换它来反映对 MainFragment 中设置的更改。

    这很有效,因为在片段初始化时,视图从设置中提取以确定它应该是什么样子。虽然如果我需要保留任一片段中的值,则此解决方法将不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多