web-dev-qa-db-ja.com

プログラムでカスタムビューのサイズを変更する方法

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);
        }
151
herbertD
this.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, theSizeIWant));

問題が解決しました!

注:必ず親レイアウトのLayoutParamsを使用してください。私のものはLinearLayout.LayoutParamsです!

116
herbertD

レイアウトの高さまたは幅のいずれかを渡すのに失敗すると、Androidは例外をスローします。新しいLayoutParamsオブジェクトを作成する代わりに、ビューの元のオブジェクトを使用して、他のすべての設定パラメーターを保持します。

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) someLayout.getLayoutParams();
params.height = 130;
someLayout.setLayoutParams(params);
232
smisiewicz

これは私のために働く:

ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = customHeight;
layout.requestLayout();
55
Sileria

価値があるものとして、デバイスに依存しないピクセルdp)でビューのサイズを変更したいとしましょう:-

ピクセルからdpsに変換するには、クラスapplyDimensionのメンバーであるTypedValueというメソッドを使用する必要があります。したがって、高さを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()は画面の密度/解像度を取得します

42
Danield

上記のソリューションの@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(); 
    }
}
7
atroutt

この方法でカスタムビューの幅を広げました

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;
                            }
                        });
5
AkhilGite

これを試してください:

...
View view = inflater.inflate(R.layout.active_slide, this);
view.setMinimumWidth(200);
5
zed_0xff

この方法で解決しました。基本的に、xmlファイル内に単純なビューがあります。

 View viewname = findViewById(R.id.prod_extra);
             prodExtra.getLayoutParams().height=64;
4

two or three condition(sizes)しかない場合は、@ OverideonMeasureのように使用できます

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

また、CustomViewクラスでこれらの条件のサイズを簡単に変更できます。

2

onMeasureをオーバーライドする場合は、新しいサイズを更新することを忘れないでください

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(newWidth, newHeight);
}
1
XurajB

これが私がこれを達成した方法です。 シレリア で、彼/彼女は以下を行いました:

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();
0
ClassA