Как изменить размер пользовательского представления программно?
я кодирую пользовательский вид, расширенный из 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);
}
11 ответов:
Android выдает исключение, если вы пропустите, чтобы передать высоту или ширину макета. Вместо создания нового объекта LayoutParams используйте исходный вид, чтобы сохранить все остальные параметры набора:
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) someLayout.getLayoutParams(); params.height = 130; someLayout.setLayoutParams(params);
this.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, theSizeIWant));проблема решена!
Примечание: обязательно используйте Родительский макет
LayoutParams. Мой-этоLinearLayout.LayoutParams!
это работает для меня:
ViewGroup.LayoutParams params = layout.getLayoutParams(); params.height = customHeight; layout.requestLayout();
для чего это стоит, скажем, вы хотите уменьшить размер вида аппаратно-независимых пикселях (dp): -
вы должны использовать метод, называемый
applyDimension, это член классаTypedValueдля преобразования из пикселей в dps. Так что если я хочу установить высоту до 150dp (скажем) - то я мог бы сделать это:float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150, getResources().getDisplayMetrics()); LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) someLayout.getLayoutParams(); params.height = (int) pixels; someLayout.setLayoutParams(params);где выражение:
getResources().getDisplayMetrics()получает плотность экрана/разрешение
вот более общая версия решения выше от @herbertD:
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(); } }
попробуйте вот это:
... View view = inflater.inflate(R.layout.active_slide, this); view.setMinimumWidth(200);
я использовал этот способ, чтобы увеличить ширину пользовательского представления
customDrawingView.post(new Runnable() { @Override public void run() { View view_instance = customDrawingView; android.view.ViewGroup.LayoutParams params = view_instance .getLayoutParams(); int newLayoutWidth = customDrawingView .getWidth() + customDrawingView.getWidth(); params.width = newLayoutWidth; view_instance.setLayoutParams(params); screenWidthBackup = params.width; } });
Я решил это таким образом.. У меня в основном простой вид внутри xml-файла.
View viewname = findViewById(R.id.prod_extra); prodExtra.getLayoutParams().height=64;
Если у вас есть только
two or three condition(sizes)затем вы можете использовать @OverideonMeasureкак@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); }и измените свой размер для этих условий в классе CustomView легко.
Если вы переопределяете
onMeasureНе забудьте обновить новые размеры@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(newWidth, newHeight); }
вот как я этого добился. В Sileria ответа он/она сделал следующее:
ViewGroup.LayoutParams params = layout.getLayoutParams(); params.height = customHeight; layout.requestLayout();это правильно, но он ожидает, что мы дадим высоту в
pixels, но я хотел датьdpЯ хочу, чтобы высота была, поэтому я добавил:public int convertDpToPixelInt(float dp, Context context) { return (int) (dp * (((float) context.getResources().getDisplayMetrics().densityDpi) / 160.0f)); }так это будет выглядеть так:
ViewGroup.LayoutParams params = layout.getLayoutParams(); params.height = convertDpToPixelInt(50, getContext()); layout.requestLayout();
Comments