为特定元素更新 kotlin class 内的 layout_margin
Update layout_margin inside kotlin class for specific elements
所以,这应该是非常基础的,但我是 Kotlin 的新手。所以我基本上在 RelativeLayout
视图中有以下 ImageView
。
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:srcCompat="@drawable/moon_0"
android:id="@+id/imagen_luna"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:layout_alignParentStart="true"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_alignParentTop="true" />
问题是,在某些情况下,此 ImageView
可能会与另一个元素在视觉上发生冲突,因此我必须修改 marginStart
和 marginEnd
属性。我在一些教程中看到首先我必须获得当前的布局边距或类似的东西,但我不确定为什么这么复杂,在Swift中我只是修改每个边距的属性。
是否有一种简单的方法可以实现此目的,或者万一没有最简单的方法可以做到这一点?
更新 - 在适配器中添加了代码
这是我的适配器中针对此特定 ImageView
:
的代码
override fun onBindViewHolder(holder: AnoViewHolder, position: Int) {
...
if(respec.nombre_icono_signo != "" && respec.imagen_luna != "") {
val layoutParamsLuna = holder.view?.imagen_luna.layoutParams as RelativeLayout.LayoutParams
layoutParamsLuna.setMargins(1, 8, 15, 8)
holder.view?.imagen_luna.layoutParams = layoutParamsLuna
}
...
}
问题是这什么都不做,我的理论是 setMargins 函数接受左右边距,而不是开始和结束边距。
您可以在视图的布局参数中更新边距
例如:
val layoutParams= imagen_luna.layoutParams as RelativeLayout.LayoutParams
layoutParams.marginEnd=resources.getDimension(your_dimension).toInt()
layoutParams.marginStart=resources.getDimension(your_dimension).toInt()
layoutParams.bottomMargin=resources.getDimension(your_dimension).toInt()
layoutParams.topMargin=resources.getDimension(your_dimension).toInt()
//or
layoutParams.setMargins(start,top,end,bottom)
imagen_luna.layoutParams=layoutParams
如果您像这样设置 setMargins(1, 8, 15, 8),则必须在维度 file.because 中添加边距值,它的边距将以像素而不是 dp 为单位。
所以使用如下边距值。
<dimen name="spacing_normal">16dp</dimen>
<dimen name="spacing_small">8dp</dimen>
<dimen name="spacing_tiny">4dp</dimen>
更新你的 dapter class 喜欢 belo
override fun onBindViewHolder(holder: AnoViewHolder, position: Int) {
...
if(respec.nombre_icono_signo != "" && respec.imagen_luna != "") {
val layoutParamsLuna = holder.view?.imagen_luna.layoutParams as RelativeLayout.LayoutParams
layoutParamsLuna.setMargins(context.resources.getDimension(R.dimen.spacing_normal).toInt(),
context.resources.getDimension(R.dimen.spacing_normal).toInt(),
context.resources.getDimension(R.dimen.spacing_normal).toInt(),
context.resources.getDimension(R.dimen.spacing_normal).toInt())
holder.view?.imagen_luna.layoutParams = layoutParamsLuna
}else{
//reset margin for else case because recylerview reuse views so it's will keep previous states
}
...
}
所以,这应该是非常基础的,但我是 Kotlin 的新手。所以我基本上在 RelativeLayout
视图中有以下 ImageView
。
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:srcCompat="@drawable/moon_0"
android:id="@+id/imagen_luna"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:layout_alignParentStart="true"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_alignParentTop="true" />
问题是,在某些情况下,此 ImageView
可能会与另一个元素在视觉上发生冲突,因此我必须修改 marginStart
和 marginEnd
属性。我在一些教程中看到首先我必须获得当前的布局边距或类似的东西,但我不确定为什么这么复杂,在Swift中我只是修改每个边距的属性。
是否有一种简单的方法可以实现此目的,或者万一没有最简单的方法可以做到这一点?
更新 - 在适配器中添加了代码
这是我的适配器中针对此特定 ImageView
:
override fun onBindViewHolder(holder: AnoViewHolder, position: Int) {
...
if(respec.nombre_icono_signo != "" && respec.imagen_luna != "") {
val layoutParamsLuna = holder.view?.imagen_luna.layoutParams as RelativeLayout.LayoutParams
layoutParamsLuna.setMargins(1, 8, 15, 8)
holder.view?.imagen_luna.layoutParams = layoutParamsLuna
}
...
}
问题是这什么都不做,我的理论是 setMargins 函数接受左右边距,而不是开始和结束边距。
您可以在视图的布局参数中更新边距
例如:
val layoutParams= imagen_luna.layoutParams as RelativeLayout.LayoutParams
layoutParams.marginEnd=resources.getDimension(your_dimension).toInt()
layoutParams.marginStart=resources.getDimension(your_dimension).toInt()
layoutParams.bottomMargin=resources.getDimension(your_dimension).toInt()
layoutParams.topMargin=resources.getDimension(your_dimension).toInt()
//or
layoutParams.setMargins(start,top,end,bottom)
imagen_luna.layoutParams=layoutParams
如果您像这样设置 setMargins(1, 8, 15, 8),则必须在维度 file.because 中添加边距值,它的边距将以像素而不是 dp 为单位。
所以使用如下边距值。
<dimen name="spacing_normal">16dp</dimen>
<dimen name="spacing_small">8dp</dimen>
<dimen name="spacing_tiny">4dp</dimen>
更新你的 dapter class 喜欢 belo
override fun onBindViewHolder(holder: AnoViewHolder, position: Int) {
...
if(respec.nombre_icono_signo != "" && respec.imagen_luna != "") {
val layoutParamsLuna = holder.view?.imagen_luna.layoutParams as RelativeLayout.LayoutParams
layoutParamsLuna.setMargins(context.resources.getDimension(R.dimen.spacing_normal).toInt(),
context.resources.getDimension(R.dimen.spacing_normal).toInt(),
context.resources.getDimension(R.dimen.spacing_normal).toInt(),
context.resources.getDimension(R.dimen.spacing_normal).toInt())
holder.view?.imagen_luna.layoutParams = layoutParamsLuna
}else{
//reset margin for else case because recylerview reuse views so it's will keep previous states
}
...
}