如果片段包含AppBarLayout,则BottomNavigationView不会隐藏在内部片段中滚动

问题描述 投票:3回答:2

我在使用Android中的coordinatorLayout在片段内滚动和检测它时遇到了很多问题。我有一个包含3个片段的“MainActivity”。在其中一个片段中,我有一个在滚动片段时折叠的Appbar。我已设法做到这一点,但如果我设置滚动行为以允许它,我的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>

我的名字是c ty。 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>

现在,这种方法运行得很好,因为当我在内部滚动片段时,我的AppBar会折叠到标题中(这就是我想要的),但是我的bottomNavigationView对滚动没有反应。

我发现的是,如果我添加线

app:layout_behavior="@string/appbar_scrolling_view_behavior"

到AppBarLayout xml声明我得到bottomView在滚动事件上崩溃(当我向上滚动它再次显示)。所以基本上要么我能够在片段内折叠appbar,要么我能够在片段内部检测到滚动事件时隐藏BottomNavigationView。

任何形式的帮助将不胜感激。

android scroll bottomnavigationview android-appbarlayout
2个回答
1
投票

为了隐藏底部导航以响应在片段内滚动修改片段1.kt上的qazxsw poi方法,如下所示

onCreateView

在Java中

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
}

更新:

将侦听器代码提取到单独的函数,如下所示(在Kotlin中)

@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;
 }

0
投票

将您的库更新为 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) } }) } 28.0.0 or above并更改您的androidx / material-1.0.0,如下所示 -

BottomNavigationView

希望它会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.