gpt4 book ai didi

android - 是否可以轻松地将 CoordinatorLayout 内的 AppBarLayout 下方的 View 内容居中?

转载 作者:太空狗 更新时间:2023-10-29 13:52:11 25 4
gpt4 key购买 nike

背景

假设您有一个带有 CoordinatorLayout 和 AppBarLayout 的滚动 Activity ,其中您有一个顶部标题,它可以在底部滚动时折叠(可能有一个 RecyclerView 或 NestedScrollView)。

像这样:

enter image description here

现在,您需要在底部区域(显示文本的位置)的中心放置一个加载 View (例如,LinearLayout 中的一个 ProgressBar 和一个 TextView),然后再显示内容。

问题

我使用 ViewAnimator 在状态之间切换,但如果我选择将加载 View 居中,它会显示在中心下方,因为底部区域占用的空间更多(因为您可以滚动它)。

enter image description here

我尝试了什么

我已经执行了 2 种效果很好的解决方案:1.获取loading view及其parent的大小,并用它来计算loading view的top margin2. 将loading view的bottom padding设置为upper area size的一半(本例中为90dp,也就是upper area 180dp的一半)。这稍微容易一些,但是如果 Activity 中任何内容的 UI 或底部区域的父项发生变化,就会破坏位于中心的修复。

代码

与 IDE 向导中的几乎相同,但这里:

滚动 Activity .java

public class ScrollingActivity extends AppCompatActivity {
private ViewAnimator mViewAnimator;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scrolling);
setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
mViewAnimator = findViewById(R.id.viewAnimator);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_scrolling, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
mViewAnimator.showNext();
return true;
}
return super.onOptionsItemSelected(item);
}
}

res/layout/activity_scrolling.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.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:layout_width="match_parent"
android:layout_height="match_parent" android:fitsSystemWindows="true"
tools:context="com.example.user.myapplication.ScrollingActivity">

<android.support.design.widget.AppBarLayout
android:id="@+id/app_bar" android:layout_width="match_parent" android:layout_height="@dimen/app_bar_height"
android:fitsSystemWindows="true" android:theme="@style/AppTheme.AppBarOverlay">

<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/toolbar_layout" android:layout_width="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true" app:contentScrim="?attr/colorPrimary"
app:layout_scrollFlags="scroll|exitUntilCollapsed" app:toolbarId="@+id/toolbar">

<android.support.v7.widget.Toolbar
android:id="@+id/toolbar" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin"
app:popupTheme="@style/AppTheme.PopupOverlay"/>

</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>

<ViewAnimator
android:id="@+id/viewAnimator" android:layout_width="match_parent" android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">

<LinearLayout
android:id="@+id/loader" android:layout_width="match_parent" android:layout_height="match_parent"
android:gravity="center" android:orientation="vertical">

<ProgressBar
android:layout_width="wrap_content" android:layout_height="wrap_content"/>

<TextView
android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="loading"/>

</LinearLayout>

<android.support.v4.widget.NestedScrollView
android:id="@+id/contentView" android:layout_width="match_parent" android:layout_height="match_parent">

<TextView
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_margin="@dimen/text_margin" android:text="@string/large_text"/>

</android.support.v4.widget.NestedScrollView>
</ViewAnimator>

</android.support.design.widget.CoordinatorLayout>

res/menu/menu_scrolling.xml

<menu 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" tools:context="com.example.user.myapplication.ScrollingActivity">
<item
android:id="@+id/action_settings" android:orderInCategory="100" android:title="click"
app:showAsAction="always"/>
</menu>

问题

问题是,我可以自己计算,但我想知道是否有其他简单的方法可以做到这一点。也许是某种我不知道的旗帜?

我问这个是因为真实应用程序的底部区域更复杂(上面的示例是为了演示问题),有一个 fragment 甚至是一个包含多个 fragment 的 TabLayout&ViewPager,所以计算父级的东西有点奇怪为此目的在这些 fragment 中的 Activity 。

不仅如此,我在底部还有一个 tabLayout(属于 Activity),这让考虑到它更加烦人。

最佳答案

尝试自定义行为。

class ViewBelowAppBarBehavior @JvmOverloads constructor(
context: Context? = null, attrs: AttributeSet? = null) : CoordinatorLayout.Behavior<View>(context, attrs) {

override fun layoutDependsOn(parent: CoordinatorLayout?, child: View?, dependency: View?) = dependency is AppBarLayout

override fun onDependentViewChanged(parent: CoordinatorLayout?, child: View?, dependency: View?): Boolean {
val appBar = dependency as AppBarLayout
// т.к. y - отрицательное число
val currentAppBarHeight = appBar.height + appBar.y
val parentHeight = parent?.height ?: 0
val placeHolderHeight = (parentHeight - currentAppBarHeight).toInt()
child?.layoutParams?.height = placeHolderHeight
child?.requestLayout()
return false
}
}

关于android - 是否可以轻松地将 CoordinatorLayout 内的 AppBarLayout 下方的 View 内容居中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45352726/

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