2010-08-09 14 views
19

Jeśli używasz AbsoluteLayout (wiem, że jest przestarzały, ale był to jedyny sposób na rozwiązanie mojego problem), możesz dać dzieckuZobacz etykietę android:layout_x i android:layout_y, aby ustawić ich absolutny pozycja w obrębie AbsoluteLayout.Android: Automatycznie zmieniaj absolutną pozycję widoku

Jednak nie chcę ustawiać tych informacji w xml, ponieważ znam je tylko w czasie wykonywania. Jak więc programowo ustawić te parametry w środowisku wykonawczym? Nie widzę żadnej metody w View jak view.setLayoutX(int x) lub coś podobnego.

Tu jest mój XML, który działa dobrze, kiedy ustawić layout_x i layout_y wartości:

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

W rzeczywistości, nie chcę, aby ustawić dowolny przycisk wewnątrz xml już, ale raczej odzyskać niektóre informacje za pomocą pilota i dodawać przyciski w zależności od tych informacji.

Oto część kodu używam więc moim onCreateMethod dodać te przyciski:

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

Odpowiedz

12

używać wersji addView że trwa LayoutParams:

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

Dziękuję, ale w jaki sposób mogę utworzyć LayoutParams skoro mLayout jest typu AbsoluteLayout ? AbsoluteLayout ma tylko metodę absolutLayout.generatelayoutParams (AttributeSet). Nie wiem jak utworzyć atrybutSet w pierwszej kolejności, tak, że mogę przekazać ten zestaw do generateLayoutParams() - Metoda –

+0

Mam ten sam problem z RelativeLayout zamiast Absolute – Amplify91

9

w odpowiedzi na komentarz do odpowiedzi Mayry, miałem podobny problem z RelativeLayout zamiast AbsoluteLayout. Rozwiązaniem było użycie podobnej metody i rzutowanie jej jako typu układu. Coś w tym stylu:

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

Zajęło mi to na zawsze, aby to zrozumieć, więc chciałem opublikować go tutaj dla kogoś innego, jeśli jej potrzebował.

4

Miałem ten sam problem, ale znalazłem nieco inne rozwiązanie.

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

A jeśli okaże się, co do wykorzystania na „fill_parent” (wskazówka spróbować -1), a następnie można wykorzystać te stałe dla szerokości i wysokości.

0

Nie wiem dlaczego, ale podczas przenoszenia górnej i lewej krawędzi system Android utrzymuje prawą i dolną krawędź w tym samym miejscu. Jak ja nie mógł właściwie zmienić szerokość i wysokość (obraz znikał) Użyłem this:

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

Nie wiem, czy to najlepszy sposób, ale pracował dla mnie. Przetestowałem go w wersji 2.2+ i działa dobrze!

Musisz zaimportować android.widget.LinearLayout.LayoutParams; bo domyślnie jest LayoutParams ViewGroup jest (wg Davit T)

0

powyższe odpowiedzi są right.but ten byłby doskonalszy

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)