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

dev_android
źródło

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.

Dalmas
źródło
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));
Eric Nordvik
źródło
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);
Rakshi
źródło
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
gundrabur
źródło
4
spin12.setLayoutParams(new LinearLayout.LayoutParams(200, 120));

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

Ujjwal
źródło
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.

Morgan Wilde
źródło