0

所以,这应该是非常基本的,但我是 Kotlin 的新手。所以我基本上有以下ImageView观点RelativeLayout

<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可能会与另一个元素在视觉上发生碰撞,所以我必须修改marginStartmarginEnd属性。我在一些教程中看到,首先我必须获得当前的布局边距或类似的东西,但我不知道为什么这么复杂,在 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 函数接受左右边距,而不是开始和结束边距。

4

1 回答 1

1

您可以在视图的 layoutParams 中更新边距

前任:

    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) ,它将以像素为单位而不是 dp。

所以使用如下边距值。

<dimen name="spacing_normal">16dp</dimen>
<dimen name="spacing_small">8dp</dimen>
<dimen name="spacing_tiny">4dp</dimen>

像贝洛一样更新你的适配器类

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
}
...
}
于 2019-05-08T05:19:20.487 回答