gpt4 book ai didi

android - 如何在CoordinatorLayout内部的CollapsingToolbarLayout下面将 View 居中

转载 作者:行者123 更新时间:2023-11-29 02:18:48 25 4
gpt4 key购买 nike

当在CoordinatorLayout中包含CollapsingToolbarLayout时,您需要使用app:layout_behavior =“ @ string / appbar_scrolling_view_behavior”,以便工具栏下方的视图向下移动到工具栏的高度,但是在这种情况下,工具栏下方的视图超出了底部,因此,如果我想在工具栏和屏幕底部之间居中放置某个内容,那真的不可能吗?

这是我的代码:

<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical">

<include layout="@layout/generic_toolbar_collapsing" />

<LinearLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">

<TextView
android:id="@android:id/empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="@string/list_view_empty_string"
android:visibility="gone"
tools:visibility="visible" />

</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>


这是布局编辑器的屏幕截图:

enter image description here

图片上的选定视图是LinearLayout,您可以看到圆点如何超出底部窗口线,因此文本位于视图内部居中位置,而不是相对于工具栏和窗口底部居中,是否有可能实现这个?

最佳答案

我认为为时已晚,但也许有人会使用我的解决方案。我创建了一个LinearLayout,将其内容动态地置于窗口内部。

class WindowCenteredLinearLayout : LinearLayout {

private val windowLocation = IntArray(2)

constructor(context: Context?) : super(context)

constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int)
: super(context, attrs, defStyleAttr)

constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int)
: super(context, attrs, defStyleAttr, defStyleRes)

private val onGlobalLayoutListener = ViewTreeObserver.OnPreDrawListener {
val oldCoords = windowLocation.copyOf()
getLocationInWindow(windowLocation)
if (!oldCoords.contentEquals(windowLocation)) {
for (i in 0 until childCount) {
val child = getChildAt(i)
child.translationX = -windowLocation[0].toFloat() / 2F
child.translationY = -windowLocation[1].toFloat() / 2F
}
}
true
}

override fun onAttachedToWindow() {
super.onAttachedToWindow()
viewTreeObserver.addOnPreDrawListener(onGlobalLayoutListener)
}

override fun onDetachedFromWindow() {
viewTreeObserver.removeOnPreDrawListener(onGlobalLayoutListener)
super.onDetachedFromWindow()
}
}


我的布局看起来像这样

<com.ns.shoplist.ui.view.AppCoordinatorLayout>

<com.google.android.material.appbar.AppBarLayout/>

<com.ns.shoplist.ui.view.AppFrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">

<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false" />

<include
android:id="@+id/emptyView"
layout="@layout/app_stub" />

</com.ns.shoplist.ui.view.AppFrameLayout>




app_stub在哪里

<?xml version="1.0" encoding="utf-8"?>
<com.ns.shoplist.ui.view.WindowCenteredLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:visibility="gone"
tools:visibility="visible">

<ImageView />

<TextView />




结果为 Expanded state Collapsed State

关于android - 如何在CoordinatorLayout内部的CollapsingToolbarLayout下面将 View 居中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57776220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com