【Android】AppBarLayout禁止折叠

今天在做项目的时候用到了CoordinatorLayout + AppBarLayout + CollapsingToolbarLayout + Toolbar + TabLayout + NestedScrollView,网上有很多,这种控价搭配使用的教程,这里就不多描述了。

然后遇到了个大难题,网上找了很多关于AppBarLayout的帖子,不过大本分都是讲怎么用的,都解决不了我的问题,黄天不负有心人,终于找到了一个有用的技术文档。

先说一下我的使用情况吧:

我的头部最上方是AppBarLayout包裹的AViewpager,里面加载AFragment,中间是TabLayout,下部是ScrollView包裹着BViewpager,里面加载的BFragment,BFragment中最外层是一个ScrollView,里面嵌套了三个RecyclerView。

大致效果是这个样子的,(请原谅我的美术功底)凑合着看一下吧:

 

现在想在AViewpager滑动到第二页的时候,就禁止AppBarLayout的折叠效果。

具体解决办法,监听AViewPager的滑动事件,在监听中动态去设置AppBarLayout的LayoutParam

AViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    }

    @Override
    public void onPageSelected(int position) {
        int i0 = AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL;
        int i1 = AppBarLayout.LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED;
        View appBarChildAt = mAppBarLayout.getChildAt(0);
        AppBarLayout.LayoutParams appBarParams = (AppBarLayout.LayoutParams) appBarChildAt.getLayoutParams();
        if (position == 0) {
            appBarParams.setScrollFlags( i0 | i1);// 重置折叠效果
        } else {
            appBarParams.setScrollFlags(0);//这个加了之后不可滑动
        }
        appBarChildAt.setLayoutParams(appBarParams);
    }
​​​​​​​
    @Override
    public void onPageScrollStateChanged(int state) {
    }
});

在网上大神的帖子中找到了关于setScrollFlags的参数说明:

https://blog.csdn.net/eyishion/article/details/80282204

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将 AppBarLayout 与 RecyclerView 使用,需要在布局文件中将它们嵌套在一起。具体实现步骤如下: 1. 在布局文件中定义 AppBarLayout 和 Toolbar 控件,用于显示顶部工具栏和标题栏。 ```xml <android.support.design.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways" /> </android.support.design.widget.AppBarLayout> </android.support.design.widget.CoordinatorLayout> ``` 2. 在 AppBarLayout 内部添加一个可折叠式的标题栏控件(CollapsingToolbarLayout),用于显示标题和背景图片等内容。 ```xml <android.support.design.widget.CollapsingToolbarLayout android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_scrollFlags="scroll|exitUntilCollapsed"> <ImageView android:id="@+id/image_view" android:layout_width="match_parent" android:layout_height="200dp" android:scaleType="centerCrop" android:src="@drawable/header_image" app:layout_collapseMode="parallax" /> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin" /> </android.support.design.widget.CollapsingToolbarLayout> ``` 3. 在布局文件中定义 RecyclerView 控件,用于显示列表内容。 ```xml <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> ``` 4. 在相应的 Activity 或 Fragment 中获取 RecyclerView 对象,并设置 Adapter 和 LayoutManager。 ```java RecyclerView recyclerView = findViewById(R.id.recycler_view); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(layoutManager); ``` 5. 在 AppBarLayout 中设置滚动监听器(OnOffsetChangedListener),根据滚动距离和状态改变工具栏的样式、大小和位置等效果。 ```java AppBarLayout appBarLayout = findViewById(R.id.app_bar_layout); appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { // 根据 verticalOffset 计算工具栏的高度和透明度等属性 // 更新工具栏的样式和位置等 } }); ``` 这样就可以实现一个带有 AppBarLayout 和 RecyclerView 的可滚动界面了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值