1. ホーム
  2. android

[解決済み] Androidで、dpの余白をプログラムで設定する方法を教えてください。

2022-03-19 02:26:04

質問

これ , これ そして これ のスレッドで、シングルビューにマージンを設定する方法について答えを見つけようとしました。しかし、私はもっと簡単な方法がないのかと思っていました。私がこの方法を使いたくない理由を説明します。

Buttonを継承したカスタムButtonがあります。もし、背景がデフォルトの背景以外のものに設定された場合、( setBackgroundResource(int id) または setBackgroundDrawable(Drawable d) ) を呼び出すと、余白が0になるようにしたいのですが、どうしたらいいでしょうか。

public void setBackgroundToDefault() {
    backgroundIsDefault = true;
    super.setBackgroundResource(android.R.drawable.btn_default);
    // Set margins somehow
}

余白を-3dpにリセットしてほしい(すでに ここで ピクセルからdpへの変換方法を知っているので、pxでマージンを設定する方法を知っていれば、自分で変換を管理できます)。しかし、これは CustomButton クラスでは、親がLinearLayoutからTableLayoutまで異なることがあり、親を取得してその親のインスタンスをチェックするようなことは避けたいですね。これもかなり非効率になると思います。

また、(LayoutParamsを使用して)呼び出す際に parentLayout.addView(myCustomButton, newParams) 例えば、5つ並んだボタンの真ん中に追加されるかどうかはわかりません。

質問です。単一のボタンのマージンをプログラム的に設定する簡単な方法はありますか? LayoutParamsを使用する以外にありますか?

EDIT: LayoutParamsの方法は知っていますが、異なるコンテナタイプごとに処理することを回避するソリューションが欲しいです。

ViewGroup.LayoutParams p = this.getLayoutParams();
    if (p instanceof LinearLayout.LayoutParams) {
        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)p;
        if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
        else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
        this.setLayoutParams(lp);
    }
    else if (p instanceof RelativeLayout.LayoutParams) {
        RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)p;
        if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
        else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
        this.setLayoutParams(lp);
    }
    else if (p instanceof TableRow.LayoutParams) {
        TableRow.LayoutParams lp = (TableRow.LayoutParams)p;
        if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
        else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
        this.setLayoutParams(lp);
    }
}

なぜなら this.getLayoutParams();ViewGroup.LayoutParams という属性を持っていない topMargin , bottomMargin , leftMargin , rightMargin . あなたが見ている mc インスタンスは、単に MarginContainer オフセット(-3dp)の余白と(oml, omr, omt, omb)、元の余白(ml, mr, mt, mb)を含んでいるものである。

どのように解決するのですか?

を使用する必要があります。 LayoutParams を使用してボタンの余白を設定します。

LayoutParams params = new LayoutParams(
        LayoutParams.WRAP_CONTENT,      
        LayoutParams.WRAP_CONTENT
);
params.setMargins(left, top, right, bottom);
yourbutton.setLayoutParams(params);

どのようなレイアウトを使用しているかに応じて RelativeLayout.LayoutParams または LinearLayout.LayoutParams .

また、dpメジャーをpixelに変換するには、次のようにします。

Resources r = mContext.getResources();
int px = (int) TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP,
        yourdpmeasure, 
        r.getDisplayMetrics()
);