添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

再看下约束布局如下:

<?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); 但是有个问题,这样修改完父布局后,子布局与...
一、什么是约束布局ConstraintLayoutConstraintLayout一个使用“相对定位”灵活地确定微件的位置和大小的一个布局,在 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是使用布局如LinearLayout 、RelativeLayout等来构建页面,但这些布局使用起来很麻烦,并且经常需要一层一层嵌套,写一个简单的页面就需要费很大的劲。所以在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应该也跟RelativityLayout或者LinearLayout一样,直接添加就行了。不过在查阅了开发文档和Stack Overflow之后,发现并不是这么简单。这里有个核心的类ConstraintSet,控
public class MyView extends View { private String TAG = &amp;amp;amp;quot;--------MyView&amp;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组件!如果您有其他问题,请随时问我。