如何复制和修改 LayoutParams 以在以编程方式创建的小部件上设置它们?

问题描述

我的目标是以编程方式创建 TextView 小部件并将其添加到 ConstraintLayout,相对于另一个小部件以不同角度围绕圆形定位,即使用圆形布局约束。

在我的 activity.xml 中,我添加一个以布局居中的 TextView txtCentred,以及一个使用圆形约束相对于此定位的 TextView txtPositioned

在运行时,我将新的 TextView 小部件添加到视图中。对于每个新的小部件,我复制 txtPositioned.LayoutParams修改副本的 circleAngle 字段,并在新的 TextView 上设置副本

我得到的结果是所有的 TextView 都被定位在同一个地方,就好像它们是使用我创建的最后一个 LayoutParams 定位的。它们的大小也都使用我添加的最后一个 TextView 的大小。看起来即使 LayoutParams 是单独的副本,它们也都链接到幕后的某个单一对象。

我注意到的一件事是所有不同的 LayoutParams 对象的“ConstraintWidget”都具有相同的哈希码。但也许这只是 txtCentred 小部件?

在模拟器中运行的应用的屏幕截图,显示了位于同一位置的所有小部件:

enter image description here

清单 xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
        android:id="@+id/parentLayout">

    <TextView
            android:id="@+id/txtCentred"
            android:text="X"
            android:layout_width="wrap_content" android:layout_height="wrap_content"

            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toTopOf="parent"/>

    <TextView
            android:id="@+id/txtPositioned"
            android:text="R"
            android:layout_width="wrap_content" android:layout_height="wrap_content"

            app:layout_constraintCircle="@id/txtCentred"
            app:layout_constraintCircleRadius="80dp"
            app:layout_constraintCircleAngle="10"
            android:fontFamily="sans-serif-black"
            app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

活动类

package com.example.myapplication

import android.graphics.Color
import android.os.Build
import android.os.Bundle
import android.view.View
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout

class MainActivity : AppCompatActivity() {

    // Add a TextView,circular positioning
    @RequiresApi(Build.VERSION_CODES.M)
    fun AddTextView(text: String,atangle: Float,parent: ConstraintLayout,layoutParamsSource: TextView):TextView {
        var newWidget = TextView(this)
        parent.addView(newWidget)
        newWidget.setTextAppearance(R.style.TextAppearance_AppCompat_Large)
        var layoutParamscopy =
            ConstraintLayout.LayoutParams(layoutParamsSource.layoutParams as ConstraintLayout.LayoutParams)
        layoutParamscopy.circleAngle = atangle
        newWidget.layoutParams = layoutParamscopy
        newWidget.setText(text)
        newWidget.scaleX = 5.0F
        newWidget.scaleY = 5.0F
        return newWidget
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var parentLayout = findViewById<View>(R.id.parentLayout) as ConstraintLayout
        var txtPositioned = findViewById<View>(R.id.txtPositioned) as TextView;

        // add 4 TextViews in cardinal directions relative to txtCentred
        var o = AddTextView("O",0.0F,parentLayout,txtPositioned)
        o.setTextColor(Color.parseColor("#80ff0000"))
        var k = AddTextView("K",90.0F,txtPositioned)
        k.setTextColor(Color.parseColor("#8000ff00"))
        k.scaleX = 5.0F
        var a = AddTextView("A",180.0F,txtPositioned)
        a.setTextColor(Color.parseColor("#800000ff"))
        a.scaleX = 5.0F
        var y = AddTextView("Y",270.0F,txtPositioned)
        y.setTextColor(Color.parseColor("#80ff8000"))
        y.scaleX = 5.0F


        Log.d("d","o=${(o.layoutParams as ConstraintLayout.LayoutParams).circleAngle}")
        Log.d("d","k=${(k.layoutParams as ConstraintLayout.LayoutParams).circleAngle}")
        Log.d("d","a=${(a.layoutParams as ConstraintLayout.LayoutParams).circleAngle}")
        Log.d("d","y=${(y.layoutParams as ConstraintLayout.LayoutParams).circleAngle}")
    }
}

LogCat 调试输出显示每个小部件的不同 circleAngle 值:

2021-07-10 15:16:10.569 29143-29143/com.example.myapplication D/d: o=0.0
2021-07-10 15:16:10.569 29143-29143/com.example.myapplication D/d: k=90.0
2021-07-10 15:16:10.569 29143-29143/com.example.myapplication D/d: a=180.0
2021-07-10 15:16:10.569 29143-29143/com.example.myapplication D/d: y=270.0

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...