2010-09-07 22 views
9

Chcę określić dostępną wysokość i szerokość układu nadrzędnego, do którego muszę dodać widok.Android - pobierz Wysokość układu nadrzędnego

Użyłem wielu metod na układ jak

  • layout.getHeight()
  • layout.getRootView(). GetHeight()

Wszystkie te metody powrotu 0 (zero) jako wynik.

Moim głównym wymaganiem jest nadanie szerokości widoku, który stanowi część szerokości układu.

Również nie chcę używać znacznika do tego. Chcę to zrobić za pomocą kodu.

Z góry dziękuję.

Odpowiedz

5

Problem polega na tym, że próbujesz uzyskać wysokość/wagę nadrzędną, zanim układ zarządzania układem wypełni układ nadrzędny. Po ukończeniu układu można uzyskać tylko wymiary nadrzędne.

Zalecanym sposobem zrobienia tego, co chcesz osiągnąć, jest użycie pola layout_weight w LayoutParams. link text

W szczególności należy użyć:

LayoutParams lp = new LinearLayout.LayoutParams(width, height, 
weight); 

wartość layout_weight może być coś między 0,0 do 1,0. Tak na przykład, jeśli mam myButton ciągu parentLayout i chcę myButton zajmują 30% układu nadrzędnego ... Chciałbym użyć coś takiego:

myButton.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, 
               LayoutParams.WRAP_CONTENT,0.3)); 

layout_weight suma wszystkich elementów dziecko powinno być 1. Ponadto, layout_weight nie powinien być używany z szerokością lub wysokością widoku ustawioną na LayoutParams.FILL_PARENT.

+0

Ale jak uzyskać wysokość i szerokość układu nadrzędnego. ........... LayoutParams lp = new LinearLayout.LayoutParams (szerokość, wysokość, waga); ......... Aby nadać wysokość w%, ta metoda jest użyteczna tylko wtedy, gdy mam wysokość i szerokość macierzy nadrzędnych – Robin

+0

Nie, nie musisz znać dokładnej szerokości/wysokości obiektu nadrzędnego dla tej metody. Możesz określić od 0 do 1 jako wagę. Tak na przykład jeśli mam myButton w parentLayout, i chcę, aby mójButton zajmował 30% układu nadrzędnego ... Chciałbym użyć czegoś takiego: –

+0

Przepraszam, że miejsce na komentarz nie było wystarczające ... Zmieniłem moją odpowiedź powyżej. –

7

Ok. Znalazłem rozwiązanie. Sposób, w jaki możemy uzyskać hieght ekranu aktywności jest

getApplicationContext(). GetResources(). GetDisplayMetrics(). HeightPixels

Ale nadal nie wiem, jak uzyskać wymiarach w pikselach układu nadrzędnego?

+0

To nie zawsze jest to samo. Z getApplicationContext(). GetResources(). GetDisplayMetrics(). HeightPixels uzyskujesz wysokość ekranu w pikselach. Jeśli masz (na przykład) pasek akcji, to również pasek akcji, coś, czego prawdopodobnie chcesz uniknąć, jeśli chcesz poznać wysokość w pikselach układu lub elementu interfejsu użytkownika (tło lub cokolwiek innego). – Sotti

2

Alternatywą programowo wdrożenia tego jest użycie następujących metod:

public void onWindowFocusChanged(boolean b) { ...} 

Do tego czasu metoda jest wywoływana The layouting-proces został zakończony. W ten sposób można poprawnie uzyskać atrybuty nadrzędne.

jak w przykładzie:

public class A extends Activity { 
    LinearLayout parent; 
    Button child; 
    public void onCreate(Bundle b) { 
     parent = (LinearLayout) findViewById(R.id.linear1); 
     child = (Button) findViewById(R.id.button1); 
     . 
     . 
    } 

@Override 
public void onWindowFocusChanged(boolean b) { 
     LayoutParams lpc = child.getLayoutParams(); 
     lpc.width = parent.getWidth(); 
     child.postInvalidate(); 
     . 
     . 
    } 
} 
0

W OnCreate() metoda, jeśli używasz layout.getHeight() i layout.getWidth(), będzie zwraca 0, a nie można postępować w ten sposób:

public void onClick(View v) { 
    // TODO Auto-generated method stub 

      int layWidth = Layout.getLeft(); 
      int layHeight = Layout.getHeight(); 
     break;  
    } 
+0

Zwraca '0 'ponieważ interfejs użytkownika nie ma czasu do wyświetlenia. Być może lepiej jest użyć 'Runnable' wewnątrz' onCreate' lub użyć metody '' onWindowFocusChanged'] (http://developer.android.com/reference/android/view/View.html#onWindowFocusChanged%28boolean%29) wewnątrz Aktywność jako [Robeth] (http://stackoverflow.com/a/10269753/2668136) wspomniano, zamiast używać odbiornika kliknięcia, aby zmienić widoki. – Fllo

3

Spróbuj czegoś takiego:

view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    public void onGlobalLayout() { 
     view.getHeight(); 
    } 
    }); 
0

Jesteś probobly dzwoni getHeight() do początku. Upewnij się, że getParent().getHeight() jest wywoływane po viewGroup.addView(view0) i/lub setContentView(activity_main.xml). Zdarzyło mi się to w przeszłości i to naprawiło.

Powiązane problemy