¿Cómo explicar este extraño comportamiento al establecer márgenes programáticamente a una vista dentro de RelativeLayout?

Tengo un RelativeLayout dentro de un fragment de una de las tres tabs en un TabView. Ver esta captura de pantalla – gran cuadrado rosa es mi RelativeLayout: captura de pantalla

La vista que está dentro es el pequeño cuadrado azul en la esquina inferior derecha. Como el RelativeLayout es 300x300dp y el pequeño cuadrado es 8x8dp, si configuro su margen superior e izquierdo a 292dp, termina en esa esquina. Ahora quiero cambiar su position programáticamente, pero cuando lo hago, mis valores se siguen dividiendo por dos. Así que si cambio los márgenes de 292 a 292 termina en el centro de RelativeLayout, pero si configuro cada uno en 292 * 2, termina en la esquina. Tal vez hay alguien que sabe lo que está sucediendo aquí?

Este es mi file de layout:

<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <android.support.constraint.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:width="40dp" android:height="40dp" android:background="@color/colorAccent" android:text="Test!" /> <RelativeLayout android:layout_width="300dp" android:layout_height="300dp" android:background="@color/colorAccent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"> <View android:id="@+id/position_dot" android:layout_width="8dp" android:layout_height="8dp" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:background="@color/colorPrimary" android:layout_marginLeft="292dp" android:layout_marginTop="292dp"/> </RelativeLayout> </android.support.constraint.ConstraintLayout> </layout> 

y este es el método que uso para actualizar los márgenes:

  fun moveDotToCurrentPosition() { var params = positionDot.layoutParams as RelativeLayout.LayoutParams params.topMargin = 292 params.leftMargin = 292 positionDot.layoutParams = params } 

Traté de mantener el código corto y limitado a lo que sea relevante, si falta algo importante, por favor avíseme y lo incluyo. Estoy escribiendo éste en Kotlin, pero las respuestas de Java también serán útiles. Gracias.

    Casi todos los valores de dimensión de código Java que son solo raw int o float utilizan px unidades, no dp. Es muy probable que esté ejecutando su código en un dispositivo hdpi. Si es así, la densidad de su pantalla significa que 1dp == 2px , y esto explicaría por qué todo parece estar "dividido por 2".

    Puede encontrar su densidad de pantalla actual con un código como este:

     float density = [context].getResources().getDisplayMetrics().density; 

    Y luego puede multiplicar cualquier valor de dp por esta density para get los valores de px .

    Alternativamente, si está trabajando con dimensiones que ha almacenado como resources <dimen> , puede simplemente llamar a:

     int dimen = [context].getResources().getDimensionPixelSize(R.dimen.my_dimen); 

    Los valores que está utilizando para actualizar sus márgenes están en tamaño px

     params.topMargin = 292 params.leftMargin = 292 

    Si desea cambiarlos a 292dp, debe cargar un recurso de dimensión o multiplicar el valor de visualización. Densidad métrica

    Puedes usar la function anko dip

     fun Context.dip(value: Int): Int = (value * resources.displayMetrics.density).toInt() 

    Tu código se verá así:

     params.topMargin = dip(292) params.leftMargin = dip(292) 

    Tal vez esto pueda solucionar su problema.