Android では、プログラムで dp の余白を設定するにはどうすればよいでしょうか? 質問する

Android では、プログラムで dp の余白を設定するにはどうすればよいでしょうか? 質問する

これこれそしてこれスレッド 単一のビューの余白を設定する方法についての答えを見つけようとしました。しかし、もっと簡単な方法はないのかと思いました。なぜこの方法を使用したくないのかを説明します。

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 を使用する以外に、プログラムで単一のボタンの余白を設定するより簡単な方法はありますか?

編集: 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();返すためです。表示される mc インスタンスは、オフセット (-3dp) マージンと (oml、omr、omt、omb) および元のマージン (ml、mr、mt、mb) を含む です。ViewGroup.LayoutParamstopMarginbottomMarginleftMarginrightMarginMarginContainer

ベストアンサー1

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 の測定値をピクセルに変換するには、次を試してください。

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

おすすめ記事