2013-03-15 12 views
14

Hi używam następującą strukturę układu wewnątrz LinearLayoutZmień względna szerokość układ i wysokość dynamicznie

<TableLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" > 

    <TableRow 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" > 
    </TableRow> 

    <TableRow 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" > 

     <TextView 
      android:id="@+id/tv1" 
      android:layout_height="wrap_content" 
      android:gravity="left" 
      android:paddingLeft="10dp" 
      android:textColor="#000" /> 

     <TextView 
      android:id="@+id/tv2" 
      android:layout_height="wrap_content" 
      android:layout_weight="1.0" 
      android:gravity="right" 
      android:paddingRight="10dp" 
      android:textColor="#000" /> 
    </TableRow> 
</TableLayout> 

<ImageView 
    android:id="@+id/img1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" /> 

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="320px" 
    android:layout_height="320px" 
    android:gravity="center" > 
</RelativeLayout> 

i chcesz ustawić względną szerokość układ i wysokość dynamicznie z pliku java zamiast ustawiania go 320px w pliku xml, ale nie można tego zrobić, zmiana orientacji nie jest problemem, ponieważ ograniczam ją tylko do trybu portretu. Jest możliwe, aby ustawić względny układ na pełnym ekranie za pomocą match_parent ale muszę postawić kolejne widoki na ekranie, więc jest to możliwe, czy muszę to osiągnąć w inny sposób ...

+0

Aby ustawić szerokość układu dynamicznie trzeba będzie rozszerzyć klasę RelativeLayout z klasy, który został utworzony i zastąpić metodę onMeasure – Neil

+0

Dzięki za odpowiedzi, próbowałem każdą rzecz i to daje wyjątek klasy odlewu podczas próby aby ustawić dynamicznie szerokość i wysokość. Względny układ zawiera także inne elementy potomne jako widoki obrazu, więc wybieram je jako grupę widoku w pliku java, ale nie można tego zrobić. –

+0

Proszę napisać wyjątek i kod, na którym wskazuje on – Neil

Odpowiedz

22

Android nie odświeżyć układ wyświetleń z wrap_content po wyświetleniu. Nawet z invalidate() lub requestLayout(). Jeśli więc dodasz widok podrzędny lub dynamicznie modyfikujesz zawartość, jesteś spieprzony.

getLayoutParams().height = x plus requestLayout() są dobrym rozwiązaniem, jeśli znasz "x", i jeśli musisz zrobić to TYLKO RAZ. Po tym wrap_content w LayoutParams zostanie utracone, ponieważ nadpisałeś go.

Aby rozwiązać ten problem, napisałem klasę statyczną, która przelicza rozmiary i wymusza aktualizację układu widoków za pomocą wrap_content. Kod i instrukcje użytkowania są dostępne tutaj:

https://github.com/ea167/android-layout-wrap-content-updater

Enjoy!

+0

Hej Eric, czy masz przykład użycia swojego kodu? Nie mogę uzyskać dostępu do metod z twojej klasy ?! – patrics

+0

Skutecznie uratowałeś moje życie z tą klasą. Dziękuję bardzo. – Namnodorel

+0

Nie ma za co @Namnodorel! Cieszę się, że pomogło :) – Eric

13

spróbować użyć tej

getLayoutParams().height= x; 
requestLayout(); or invalidate(); 
2

Od poniżej kod u można uzyskać wysokość i szerokość urządzenia: -

Display display = getWindowManager().getDefaultDisplay(); 
    int width = (display.getWidth()); 
    int height = (display.getHeight()); 

paramsTop ur układ realative: -

teraz u można ustawić wysokość lub szerokość, co chcesz.

 paramsTop = new RelativeLayout.LayoutParams(width, height); 
+0

To jest nieaktualny kod. Proszę odnieść się do następującego wątku dla nieużytego kodu: http://stackoverflow.com/questions/4743116/get-screen-width-and-height – Simon

2

Możesz dynamicznie ustawić wymiary widoku, korzystając z opcji LayoutParams. coś takiego:

RelativeLayout layout = (RelativeLayout) findViewById(R.id.yourlayout_id); 
// Gets the layout params that will allow you to resize the layout 
LayoutParams params = layout.getLayoutParams(); 
params.height = 320; 
params.width = 320; 
5

podać identyfikator do względnego układu w .xml:

android:id="@+id/relativelayout" 

teraz w pliku java napisać to:

RelativeLayout Rl = (RelativeLayout) findViewById(R.id.relativelayout); 

RelativeLayout.LayoutParams layout_description = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT or YourUserDefinedwidth, 
         RelativeLayout.LayoutParams.FILL_PARENT or YourUserDefinedHeight); 

Rl.setLayoutParams(layout_description); 
2

I w obliczu tego problemu, najlepszym rozwiązaniem dla zmian względnej szerokości i wysokości dynamicznie układ jak ten

RelativeLayout relMain = (RelativeLayout) convertView.findViewById(R.id.relMain); 
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    params.width =200; 
params.height =200; 
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
     relMain.setLayoutParams(params); 
+0

To działa dla mnie :) –

0

Jeśli zamierza zmienić wysokość, to zrobi to podstęp.

RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.yourId); 
relativeLayout.getLayoutParams().height = 100; 
relativeLayout.getLayoutParams().width = 100; 
Powiązane problemy