Метод onarableDrawerLayout.DrawerStateCallback's onDrawerClosed не вызывается (но onDrawerOpened is) - PullRequest
0 голосов
/ 29 сентября 2019

Я создаю отдельное приложение для Wear OS.Моя проблема в том, что WearableDrawerLayout.DrawerStateCallback onDrawerClosed() никогда не вызывается.Таким образом, когда пользователь переключает некоторые параметры в блоке, а затем закрывает блок, изменения НЕ отражаются на активном фрагменте (MainFragment).(Кроме того, активный фрагмент на экране НЕ вызывает onResume(), когда я смахиваю WearableDrawerView закрыт, так что обходной путь не вариант.)

Ниже приведен мой макет для MainActivitymain_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.

1 Ответ

0 голосов
/ 29 сентября 2019

Не лучшее решение, но я смог отразить изменения в настройках в MainFragment, создав новый экземпляр и заменив его с помощью фрагментной транзакции при обнаружении изменения в данных.

Это сработало, потому что при инициализации фрагмента происходит когда представление извлекается из настроек, чтобы определить, как оно должно выглядеть.Хотя этот обходной путь не будет работать, если в любом из фрагментов есть значения, которые мне нужно будет удержать.

...