Android: Снэк-бар неправильно отображается в верхней части SupportMapFragment - PullRequest
1 голос
/ 01 ноября 2019

Макет, используемый в Деятельности (для GoogleMap)

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:id="@+id/cl_map"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        <fragment
                android:id="@+id/fr_map"
                android:name="com.google.android.gms.maps.SupportMapFragment"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                tools:context=".ui.activity.MapActivity" />

    </androidx.coordinatorlayout.widget.CoordinatorLayout>

В той же самой Деятельности, именно так был создан снэк-бар при нажатии на маркер.

override fun onMarkerClick(p0: Marker?): Boolean {
    Snackbar.make(findViewById(R.id.cl_map), "Hello World", Snackbar.LENGTH_INDEFINITE).show()
    // finding android.R.id.content does not work either
    // Snackbar.make(findViewById(android.R.id.content), "Hello World", Snackbar.LENGTH_INDEFINITE).show()
    return false
}

Вот скриншоты и несколько симптомов:для начального щелчка маркера: enter image description here Обратите внимание на черную тонкую линию. Это была закусочная.

Но если я щелкну где-нибудь в теле карты, вместо маркера, закусочная станет нормальной.

enter image description here

Более того, если я установил значение uiSettings.isMapToolbarEnabled в ложное, панель инструментов по умолчанию была скрыта, но снэк-бар так и не появился. Я даже не мог видеть черную тонкую линию, независимо от того, какой у меня щелчок.

this.googleMap?.uiSettings?.isMapToolbarEnabled = false

Один похожий вопрос здесь . Телефон, с которого я сделал скриншоты, был Nexus 5. Native Android 6.0.1, последняя ОС, которую может поддерживать Nexus 5.

1 Ответ

0 голосов
/ 02 ноября 2019

Коренная причина в значительной степени найдена. В полноэкранном режиме снэк-бар скрыт SystemUI. Можно легко повторить эту проблему здесь .

В моем случае, вот фрагменты, которые вызывают проблему

override fun onWindowFocusChanged(hasFocus: Boolean) {
    super.onWindowFocusChanged(hasFocus)
    if (hasFocus) hideSystemUI()
}

private fun hideSystemUI() {
    window.decorView.systemUiVisibility = (
            View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    // or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    // or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    // or View.SYSTEM_UI_FLAG_FULLSCREEN
                    // to hide the nav bar and status bar
                    or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    or View.SYSTEM_UI_FLAG_FULLSCREEN)
}

Режим SYSTEM_UI_FLAG_IMMERSIVE и SYSTEM_UI_FLAG_IMMERSIVE_STICKY скрываетсяСнэк-бар почти все время, как описано в основной части вопроса, независимо от того, как и где пользователи нажимают. В то время как 3-й полноэкранный режим без какого-либо флажка, режим откидывания назад ( GoogleDoc ), отвечает пользователям действительными закусочными, только нажатием 2nd . Первый щелчок пользователя используется как возврат из режима откидывания назад при отображении строки состояния и панели навигации SystemUI.

Итак, быстрое решение этой проблемы на данный момент - отключить любой флаг погружения. Но я не удовлетворен этим. Будет продолжать искать лучшие ответы.

Более того, я пробовал решения для Stackoverflow, либо устанавливая надлежащий z-индекс, либо LayoutParam, ни один из которых не позволяет достичь того, чего я хочу: отображать снэк-бар поверх погружения (липкий) полный экран.

Обновление 20191102: Закусочные не считаются подходящим средством для отображения слишком большого количества текстов, а значок не рекомендуется в соответствии с Руководством по проектированию материалов . Правильный компонент пользовательского интерфейса, на который я должен положиться, - Bottom Sheet .

...