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(), просмотрев документацию по Android и LabelViewобразец в каталоге SDK.


16
Было бы полезно узнать, какие LayoutParams вы туда импортируете.
— user3690202

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;.
— Сулай

21
Если вы это this.getLayoutParams().height = 100сделаете, обязательно следуйте ему this.setLayoutParams(this.getLayoutParams()), иначе он не будет ничего (полезного).
— Ахал Дэйв

4
Мне кажется странным, что за этот ответ набирают больше очков. Хотя это проще, он гораздо менее модульный; если вы хотите использовать свое представление в другом месте, вам также необходимо жестко закодировать эти значения ширины / высоты там. Будьте осторожны с этим.
— gardarh 07

1
Спасибо @yincrash за указание на это. Кажется странным, что мне нужно использовать родительский класс представления (RelativeLayout в моем случае) вместо родительского класса моего пользовательского представления (SurfaceView в моем случае), хотя
— Эрикн

75

вы можете установить высоту и ширину представления в относительном макете, например

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

2
вам не нужно снова устанавливать layoutparam. Он отражается автоматически. В этом преимущество объектно-ориентированного подхода.
— Dipendra

8
@Dipendra вызов setLayoutParams()необходим, потому что он вызывает другие методы, такие как resolveLayoutParams()andrequestLayout()
— Уильям

выдача исключения, как в 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

Это версия на основе Kotlin, предполагающая, что родительское представление является экземпляром LinearLayout.

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

Это позволяет установить ширину и высоту ( 100и 200) в одной строке.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.