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.