Android встановлює висоту та ширину власного перегляду програмно


128

Я створив спеціальний вид з назвою Graphview. Ось структура для класу GraphView.

public class GraphView extends View {

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

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

Я додав подання в таблиці, використовуючи addview(). Це прекрасно працює. Тепер я хочу встановити висоту і ширину для GraphView. Як це зробити?

Відповіді:


140

Простий спосіб - встановити розмір програмно таким чином:

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

Це добре, якщо ви знаєте точний розмір перегляду. Однак, якщо ви хочете більш гнучкий підхід, ви можете змінити йогоonMeasure() метод для вимірювання зору більш точно в залежності від обсягу вільного місця і компонувальних обмежень ( wrap_content, match_parent, або фіксованого розміру).

Ви можете знайти приклад того, як перекрити onMeasure(), переглянувши документи та LabelViewзразок Android у вашому каталозі SDK.


16
Було б корисно дізнатися, які макетиParams ви імпортуєте туди.
користувач3690202

1
Це LayoutParamsмає бути з макета, де graphViewрозміщено. Наприклад, якщо файл макета XML graphViewрозміщений всередині RelativeLayout, то вам слід скористатисяnew RelativeLayout.LayoutParams(width, height)
Vic

208

Ви можете встановити висоту та ширину так:

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

76
Ви повинні переконатися, що клас LayoutParam, який ви використовуєте, є з правильного батьківського класу Layout. Наприклад, якщо ваш GraphView міститься в LinearLayout, вам потрібно використовувати клас LinearLayout.LayoutParams.
yincrash

41
Це також спрацьовує і забезпечує використання правильного класу LayoutParams: просто робіть myGraphView.getLayoutParams().height = 100;.
sulai

21
Якщо ви це зробите this.getLayoutParams().height = 100, переконайтесь, що дотримуйтесь цього this.setLayoutParams(this.getLayoutParams()), інакше це нічого не зробить (корисно).
Ахал Дейв

4
Я думаю, що дивно, що ця відповідь набирає більше балів. Хоча це легше, він набагато менш модульний; якщо ви хочете використовувати свій погляд у іншому місці, вам також потрібно буде там же вписати ці значення ширини / висоти. Будьте уважні у використанні цього.
gardarh

1
Дякуємо @yincrash за вказівку на це. Здається дивним, що мені потрібно використовувати клас батьківського перегляду '(у моєму відносному відношенні) замість батьківського класу мого власного перегляду (SurfaceView в моєму випадку), хоча
ericn

75

Ви можете встановити висоту та ширину виду у відносному макеті, як це

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

2
вам не потрібно встановлювати макетпарам знову. Це відображається автоматично. У цьому перевага об’єктно-орієнтованого підходу.
Діпендра

8
@Dipendra дзвінок setLayoutParams()потрібно, тому що він використовує інші методи, такі як resolveLayoutParams()іrequestLayout()
Вільям

даючи виняток, як у onCreate getLayoutParams () - це нульове значення. Отже, params.height причина винятку
Sibasish

Вам слід вказати вид, для якого потрібно встановити висоту. Перевірте, чи
вказуєте

1
Як layoutParamsініціація перегляду буде NPE, поясніть, в який момент ви це запустите?
Джон

6

На Kotlin ви можете встановити ширину та висоту будь-якого виду безпосередньо, використовуючи їх віртуальні властивості:

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

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

spin12- це ваш спінер і 200 , 120 - це widthі heightдля вашого spinner.


3

Це версія на основі Котліна, припускаючи, що батьківський вид є екземпляром LinearLayout.

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

Це дозволяє встановити ширину та висоту ( 100і 200) в одному рядку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.