it-swarm.com.de

Android: Ändern Sie die absolute Position einer Ansicht programmgesteuert

Wenn Sie ein AbsoluteLayout verwenden (ich weiß, dass es veraltet ist, aber es war der einzige Weg, mein problem zu lösen), können Sie den childViews das Tag Android:layout_x und Android:layout_y geben, um ihre absolute Position innerhalb der AbsoluteLayout festzulegen.

Ich möchte diese Informationen jedoch nicht in der XML-Datei festlegen, da ich sie nur zur Laufzeit kenne. Wie kann ich diese Parameter zur Laufzeit programmgesteuert einstellen? Ich sehe keine Methode in der View wie view.setLayoutX(int x) oder so etwas.

Hier ist mein XML, das gut funktioniert, wenn ich die layout_x- und layout_y-Werte einstelle:

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
 xmlns:Android="http://schemas.Android.com/apk/res/Android"
 Android:id="@+id/myLayout"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content">

    <ImageView
     Android:src="@drawable/myImageView"
     Android:layout_width="1298px"
     Android:layout_height="945px"
     Android:layout_x="0px"
  Android:layout_y="0px" />
 <Button  
  Android:id="@+id/myButton1"
  Android:text="23"
  Android:layout_width="wrap_content" 
  Android:layout_height="wrap_content"
  Android:layout_x="50px"
  Android:layout_y="300px"
  Android:tag="23"/>


 <Button  
  Android:id="@+id/myButton2"
  Android:text="48"
  Android:layout_width="wrap_content" 
  Android:layout_height="wrap_content"
  Android:layout_x="50px"
  Android:layout_y="300px"
  Android:tag="48"/>

</AbsoluteLayout>

Tatsächlich möchte ich keine Schaltfläche innerhalb der XML-Datei mehr einstellen, sondern rufe einige Informationen über die Fernbedienung ab und füge abhängig von diesen Informationen Schaltflächen hinzu.

Hier ist der Teil des Codes, den ich in meiner onCreateMethod benutze, um diese Schaltflächen hinzuzufügen:

  for (MyRemoteObject remoteObject: list)  {
   Button button = new Button(this);
   button.setOnClickListener (listener);
   button.setTag(remoteObject.id);
   button.setText(remoteObject.id);
   // button.setLayoutX(remoteObject.x) ????
   // button.setLayoutY(remoteObject.y) ????
   myLayout.addView(button);
  }
21
Pascal Klein

Verwenden Sie die Version von addView für LayoutParams :

LayoutParams params = mLayout.generateLayoutParams();
params.x = remoteObject.x;
params.y = remoteObject.y;
mLayout.addView(button, params);
14
Cheryl Simon

Als Antwort auf Ihren Kommentar zu Mayras Antwort hatte ich ein ähnliches Problem mit RelativeLayout anstelle von AbsoluteLayout. Die Lösung bestand darin, eine ähnliche Methode zu verwenden und diese als Layouttyp zu verwenden. Etwas wie das: 

LayoutParams params = (Android.widget.RelativeLayout.LayoutParams) this.generateDefaultLayoutParams();
params.height = 360;
params.width = 360;
params.addRule(CENTER_IN_PARENT);
this.addView(board, params);

Ich habe ewig gebraucht, um das herauszufinden, also wollte ich es hier für jemand anderen veröffentlichen, falls er es brauchte.

10
Amplify91

Ich hatte genau das gleiche Problem, fand aber eine etwas andere Lösung.

int width = 100, height = 50, x = 10, y = 20;
Button button = new Button(this);
AbsoluteLayout myLayout = (AbsoluteLayout)findViewById(R.id.myLayout);
myLayout.add(button, new AbsoluteLayout.LayoutParams(width, height, x, y));

Und wenn Sie herausfinden, was für "fill_parent" (Hinweis versuchen -1) verwendet werden soll, können Sie diese Konstanten für Breite und Höhe verwenden.

5
Lauri

Ich weiß nicht warum, aber beim Verschieben der oberen und linken Kanten behält Android die rechte und untere Kante an derselben Stelle. Da ich die Breite und Höhe nicht richtig ändern konnte (das Bild verschwand), habe ich this verwendet:

LayoutParams layoutParams=new LayoutParams(width, height);
layoutParams.leftMargin = newLeft;
layoutParams.topMargin = newTop;
imageView.setLayoutParams(layoutParams);

Ich weiß nicht, ob es der beste Weg ist, aber für mich gearbeitet hat. Ich habe es in 2.2+ getestet und funktioniert gut!

Sie müssen Android.widget.LinearLayout.LayoutParams importieren. weil der Standard die LayoutParams von ViewGroup ist (von Davit T )

0
Rafael Brasil

die obigen Antworten sind richtig. Aber diese wäre perfekter

AbsoluteLayout.LayoutParams layoutParams = new AbsoluteLayout.LayoutParams(AbsoluteLayout.LayoutParams.WRAP_CONTENT,AbsoluteLayout.LayoutParams.WRAP_CONTENT,DragLayer.int left_location,int top_location);
 layout.addView(view,layoutParams)
0
Asthme