Android BottomNavigationBar перемещается, когда одна из страниц содержит сворачивающуюся панель инструментов, и fitSystemWindows имеет значение true - PullRequest
0 голосов
/ 11 июля 2019

У меня есть активность с BottomNavigationView.При навигации я показываю / скрываю два фрагмента, один из которых является пустым фрагментом, другой содержит сворачивающуюся панель инструментов, для которой установлено значение android:fitsSystemWindows="true".

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

Проблема не появляется, когда я не устанавливаю fitSystemWindows true или создаю новый фрагмент каждый раз, когда пользователь меняет вкладку.Но мне нужно сохранить оба.

Скриншоты - https://photos.app.goo.gl/mnBvh4j9fDrMEDLk6

Есть ли решение, чтобы избежать этого?

Вот пример кода, который ведет себя так

Активность

class BottomNavigationActivity : AppCompatActivity() {
private var currentFragment: Fragment? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_bottom_navigation)
    val bottomNavigationView = findViewById(R.id.activity_navigation__bottom_bar) as BottomNavigationView
    bottomNavigationView.setOnNavigationItemSelectedListener {
        when (it.itemId) {
            R.id.action_blank -> openFragment(findFragment("blank")?:BlankFragment(), "blank")
            R.id.action_collapsed -> openFragment(findFragment("collapsing")?:CollapsingFragment(), "collapsing")
        }
        return@setOnNavigationItemSelectedListener true
    }
}

private fun openFragment(fragment: Fragment, tag: String) {
    val fragmentTransaction = supportFragmentManager.beginTransaction()
    currentFragment?.let {
        fragmentTransaction.hide(it)
    }

    if (!fragment.isAdded) {
        fragmentTransaction.add(R.id.container, fragment, tag);
    }
    if (!fragment.isVisible) {
        fragmentTransaction.show(fragment)
    }
    currentFragment = fragment
    fragmentTransaction.commitAllowingStateLoss()
}

private fun findFragment(tag: String): Fragment? {
    return supportFragmentManager.findFragmentByTag(tag)
}
}

макет xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignBottom="@id/activity_navigation__bottom_bar"/>

<android.support.design.widget.BottomNavigationView
        android:id="@+id/activity_navigation__bottom_bar"
        android:background="@color/colorPrimary"
        android:layout_width="match_parent"
        app:menu="@menu/menu"
        android:layout_height="56dp"
        android:layout_alignParentBottom="true"/>

</RelativeLayout>

пустой фрагмент

class BlankFragment : Fragment() {

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    return inflater.inflate(R.layout.fragment_blank, container, false)
}
}

макет XML

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:tools="http://schemas.android.com/tools"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         tools:context=".BlankFragment">

<TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="blank fragment"/>

</FrameLayout>

Фрагмент свертывания

class CollapsingFragment : Fragment() {
override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    return inflater.inflate(R.layout.fragment_collapsing, container, false)
}
}

макет XML

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">

    <android.support.design.widget.AppBarLayout
            android:id="@+id/fragment_collapsing_toolbar__appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fitsSystemWindows="true">

        <android.support.design.widget.CollapsingToolbarLayout
                android:id="@+id/fragment_collapsing_toolbar__container"
                android:layout_width="match_parent"
                android:layout_height="200dp"
                android:background="?android:attr/windowBackground"
                app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
                android:fitsSystemWindows="true">


            <android.support.v7.widget.Toolbar
                    android:id="@+id/fragment_collapsing_toolbar__toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    app:title="collapsing fragment"
                    app:titleMarginStart="72dp"
                    app:titleMarginEnd="72dp"
                    app:layout_collapseMode="pin"
                    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

        </android.support.design.widget.CollapsingToolbarLayout>

    </android.support.design.widget.AppBarLayout>

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

</android.support.design.widget.CoordinatorLayout>

вот меню

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto">
<item
        android:id="@+id/action_blank"
        android:enabled="true"
        android:title="blank"
        app:showAsAction="ifRoom" />
<item
        android:id="@+id/action_collapsed"
        android:enabled="true"
        android:title="collapsing"
        app:showAsAction="ifRoom" />
</menu>

Спасибо.

...