Android - ConstraintLayout做内容占位(
2019-08-19 本文已影响1人
MonkeyLei
最近重构工程,想把BaseActivity, BaseFragment封装到更好,更集中管理一些。目前还比较可以,也将权限管理封装到了基础页面,采用的是官方的easypermissions库,还不错!官方的足够用了。
然后像基础页面增加标题栏,内容区域的自定义处理。BaseActivity则默认提供统一标题栏样式,图标点击给回调即可。可以选择不显示标题栏。
然后就想着这样:
activity_base.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.constraint.ConstraintLayout
android:id="@+id/ab_titleRoot"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="10dp"
android:paddingBottom="10dp"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/ab_settingBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:scaleType="centerCrop"
android:src="@drawable/shareicon"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ScrollView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:scrollbarStyle="outsideOverlay"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/ab_right"
app:layout_constraintStart_toEndOf="@+id/ab_settingBack"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/ab_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="6dp"
android:layout_marginRight="6dp"
android:ellipsize="end"
android:gravity="center"
android:singleLine="true"
android:text="标题标题标题标题标题标题标题标题"
android:textColor="@color/text_color"
android:textSize="22sp" />
</ScrollView>
<ImageView
android:id="@+id/ab_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:scaleType="centerCrop"
android:src="@drawable/shareicon"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
<android.support.constraint.ConstraintLayout
android:id="@+id/ab_contentRoot"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@color/colorPrimaryDark"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/ab_titleRoot" />
</android.support.constraint.ConstraintLayout>
上标题,下内容
image然后基础页面想着如下处理:
image分开看貌似布局都没问题。。。但是.....
activity_main.xml - 当这个布局被加载的时候:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
tools:context=".app.MainActivity">
<android.support.constraint.ConstraintLayout
android:id="@+id/am_fragmentContent"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/am_bottomNavBar"
app:layout_constraintTop_toTopOf="parent" />
<com.ashokvarma.bottomnavigation.BottomNavigationBar
android:id="@+id/am_bottomNavBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent" />
</android.support.constraint.ConstraintLayout>
image
运行发现出问题了啦:
image然后就看布局,感觉没问题呀。。。怎么回事了。。是第三方框架可能存在的特殊情况?感觉不像,我都是约束布局,理论上都处理好了呀。怎么会出现这种情况呢?
然后早上来,我想着改成FrameLayout做内容占位ViewGroup, 内容布局都添加到这个里面。
<FrameLayout
android:id="@+id/ab_contentRoot"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@color/colorPrimaryDark"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/ab_titleRoot" />
image
目前是搞定了。
接下来要做的事情是,尝试去分析一下,是什么导致了这种情况???
网友比较热心,发现了构建布局参数的问题,如下:
image我们既然选择约束布局作为占位,那我们创建内容布局的时候则需要这个root
作为约束的要素!很nice呀....并且最后一个参数(第三个参数)也要填写 true,这样父布局的宽高约束就会正常了!否则就死丢丢了...
看来View.inflate和LayoutInflater.inflate(need to do)有必要了解下了...一直再用,就是没看过,我擦勒!