【发布时间】:2019-09-29 03:40:58
【问题描述】:
我正在为 Wear OS 构建一个独立的应用程序。我的问题是WearableDrawerLayout.DrawerStateCallback 的onDrawerClosed() 永远不会被调用。因此,当用户切换抽屉中的某些设置然后关闭抽屉时,这些更改不会反映在活动片段上 (MainFragment)。 (此外,当我滑动关闭 WearableDrawerView 时,屏幕上的活动片段不会调用 onResume(),因此无法选择解决方法。)
以下是我对MainActivity 的布局。 main_content 和 drawer_content 都是片段。为了我的问题,我们分别称它们为MainFragment 和DrawerFragment。
<?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