使用可折叠工具栏和页面适配器时不正确调用请求布局

Posted

技术标签:

【中文标题】使用可折叠工具栏和页面适配器时不正确调用请求布局【英文标题】:Request Layout Improperly Called when using Collapsible Toolbar and Page Adapter 【发布时间】:2017-01-06 14:41:14 【问题描述】:

我收到以下错误的无限循环:

W/View: requestLayout() improperly called by android.support.v7.widget.AppCompatTextView9968cfe V.ED..... ......ID 64,0-1376,301 #7f0c008a app:id/project_name during layout: running second layout pass
I/ViewRootImpl: requestLayoutDuringLayout is already in process
I/ViewRootImpl: requestLayoutDuringLayout is already in process
I/ViewRootImpl: requestLayoutDuringLayout is already in process

我有一个CoordinatorLayout,它在AppBarLayout 中包含一个CollapsingToolbarLayout。在AppBarLayout 之外,我有一个ViewPager。当CollapsingToolbarLayout 被折叠时,上面的错误信息开始无限循环。

CollapsingToolbarLayout 关闭时,我有一个监听器,以便我可以隐藏和显示一些视图。

@Override public void onOffsetChanged(final AppBarLayout appBarLayout, final int verticalOffset) 
    if (scrollRange == -1) 
        scrollRange = appBarLayout.getTotalScrollRange();
    

    if (scrollRange + verticalOffset == 0 && !isShow) 
        view.showToolbarTitle(true);
        isShow = true;
     else if (isShow) 
        view.showToolbarTitle(false);
        isShow = false;
    

当我删除此侦听器时,错误停止。我假设正在发生的是onOffsetChanged(AppBarLayout, int)CollapsingToolbarLayout 折叠时不断地被调用。但这没有任何意义,因为没有任何偏移量被改变。有没有人知道为什么会发生这种情况?

【问题讨论】:

尝试进入 view.showToolbarTitle() 并查看该方法调用的结果。 我通过添加 ` else if (isShow && scrollRange + verticalOffset > 0) ` 解决了无限请求布局,但即使我没有触摸工具栏,onOffsetChanged 侦听器仍然会不断被调用 感谢您的帮助 @Karakuri .由于 onOffsetChanged 侦听器,只是我一遍又一遍地调用相同的视图调用 【参考方案1】:

对于科特林 如果您在此处设置任何视图的值,它将被requestLayout 进程警告淹没。 您可以尝试查看可见性gone / visible

private fun addListener()
        var isShow = false
        var scrollRange = -1
        tvUserTitle.text = "Hasnine"

        ioCoroutineScope.launch 
            appBar.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener  barLayout, verticalOffset ->


                if (scrollRange == -1) 
                    scrollRange = barLayout?.totalScrollRange!!
                
                if (scrollRange + verticalOffset == 0) 
                    //tvTitleHome.title = "Hasnine"
                    //toolbarCollapse.title = "hello world"

                    isShow = true
                    showTitle(isShow)

                 else if (isShow) 
                    //tvTitleHome.title = "" //careful there should a space between double quote otherwise it wont work

                    isShow = false
                    showTitle(isShow)
                
            )
        


private fun showTitle(show: Boolean)
        if(show)
            tvUserTitle.visibility = View.VISIBLE
        else
            tvUserTitle.visibility = View.GONE
        
    

【讨论】:

以上是关于使用可折叠工具栏和页面适配器时不正确调用请求布局的主要内容,如果未能解决你的问题,请参考以下文章

折叠工具栏布局 |滚动和布局问题 2

安卓Design包之CollapsingToolbarLayout(可折叠的工具栏布局)的简单使用

如何在折叠布局下的 CoordinatorLayout 中正确对齐元素?

FlutterAndroidFlutter 折叠屏适配 ( 展开大屏 | 折叠主屏 | 折叠副屏 | 静态展示 | 动态热切换适配 | 拉伸布局 | X 轴自适应适配 | 布局重构 )

如何在android中单击listview适配器时展开和折叠视图

Android折叠屏适配基于AutoSize框架适配折叠屏并兼容多窗口模式