再看下约束布局如下:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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:id="@+id/cl_box"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_widget"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="你点一下,看看能不能改变我的位置?"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/bt_change"
android:onClick="changeLocation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="约束布局动态代码改变上面文字的位置"
app:layout_constraintTop_toBottomOf="@+id/tv_widget" />
</androidx.constraintlayout.widget.ConstraintLayout>
需求如上图:我需要手动点击按钮改变文字的位置,在约束布局中唯一快速想到的办法就是代码动态设置约束条件
所以有了如下代码
package cn.yhsh.appwidget
import android.os.Bundle
import android.view.Gravity
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
class MainActivity : AppCompatActivity() {
private lateinit var clBox: ConstraintLayout
private lateinit var tvWidget: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
tvWidget = findViewById(R.id.tv_widget)
tvWidget.gravity = Gravity.START.or(Gravity.TOP)
clBox = findViewById(R.id.cl_box)
fun changeLocation(view: View) {
val constraintSet = ConstraintSet()
//克隆约束布局
//注意下面这个方法要求约束布局内的所有子控件都必须设置id值,否则会抛出如下异常:
//Caused by: java.lang.RuntimeException: All children of ConstraintLayout must have ids to use ConstraintSet
constraintSet.clone(clBox)
//先清除之前的约束条件,方便我们重新设置约束条件
// 注意:下面的textview清除约束条件后相当于是一个全新的TextView,所以需要手动设置下它的宽高
constraintSet.clear(R.id.tv_widget)
//设置下面的约束条件,第一个参数是需要设置的控件的id,第二和第四是约束条件居左、居右、居上、居下等,第三个参数是第一个参数的参照物,居那个控件的那个位置
constraintSet.connect(
R.id.tv_widget,
ConstraintSet.LEFT,
ConstraintSet.PARENT_ID,
ConstraintSet.LEFT
//下面意思就是tv_widget在父控件(xml中对应app:layout_constraintRight_toRightOf="parent")
constraintSet.connect(
R.id.tv_widget,
ConstraintSet.RIGHT,
ConstraintSet.PARENT_ID,
ConstraintSet.RIGHT
constraintSet.connect(
R.id.tv_widget,
ConstraintSet.BOTTOM,
ConstraintSet.PARENT_ID,
ConstraintSet.BOTTOM
//设置约束条件生效
constraintSet.applyTo(clBox)
//设置具体底部的距离
val layoutParams = tvWidget.layoutParams as ConstraintLayout.LayoutParams
//下面代码是手动设置TextView宽高的方法
layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT
layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT
tvWidget.gravity = Gravity.CENTER
layoutParams.bottomMargin = 50
兄弟们上面的坑我已经踩完了,都已注释,具体可以看注释,在此非常感谢二位大佬无私分享
约束布局动态代码
在传统布局方式中,如果要改变某个控件的位置,需要获取 LayoutParams , 后台修改属性值就行了。
但是在约束布局 ConstraintLayout 中,要改变控件的约束条件,需要用到 ConstraintSet 类。主要有 5 个步骤
第一步:创建 ConstraintSet() 实例
val set = ConstraintSet()
第二步:需要复制一份父布局的约束,方法有三个如下
set.clone(constraintLayout: ConstraintLayout);
ConstraintLayout.LayoutParams params = new ConstraintLayout.LayoutParams(width,height);
holder.catView.setLayoutParams(paramsView);
但是有个问题,这样修改完父布局后,子布局与...
一、什么是约束布局(ConstraintLayout)
ConstraintLayout 是一个使用“相对定位”灵活地确定微件的位置和大小的一个布局,在 2016 年 Google I/O 中面世,它的出现是为了解决开发中过于复杂的页面层级嵌套过多的问题——层级过深会增加绘制界面需要的时间,影响用户体验,以灵活的方式定位和调整小部件。
ConstraintLayout 是一个ViewGroup,可以在Api9以上的Android系统使用它,它的出现主要是为了解决布局嵌套过多的问题,以灵活的方式定位和调整小
动态设置ConstraintLayout约束
以前一直是在
布局里直接
设置ConstraintLayout的
约束,前几天遇到了
一个有点特殊的需求,需要
动态设置布局,xml
布局使用的
ConstraintLayout,所以就立马恶补
动态设置ConstraintLayout约束的知识,总结如下。
获取要
设置目标控件的父
布局。
val
constraintLayoutRoot = getView<
ConstraintLayout>(R.id.
constraint_dynamics_root)
很久没写文章了,但是针对今天这篇文章还是值得记录下,供大家参考学习,目前布局中用ConstraintLayout(简称cons)应该很常见了,至于为什么要用这个布局,我想大家用过的都知道cons没有出现之前稍微复杂点的界面就各种嵌套,对于维护,修改也不是很方便。cons它作用就是控件与控件直接约束,不需要额外的嵌套。好了说下今天的正题:
1.首先了解下cons中的Margin属性:
cons中用Margin属性必须有个条件就是约束,比如你要设置marginStart=15dp.那么你必须有个横向约束,要
在以前,
android是使用
布局如Linear
Layout 、Relative
Layout等来构建页面,但这些
布局使用起来很麻烦,并且经常需要一层一层嵌套,写
一个简单的页面就需要费很大的劲。所以在16年I/O大会上,google发布了全新的
布局-
ConstraintLayout,其他
布局和
ConstraintLayout比起来,根本就没有存在的必要了...
ConstraintLayout具有以下优势:
较高的性能优势。
本文根据本人学习和使用记录的内容。
ConstraintLayout,比较牛逼的一种布局,结合了其他几种布局的优点,也可以看做RelativeLayout的升级版。
使用ConstraintLayout需要引入:
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
首先很重要也是很基础的几个属性
app:...
最近
一个需求需要
动态添加删除
ConstraintLayout里的元素,一时不知道如何处理。虽然
ConstraintLayout确实减少了层级,提升了绘制效率,但对于
动态增删却一直没有尝试过。借着这个需求也好好调研了下
ConstraintLayout的一些相关属性。
按照以往的经验,增删view应该也跟Relativity
Layout或者Linear
Layout一样,直接添加就行了。不过在查阅了
开发文档和Stack Overflow之后,发现并不是这么简单。这里有个核心的类
ConstraintSet,控
public class MyView extends View {
private String TAG = &amp;amp;quot;--------MyView&amp;amp;quot;;
private int width, height;
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
modifier = Modifier
.background(color = if (selected) Color.Blue else Color.Gray)
.padding(16.dp)
content()
在上面的代码中,我们使用Box组件来创建一个容器,并将背景颜色设置为选中时为蓝色,未选中时为灰色。我们还添加了16dp的内边距来使容器更具可读性。最后,我们使用content参数来呈现任何传递给SelectionContainer组件的内容。
希望这可以帮助您创建您自己的SelectionContainer组件!如果您有其他问题,请随时问我。