2016-03-20 7 views
4

nachdem ich eine taste drücke, möchte ich ein textfeld programmatisch von der tatsächlichen position + 20 margin links bewegen.android marg programmgesteuert

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 diesen Code versucht:

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?

Antwort

3

diesen Code Versuchen:

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

Dank überschrieben :) dieses feine :) – Stack108

+0

für Xamarin arbeitet, wirft ungültige Guss Ausnahme. –

6

Yep,

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); 
} 
3

Sie können 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); 
0

Wenn y ou verwenden Kotlin, kann diese Funktion durch die Schaffung einer Erweiterung vereinfacht werden

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

Alles was Sie jetzt brauchen, ist eine Ansicht, und diese Erweiterungsfunktion kann überall eingesetzt werden.

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

Hinweis: Diese Erweiterungsfunktion werden alle anderen Ränder intakt lassen, werden keine Ränder

Verwandte Themen