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);
}
this.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, theSizeIWant));
問題が解決しました!
注:必ず親レイアウトのLayoutParams
を使用してください。私のものはLinearLayout.LayoutParams
です!
レイアウトの高さまたは幅のいずれかを渡すのに失敗すると、Androidは例外をスローします。新しいLayoutParamsオブジェクトを作成する代わりに、ビューの元のオブジェクトを使用して、他のすべての設定パラメーターを保持します。
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) someLayout.getLayoutParams();
params.height = 130;
someLayout.setLayoutParams(params);
これは私のために働く:
ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = customHeight;
layout.requestLayout();
価値があるものとして、デバイスに依存しないピクセル(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()
は画面の密度/解像度を取得します
上記のソリューションの@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();
}
}
この方法でカスタムビューの幅を広げました
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;
}
});
これを試してください:
...
View view = inflater.inflate(R.layout.active_slide, this);
view.setMinimumWidth(200);
この方法で解決しました。基本的に、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);
}
これが私がこれを達成した方法です。 シレリア で、彼/彼女は以下を行いました:
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();