Я создаю отдельное приложение для Wear OS.Моя проблема в том, что WearableDrawerLayout.DrawerStateCallback
onDrawerClosed()
никогда не вызывается.Таким образом, когда пользователь переключает некоторые параметры в блоке, а затем закрывает блок, изменения НЕ отражаются на активном фрагменте (MainFragment
).(Кроме того, активный фрагмент на экране НЕ вызывает onResume()
, когда я смахиваю WearableDrawerView
закрыт, так что обходной путь не вариант.)
Ниже приведен мой макет для 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()
IS вызывается, когда ящик открыт, onDrawerClosed()
НЕ вызывается, когда ящик закрыт.onDrawerStateChanged()
также вызывается, но целое число newState
представляет только его текущее состояние движения (бездействие, перетаскивание или установление).
Как получить MainFragment
для распознавания изменений, сделанных в DrawerFragment
для некоторых значений параметров, таких как colorScheme
, и соответственно обновить его интерфейс?Значения настроек, такие как colorScheme
, сохраняются / распределяются между фрагментами с помощью MainActivity
.