Frage Androide setzen programmatisch Marge


Nachdem ich eine Taste gedrückt habe, möchte ich ein Textfeld programmatisch von der aktuellen Position + 20 Rand nach links verschieben.

Das ist meine XML-Datei:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingTop="5dp"
    android:paddingBottom="5dp">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/txtField"
        android:layout_below="@+id/txtField2"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginLeft="20dp"
        android:layout_toLeftOf="@+id/Seperator"
        android:layout_toStartOf="@+id/Seperator"
        android:layout_marginRight="10p" />

    ....


</RelativeLayout>

Ich habe diesen Code ausprobiert:

parameter = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
parameter.setMargins(30, 32, 10, 0); // left, top, right, bottom
txtField.setLayoutParams(parameter);

das funktioniert halb optimal. Gibt es eine Möglichkeit, alle Werte einer XML-Datei zu verwenden und nur den Wert für den linken Rand programmgesteuert zu ändern?


8
2018-03-20 14:19


Ursprung


Antworten:


Probieren Sie diesen Code aus:

parameter =  (RelativeLayout.LayoutParams) txtField.getLayoutParams();
parameter.setMargins(leftMargin, parameter.topMargin, parameter.rightMargin, parameter.bottomMargin); // left, top, right, bottom
txtField.setLayoutParams(parameter);

8
2018-03-20 14:29



Ja,

Nehmen Sie zum Beispiel die folgende Methode, die den linken Rand einer bestimmten Ansicht aktualisiert:

public static void setMarginLeft(View v, int left) {
    ViewGroup.MarginLayoutParams params =   
                                (ViewGroup.MarginLayoutParams)v.getLayoutParams();
    params.setMargins(left, params.topMargin, 
                            params.rightMargin, params.bottomMargin);
}

9
2018-03-20 14:21



Sie können es auch versuchen

ImageView _circle=(ImageView) findViewById(R.id.image);
ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) _circle.getLayoutParams();
int _20 = (int)getResources().getDimension(R.dimen.image_margin); 
// Directly set 20
mlp.setMargins(_20, _20, _20, _20);

4
2018-03-20 14:54



Wenn Sie Kotlin verwenden, kann dies vereinfacht werden, indem Sie eine Erweiterungsfunktion erstellen

fun View.setMarginLeft(leftMargin: Int) {
  val params = layoutParams as ViewGroup.MarginLayoutParams
  params.setMargins(left, params.topMargin, params.rightMargin, params.bottomMargin)
  layoutParams = params
}

Jetzt brauchen Sie nur noch eine Ansicht, und diese Erweiterungsfunktion kann überall verwendet werden.

val textView = findViewById(R.id.textView)
val marginLeft = context.resources.getDimension(R.dimen.marginLeft).toInt()
textView.setMarginLeft(marginLeft)

Hinweis: Diese Erweiterungsfunktion lässt alle anderen Ränder intakt, es werden keine Ränder überschrieben


0
2017-09-02 17:57