问题描述
我已经在我的 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)
}
}