2010-08-09 11 views
19

Se si utilizza un AbsoluteLayout (so che è deprecato, ma era l'unico modo per risolvere il mio problem) è possibile assegnare a childViews il tag android:layout_x e android:layout_y per impostarne l'assoluto posizione all'interno dello AbsoluteLayout.Android: modifica la posizione assoluta di una vista a livello di programmazione

Tuttavia, non voglio impostare queste informazioni in xml, perché li conosco solo in fase di esecuzione. Quindi, come posso impostare questi parametri al runtime a livello di programmazione? Non vedo alcun metodo sulla vista come view.setLayoutX(int x) o qualcosa del genere.

Ecco il mio XML, che funziona bene, quando ho impostato le layout_x e layout_y valori:

<?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> 

In realtà, io non voglio impostare un pulsante all'interno del xml più, ma piuttosto recuperare alcune informazioni tramite telecomando e aggiungere pulsanti a seconda di tali informazioni.

Qui è la parte del codice che sto utilizzando in modo a mio onCreateMethod per aggiungere questi pulsanti:

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

risposta

12

utilizzare la versione di addView che prende LayoutParams:

LayoutParams params = mLayout.generateLayoutParams(); 
params.x = remoteObject.x; 
params.y = remoteObject.y; 
mLayout.addView(button, params); 
+1

Grazie, ma come Come si crea LayoutParams visto che mLayout è di tipo AbsoluteLayout ? AbsoluteLayout ha solo un metodo absolutLayout.generatelayoutParams (AttributeSet). Non so come creare un attributo Set in primo luogo in modo che io possa passare quel set a generateLayoutParams() - Metodo –

+0

Ho lo stesso problema con un RelativeLayout invece di Absolute – Amplify91

9

In risposta alla tua commentare la risposta di Mayra, ho avuto un problema simile con RelativeLayout invece di AbsoluteLayout. La soluzione era usare un metodo simile e lanciarlo come tipo di layout. Qualcosa del genere:

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

Mi ci è voluto un momento per capirlo così ho voluto postarlo qui per qualcun altro se ne avesse avuto bisogno.

4

Ho avuto lo stesso problema ma ho trovato una soluzione leggermente diversa.

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

E se si scopre cosa usare per "fill_parent" (suggerimento provate -1), allora è possibile utilizzare queste costanti per la larghezza e l'altezza.

0

Non so perché, ma quando si spostano i bordi superiore e sinistro, Android mantiene i bordi destro e inferiore nello stesso punto. Come non ho potuto cambiare la larghezza e l'altezza corretta (l'immagine è stata scomparendo), ho usato this:

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

Non so se è il modo migliore, ma ha lavorato per me. L'ho provato in 2.2+ e funziona perfettamente!

È necessario importare android.widget.LinearLayout.LayoutParams; perché il valore predefinito è LayoutParams di ViewGroup (da Davit T)

0

le risposte di cui sopra sono right.but questo sarebbe più perfetto

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)