Я кодирую пользовательское представление, расширенное от RelativeLayout, и хочу программно изменить его размер. Как я могу это сделать?
Класс пользовательского представления выглядит примерно так:
public ActiveSlideView(Context context, AttributeSet attr){
super(context, attr);
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(inflater != null){
inflater.inflate(R.layout.active_slide, this);
}
Задача решена!
ПРИМЕЧАНИЕ. Обязательно используйте родительский макет
LayoutParams
. Мой естьLinearLayout.LayoutParams
!источник
RelativeLayout.LayoutParams?
private void resizeView(View view, int newWidth, int newHeight) { try { Constructor<? extends LayoutParams> ctor = view.getLayoutParams().getClass().getDeclaredConstructor(int.class, int.class); view.setLayoutParams(ctor.newInstance(newWidth, newHeight)); } catch (Exception e) { e.printStackTrace(); } }
Это работает для меня:
источник
Допустим, вы хотели изменить размер представления в пикселях, не зависящих от устройства ( dp ): -
Вам нужно использовать метод с именем
applyDimension
, который является членом классаTypedValue
для преобразования из пикселей в dps. Так что, если я хочу установить высоту 150dp (скажем) - тогда я мог бы сделать это:где выражение:
getResources().getDisplayMetrics()
получает плотность экрана / разрешениеисточник
float pixels = context.getResources().getDimensionPixelSize(R.dimen.card_height);
В Kotlin вы можете использовать расширения ktx :
источник
попробуйте это:
источник
Вот более общая версия решения выше @herbertD:
источник
Я использовал этот способ, чтобы увеличить ширину пользовательского вида
источник
Я решил это таким образом .. У меня есть в основном простой вид внутри XML-файла.
источник
https://stackoverflow.com/q/44259342/6596724
Если у вас есть только
two or three condition(sizes)
тогда, вы можете использовать @Overide,onMeasure
какисточник
если вы переопределяете
onMeasure
, не забудьте обновить новые размерыисточник
Вот как я этого добился. В Sileria answer он / она сделал следующее:
Это правильно, но мы ожидаем, что мы будем указывать высоту
pixels
, но я хотел указать, чтоdp
я хочу, чтобы высота была, поэтому я добавил:Так это будет выглядеть так:
источник
Вот что я сделал:
Если существует группа представлений, к которой принадлежит это представление, вам также может потребоваться вызвать yourViewGroup.requestLayout (), чтобы оно вступило в силу.
источник