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. Как это сделать?

dev_android
источник

Ответы:

140

Самый простой способ - установить размер программно следующим образом:

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

Это нормально, если вы знаете точный размер представления. Тем не менее, если вы хотите более гибкий подход, вы можете переопределить onMeasure()метод для измерения зрения более точно в зависимости от объема свободного места и компоновочных ограничений ( wrap_content, match_parent, или фиксированного размера).

Вы можете найти пример того, как переопределить onMeasure(), просмотрев документацию по Android и LabelViewобразец в каталоге SDK.

Dalmas
источник
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
gundrabur
источник
4
spin12.setLayoutParams(new LinearLayout.LayoutParams(200, 120));

spin12Ваш счетчик и 200 , 120 является widthи heightдля вашего spinner.

Ujjwal
источник
3

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

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

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

Морган Уайлд
источник