Android programowo ustawił wysokość i szerokość widoku niestandardowego


128

Utworzyłem niestandardowy widok o nazwie Graphview. Oto struktura klasy GraphView.

public class GraphView extends View {

    public GraphView(Context context, float[] values, String title, String[] horlabels, String[] verlabels, boolean type) {
        super(context);
                ........
   }

   ..................
   .................
}

Dodałem widok w tabeli za pomocą addview(). Działa dobrze. Teraz chcę ustawić wysokość i szerokość dla GraphView. Jak to zrobić?

Odpowiedzi:


140

Prostym sposobem jest programowe ustawienie rozmiaru w następujący sposób:

graphView.setLayoutParams(new LayoutParams(width, height));

To dobrze, jeśli znasz dokładny rozmiar widoku. Jednakże, jeśli chcesz bardziej elastyczne podejście, można zastąpić onMeasure()metodę pomiaru widok dokładniej w zależności od dostępnego miejsca i układ ograniczeń ( wrap_content, match_parentlub stałej wielkości).

Przykład zastępowania można znaleźć, onMeasure()przeglądając dokumentację systemu Android i LabelViewprzykład w katalogu SDK.


16
Dobrze byłoby wiedzieć, które LayoutParams tam importujesz.
user3690202

1
LayoutParamsPowinna wynosić od układu w którym graphViewjest umieszczony. Na przykład, jeśli plik układu XML graphViewjest umieszczony wewnątrz RelativeLayout, należy użyćnew RelativeLayout.LayoutParams(width, height)
Vic

208

Możesz ustawić wysokość i szerokość w następujący sposób:

myGraphView.setLayoutParams(new LayoutParams(width, height));

76
Powinieneś upewnić się, że klasa LayoutParam, której używasz, pochodzi z właściwej nadrzędnej klasy Layout. Na przykład, jeśli GraphView jest zawarty w LinearLayout, musisz użyć klasy LinearLayout.LayoutParams.
yincrash

41
To również działa i zapewnia, że ​​używasz właściwej klasy LayoutParams: po prostu zrób myGraphView.getLayoutParams().height = 100;.
sulai

21
Jeśli to zrobisz this.getLayoutParams().height = 100, pamiętaj, aby postępować zgodnie z nim this.setLayoutParams(this.getLayoutParams()), w przeciwnym razie nic nie da (przydatne).
Achal Dave

4
Myślę, że to dziwne, że ta odpowiedź zdobywa więcej punktów. Chociaż jest to łatwiejsze, jest znacznie mniej modułowe; jeśli chcesz użyć swojego widoku w innym miejscu, musisz zakodować również tam wartości szerokości / wysokości. Uważaj, używając tego.
gardarh

1
Dzięki @yincrash za wskazanie tego. Wydaje się dziwne, że muszę użyć klasy widoku nadrzędnego (w moim przypadku RelativeLayout) zamiast klasy nadrzędnej mojego widoku niestandardowego (w moim przypadku SurfaceView)
ericn

75

możesz ustawić wysokość i szerokość widoku w układzie względnym, takim jak ten

ViewGroup.LayoutParams params = view.getLayoutParams();
params.height = 130;
view.setLayoutParams(params);

2
nie ma potrzeby ponownego ustawiania parametrów układu. Zostaje odzwierciedlony automatycznie. Jest to zaleta podejścia obiektowego.
Dipendra

8
@Dipendra wywołanie setLayoutParams()jest wymagane, ponieważ wywołuje inne metody, takie jak resolveLayoutParams()irequestLayout()
William

dając wyjątek jak w onCreate getLayoutParams () ma wartość null, więc params.height powoduje wyjątek
Sibasish

Powinieneś odnieść się do widoku, dla którego musisz ustawić wysokość. Sprawdź, czy wskazujesz na ten sam widok
Rakshi

1
Rozpoczęcie layoutParamswidoku będzie NPE, proszę wyjaśnić, w jakim momencie to uruchomić?
John Sardinha

6

W Kotlin możesz ustawić szerokość i wysokość dowolnego widoku bezpośrednio za pomocą ich wirtualnych właściwości:

someView.layoutParams.width = 100
someView.layoutParams.height = 200

4
spin12.setLayoutParams(new LinearLayout.LayoutParams(200, 120));

spin12to twój spinner, a 200 , 120 jest widthi heightdla twojego spinner.


3

To jest wersja oparta na Kotlinie, przy założeniu, że widok nadrzędny jest instancją LinearLayout.

someView.layoutParams = LinearLayout.LayoutParams(100, 200)

Pozwala to ustawić szerokość i wysokość ( 100i 200) w jednej linii.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.