BottomNavigationView не скрывается при прокрутке внутри фрагмента, если фрагмент содержит AppBarLayout - PullRequest
0 голосов
/ 24 февраля 2019

У меня много проблем с прокруткой и обнаружением ее внутри фрагментов с помощью координататор в Android.У меня есть «MainActivity», которая содержит 3 фрагмента.В одном из этих фрагментов у меня есть панель приложений, которая разрушается при прокрутке фрагмента.Мне удалось это сделать, но если я установил поведение прокрутки, чтобы разрешить это, мой bottomNavigationView (который находится в mainactivity.xml) НЕ реагирует на прокрутку.Коды выглядят примерно так:

Fragment1.xml

<android.support.design.widget.CoordinatorLayout
...
...>
    <android.support.design.widget.AppBarLayout
 ...
 ...>
        <android.support.design.widget.CollapsingToolbarLayout
                 app:layout_scrollFlags="scroll|exitUntilCollapsed"
   ...>
            <android.support.v7.widget.Toolbar
     .../>
        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

   <android.support.v4.widget.NestedScrollView
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
   </android.support.v4.widget.NestedScrollView>

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

MainActivity.xml

<android.support.design.widget.CoordinatorLayout
.../>
    <FrameLayout
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
 .../>
    <android.support.design.widget.BottomNavigationView
      app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior"
.../>
</android.support.design.widget.CoordinatorLayout>

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

Я обнаружил, что еслиЯ добавляю строку

app:layout_behavior="@string/appbar_scrolling_view_behavior"

в декларацию AppBarLayout xml. Я получаю bottomView, чтобы свернуться при событии прокрутки (когда я прокручиваю вверх, он снова отображается).Так что в основном у меня есть возможность свернуть панель приложения внутри фрагмента ИЛИ у меня есть возможность скрыть BottomNavigationView при обнаружении события прокрутки внутри фрагмента.

Любая помощь будет приветствоваться.

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Обновите вашу библиотеку до 28.0.0 or above или androidx / material-1.0.0 и измените свой BottomNavigationView, как показано ниже -

<BottomNavigationView
        android:id="@+id/navigation"
        .
        .
        .
        .
        app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior" />

надеюсь, это будет полезно.

0 голосов
/ 02 марта 2019

Чтобы скрыть нижнюю навигацию в ответ на прокрутку внутри фрейма, измените метод onCreateView на фрагмент1.kt следующим образом

override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        ...

        // access the bottom nav which is on the main activity
        val bottomNav: BottomNavigationView = activity!!.findViewById(R.id.bottom_nav)

        // hide bottom nav when scrolling
        rvList.addOnScrollListener(object : RecyclerView.OnScrollListener() {

            override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                if (dy > 0 || dy < 0) {
                    bottomNav.visibility = View.GONE
                }
            }

            override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
                if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                    bottomNav.visibility = View.VISIBLE
                }

                super.onScrollStateChanged(recyclerView, newState)
            }
        })

        return view
}

В Java

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        ...

    // access the bottom nav which is on the main activity
    BottomNavigationView bottomNav = getActivity.findViewById(R.id.bottom_nav);

    // hide bottom nav when scrolling
    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener()
    {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy)
        {
             if (dy > 0 ||dy<0)
             {
                 bottomNav.setVisibility(View.GONE);
             }
        }

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState)
        {
             if (newState == RecyclerView.SCROLL_STATE_IDLE)
             {
                  bottomNav.setVisibility(View.VISIBLE);
             }

             super.onScrollStateChanged(recyclerView, newState);
        }
    });

        return view;
 }

Обновление:

Извлечение кода слушателя в отдельную функцию, как указано ниже (в Kotlin)

   public fun hideBottomNav(
        rvList: RecyclerView,
        bottomNav: BottomNavigationView
    ) {
        rvList.addOnScrollListener(object : RecyclerView.OnScrollListener() {

            override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                if (dy > 0 || dy < 0) {
                    bottomNav.visibility = View.GONE
                }
            }

            override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
                if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                    bottomNav.visibility = View.VISIBLE
                }

                super.onScrollStateChanged(recyclerView, newState)
            }
        })
    }
...