Android VIewpager内部Coordinator布局占用了额外的可视空间
我有一个布局,其中我需要工具栏的上半部分和一些内容,然后是Android VIewpager内部Coordinator布局占用了额外的可视空间,android,android-layout,android-viewpager,android-coordinatorlayout,Android,Android Layout,Android Viewpager,Android Coordinatorlayout,我有一个布局,其中我需要工具栏的上半部分和一些内容,然后是ViewPager的下半部分,它需要根据布尔值隐藏 XML的框架如下所示: <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
ViewPager
的下半部分,它需要根据布尔值隐藏
XML的框架如下所示:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="?actionBarSize"/>
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.appbar.CollapsingToolbarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:expandedTitleGravity="bottom|center_horizontal"
app:layout_scrollFlags="scroll">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_collapseMode="none">
<TextView
style="@style/Medium.ExtraLarge"
android:layout_width="0dp"
android:layout_height="wrap_content"
tools:text="Title Something" />
<!--Other top section content -->
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout>
<androidx.viewpager.widget.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="@{(viewModel.isInBusinessManagement && (viewModel.hasActivePremium || viewModel.hasSuspendedPlan)) ? View.VISIBLE : View.GONE}"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
app:layout_collapseMode="pin"
tools:visibility="gone">
<com.google.android.material.tabs.TabLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/tab_background_2dp"
android:visibility="@{(viewModel.isInBusinessManagement && (viewModel.hasActivePremium || viewModel.hasSuspendedPlan)) ? View.VISIBLE : View.GONE}"
app:layout_collapseMode="pin"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
app:tabGravity="fill"
app:tabMode="fixed"
app:tabSelectedTextColor="@color/colorPrimary"
app:tabTextAppearance="@style/tab_text"
app:tabTextColor="@color/txtColorGrey" />
</androidx.viewpager.widget.ViewPager>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</LinearLayout>
正如您所看到的,我必须基于布尔值控制ViewPager
和TabLayout
的可见性,为此我使用了数据绑定
布局都很好,当需要显示时,我得到了预期的行为,但问题是当提到的条件(即viewModel.isInBusinessManagement&&;(viewModel.hasActivePremium | | viewModel.hasuspendplan)
为false,Viewpager和TabLayout不可见,但占用的空间与可见时相同
现在我知道View.INVISIBLE
有这种行为,但我显然是在用View.GONE
来表示false
的情况
另外,当我在根Linearlayout
、AppbarLayout
和CoordinatorLayout
上放置不同颜色时,底部的额外空间似乎来自CoordinatorLayout
您能帮我一下吗?当
viewpager
可见性
消失时,您可以停止滚动工具栏
noScroll
布局中的标志\u滚动标志将停止滚动折叠工具栏布局
<com.google.android.material.appbar.CollapsingToolbarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:expandedTitleGravity="bottom|center_horizontal"
app:layout_scrollFlags="@{(viewModel.isInBusinessManagement && (viewModel.hasActivePremium || viewModel.hasSuspendedPlan)) ? scroll : noScroll}">
我试图在本地解决这个问题,下面的代码对我很有用。您也可以尝试以下方法:
wrap\u parent
我认为只有从第五步的改变,你可以在现有的代码中实现结果。上述4个步骤是通过在绑定适配器中写入逻辑来更好地利用数据绑定。您能否尝试将
ViewPager
放在FrameLayout
中,并将app:layou行为
从寻呼机传输到此布局中。。不确定这是否有助于将其发布为answer@Zain是的,运气不好。额外的空间仍然存在。请记住一点:当您隐藏这些视图时,是否可以通过编程方式从查看页面
中删除app:layou behavior
,并且当您再次显示它们时,再次添加该行为。。我认为这个空间是由于协调布局行为造成的。。如果你在这方面需要帮助,请告诉我that@Zain是的,我确实怀疑额外的空间是由于CoordinatorLayout
行为造成的。在查看<代码>时,尝试从<代码>viewpager
中删除<代码>应用程序:布局行为
,然后再次在查看<代码>可见时以编程方式附加相同的行为是值得的,但我找不到任何方法。如果可以,请帮助我。要删除它:ViewPager ViewPager=findviewbyd(R.id.ViewPager);CoordinatorLayout.LayoutParams coordinatorParams=(CoordinatorLayout.LayoutParams)viewpager.getLayoutParams();coordinatorParams.setBehavior(空)代码>无法导入滚动标志
以使用滚动
和无滚动
,视图.消失
和视图.可见
执行val params=layoutViewPager.colling.layoutParams作为AppBarLayout.layoutParams;params.scrollFlags=0;layoutViewPager.Collaving.layoutParams=params
不起作用Hermay b这对您有帮助:虽然此答案已获得赏金,但此答案无法解决问题
@BindingAdapter(value = ["hasActivePremium", "isInBusinessManagement", "hasSuspendedPlan"], requireAll = true)
fun controlVPVisibility(view: ViewPager, hasActivePremium: Boolean, isInBusinessManagement:Boolean, hasSuspendedPlan:Boolean) {
view.visibility = if(isInBusinessManagement && (hasActivePremium || hasSuspendedPlan)) View.VISIBLE else View.GONE````<br/>
}
var isInBusinessManagement = MutableLiveData<Boolean>()
var hasActivePremium = MutableLiveData<Boolean>()
var hasSuspendedPlan = MutableLiveData<Boolean>()
<androidx.viewpager.widget.ViewPager
android:id="@+id/vpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/teal_700"
isInBusinessManagement="@{viewModel.isInBusinessManagement()}"
hasActivePremium="@{viewModel.hasActivePremium}"
hasSuspendedPlan="@{viewModel.hasSuspendedPlan}"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
app:layout_collapseMode="pin">
binding.viewModel = viewModel
binding.lifecycleOwner = this