微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Kotlin 中以编程方式设置 RelativeLayout 的所有属性?

如何解决如何在 Kotlin 中以编程方式设置 RelativeLayout 的所有属性?

我已经在我的 activity_main.xml 中的 Android 中创建了一个基本布局,最终将成为按钮的自定义视图。这是一个相对视图,其中三个圆圈堆叠在彼此的顶部,并在中心对齐。当用户与圆圈互动时,圆圈会改变大小。

我现在想完全在 Kotlin 代码中复制整个内容,因为它将使用数据库中的数据加载。

我想不通。这是清单...

        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"

然后在 Kotlin 中,我只能找到宽度和高度的 LayoutParams,但是我在哪里为相对布局设置所有这些东西?

class MyContainer : RelativeLayout () {

var button1 = MyButtonClass(someArgs)
var button2 = MyButtonClass(someArgs)
var button3 = MyButtonClass(someArgs)

init {
/// can't find out how to do this bit in Kotlin... 
///something like....
this.layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT
this.layoutConstraintBottomToBottomOf = PARENT
this.layoutConstraintHorizontalBias = 0.5
///etc...

//then add the circle buttons 
this.addView(button3)
this.addView(button2)
this.addView(button1)
}

}

我想我想做这样的事情:

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

        val appContainer = findViewById<ConstraintLayout>(R.id.appContainer)

        var buttonContainer = ButtonContainer(this.applicationContext)
        appContainer.addView(buttonContainer)
    }
}


class ButtonContainer (context: Context) : RelativeLayout(context) {

var button1 = CustomButton(context)

val buttonLayoutParams by lazy { ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.WRAP_CONTENT,ConstraintLayout.LayoutParams.WRAP_CONTENT).apply {
    bottomToBottom = ConstraintLayout.LayoutParams.PARENT_ID
    startToStart = ConstraintLayout.LayoutParams.PARENT_ID
    topToTop = ConstraintLayout.LayoutParams.PARENT_ID
    endToEnd = ConstraintLayout.LayoutParams.PARENT_ID
    horizontalBias = 0.5F
}
}

override fun onFinishInflate() {
    super.onFinishInflate()
    this.layoutParams = buttonLayoutParams
    this.addView(button1)
}

}


class CustomButton(context: Context) : ImageView(context) {

val layoutParams by lazy { RelativeLayout.LayoutParams(60,60).apply {
    addRule(RelativeLayout.CENTER_IN_PARENT,RelativeLayout.TRUE)
}
}


override fun onFinishInflate() {
    super.onFinishInflate()
    setLayoutParams(layoutParams)
    setBackgroundResource(squibcircle)
}

我是否在正确的轨道上?任何指针将不胜感激。

编辑:按照第一个答案,我可以设置布局属性,但是当我尝试在代码中重现我的原始清单树时,我的应用程序只是空白。我是否正确应用了这个?

(base) C:\>jupyter pixiedust install
←[32;1mStep 1: PIXIEDUST_HOME: C:\Pixiedust←[0m
        Keep y/n [y]? y
←[32;1mStep 2: SPARK_HOME: C:\Spark\spark-2.4.7-bin-hadoop2.7←[0m
        Keep y/n [y]? y
Traceback (most recent call last):
  File "C:\Anaconda3\Scripts\jupyter-pixiedust-script.py",line 33,in <module>
    sys.exit(load_entry_point('pixiedust','console_scripts','jupyter-pixiedust')())
  File "c:\pixiedust\install\pixiedustapp.py",line 41,in main
    PixiedustJupyterapp.launch_instance()
  File "C:\Anaconda3\lib\site-packages\traitlets\config\application.py",line 844,in launch_instance
    app.initialize(argv)
  File "C:\Anaconda3\lib\site-packages\traitlets\config\application.py",line 87,in inner
    return method(app,*args,**kwargs)
  File "C:\Anaconda3\lib\site-packages\traitlets\config\application.py",line 333,in initialize
    self.parse_command_line(argv)
  File "C:\Anaconda3\lib\site-packages\traitlets\config\application.py",line 684,in parse_command_line
    return self.initialize_subcommand(subc,subargv)
  File "C:\Anaconda3\lib\site-packages\traitlets\config\application.py",line 603,in initialize_subcommand
    self.subapp.initialize(argv)
  File "C:\Anaconda3\lib\site-packages\traitlets\config\application.py",**kwargs)
  File "C:\Anaconda3\lib\site-packages\jupyter_core\application.py",line 241,in initialize
    self.parse_command_line(argv)
  File "c:\pixiedust\install\createKernel.py",line 154,in parse_command_line
    spark_version = self.get_spark_version()
  File "c:\pixiedust\install\createKernel.py",line 379,in get_spark_version
    pyspark_out = subprocess.check_output([pyspark,"--version"],stderr=subprocess.STDOUT).decode("utf-8")
  File "C:\Anaconda3\lib\subprocess.py",line 411,in check_output
    return run(*popenargs,stdout=PIPE,timeout=timeout,check=True,File "C:\Anaconda3\lib\subprocess.py",line 489,in run
    with Popen(*popenargs,**kwargs) as process:
  File "C:\Anaconda3\lib\subprocess.py",line 854,in __init__
    self._execute_child(args,executable,preexec_fn,close_fds,line 1307,in _execute_child
    hp,ht,pid,tid = _winapi.CreateProcess(executable,args,OSError: [WinError 193] %1 is not a valid Win32 application

(base) C:\>

}

解决方法

您需要将 LayoutParams 转换为 ConstraintLayout.LayoutParams 来设置这些属性,如下所示

class ButtonContainer(context: Context) : RelativeLayout(context) {

    var button1 = CustomButton(context)

    val buttonLayoutParams by lazy { ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.WRAP_CONTENT,ConstraintLayout.LayoutParams.WRAP_CONTENT).apply {
           bottomToBottom = ConstraintLayout.LayoutParams.PARENT_ID
           startToStart = ConstraintLayout.LayoutParams.PARENT_ID
           topToTop = ConstraintLayout.LayoutParams.PARENT_ID
           endToEnd = ConstraintLayout.LayoutParams.PARENT_ID
           horizontalBias = 0.5F
        }
    }

    override fun onFinishInflate() {
        this.layoutParams = buttonLayoutParams
        this.addView(button1)
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。