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


164

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

回答:


253

ビューの高さまたは幅を渡さなかった場合、Androidは例外をスローします。新しいLayoutParamsオブジェクトを作成する代わりに、元のオブジェクトを使用して、他のすべての設定パラメーターが保持されるようにします。getLayoutParamsによって返されるLayoutParamsのタイプは、サイズ変更するビューではなく、レイアウトのタイプであることに注意してください。

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

2
@HerbertDが言及しているように、LinearLayout.LayoutParamsを使用しない限り、これを実行するとエラーが発生します。
Martin Belcher-AtWrk

6
@Eigo Androidのドキュメントによると、レイアウトを担当するビューであるため、LayoutParamは親ビューに渡されます。
sstn

1
in値をdp値に変換する必要があるか、それとも機能するか。
Dory、

これは、新しいLayoutParamsオブジェクトを不必要にインスタンス化するのを回避するためにも好ましい
Stephen Kidson

129
this.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, theSizeIWant));

問題が解決しました!

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


3
ええと。なぜ使用しないのですかRelativeLayout.LayoutParams?
nmr

1
これはうまくいきませんでした。クラスキャストの例外が発生しました。
Tapan Thaker

4
@Tapan Thanker親レイアウトのLayoutParamsを使用します。そして、私の親のレイアウトはLinearLayoutです。
herbertD

10
私はこれのより一般的なバージョンを書きました: 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(); } }
atroutt

2
これにより、他のすべてのパラメーターがデフォルト値にリセットされます。@smisiewiczの回答が優れています。
Fran Marzoa

66

これは私にとってはうまくいきます:

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

7
このコードは親ViewGroupの正確なタイプを知る必要がないため、これは他の回答よりもはるかに優れています。
Bart Burg

1
requestLayout()の呼び出しとsetLayoutParams(params)の呼び出しの違いは何ですか?
voghDev 2016年

2
setLayoutParams(params)にはrequestLayout()が含まれています。
illusionJJ

44

価値があるものとして、デバイスに依存しないピクセル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()画面密度/解像度を取得します


6
代わりにディメンションをハードコーディングのあなたはまた、画素内に高さのためにこれを使用することができますfloat pixels = context.getResources().getDimensionPixelSize(R.dimen.card_height);
フランソワDermu

この答えは正解としてより適切です!。ありがとう
Yunus Kulyyev


6

これを試してください:

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

申し訳ありませんが、あなたが回答したため、すべての質問を投稿していません。今、それが全体の問題です。ありがとう!
herbertD

6

@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(); 
    }
}

@atroutt、あなたは文字通り私の日を救った:)
カシム

5

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

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

4

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

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

2
ハハ、非常に素朴ですがうまく機能していますが、最終的には可能な限りネストされた子に変更を適切に伝播するためにsetLayoutParams()を呼び出すことをお勧めします。常にタイププルーフ
comeGetSome

@Bhargav Raoがこのトピックについて私を助けてくれませんか: https://stackoverflow.com/q/44259342/6596724
tux-world

2

あなたが唯一持っている場合two or three condition(sizes)、あなたは使用することができます@Overide onMeasureなどを

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

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


1

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

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

1

これは私がこれを達成した方法です。で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();

0

これは私がやったことです:

View myView;  
myView.getLayoutParams().height = 32;  
myView.getLayoutParams().width = 32;

このビューが属するビューグループがある場合、それを有効にするためにyourViewGroup.requestLayout()を呼び出す必要がある場合もあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.