Обновите layout_margin внутри класса kotlin для определенных элементов - PullRequest
0 голосов
/ 08 мая 2019

Итак, это должно быть довольно просто, но я новичок в 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 может визуально сталкиваться с другим элементом, поэтому мне нужно изменить свойства 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 принимает левые и правые поля, а не начальные и конечные поля.

1 Ответ

1 голос
/ 08 мая 2019

Вы можете обновить поля в 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>

Обновите свой класс даптера, как 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
}
...
}
...