如何在安卓中将布局参数设置为dp单位

13
mainLayout = (LinearLayout) findViewById(R.id.linearLayout);
mChart = new HorizontalBarChart(this);
mChart.setLayoutParams(new ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT));
mainLayout.addView(mChart);

我希望将宽度和高度转换为dp单位,例如100 dp或200 dp。但是 setLayoutParams 方法不接受数字单位,只能使用 wrap_content 和 match_content 这两个选项。由于我是 Android 新手,所以不知道如何更改。


1
通过以下方式,您可以将dp转换为像素:float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, resources.getDisplayMetrics()); - Muhammad Babar
1
这个回答解决了你的问题吗?如何将Layoutparams的高度/宽度设置为dp值? - Tatsuya Fujisaki
5个回答

18

另一种方法是将您的尺寸添加到dimens.xml中。

例如,添加 <dimen name="chart_width">100dp</dimen>

然后,在您的代码中:

float width = getResources().getDimension(R.dimen.chart_width);
mChart.setLayoutParams(new ViewGroup.LayoutParams(
            width,
            ViewGroup.LayoutParams.WRAP_CONTENT));

2
layoutParams.width 期望一个 int 类型,因此您可能需要使用 (int)getResources... 进行强制转换。 - Fat Monk

9
将dip值转换为像素值可以使您的布局正确生成,以下代码行可解决此问题:
int width = (int) TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_DIP, 
    getResources().getDimension(R.dimen.desired_width), 
    getResources().getDisplayMetrics()
);

3

我认为我们不能直接将dp设置为视图。因此,我们需要将尺寸从pixel转换为dp

要从dp获取pixel,您可以使用TypedValue#applyDimension()方法。

Resources r = getResources();
float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, {sizeInDp}, r.getDisplayMetrics());

因此,最终的代码将是:

float width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, {widthInDp}, r.getDisplayMetrics());

float height = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, {heightInDp}, r.getDisplayMetrics());

mChart.setLayoutParams(new ViewGroup.LayoutParams(
                width,
                height));

例如,我在哪里可以将宽度设置为100 dp? - Ruby
1
float width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, r.getDisplayMetrics()); 这行代码是将100dp转换为像素值并存储在变量width中。然后,通过 mChart.setLayoutParams(new ViewGroup.LayoutParams(width, ViewGroup.LayoutParams.WRAP_CONTENT)); 将宽度应用于图表的布局参数。明白了吗? - theapache64
1
@AxeFox,你的回答也是正确的,但我觉得有点误导。{widthInPixel} 应该改为 {withInDP},因为它是从 DP 转换为像素。如果我错了,请纠正我。 - Joey Chong
1
@JoeyChong,你说得完全正确,我没有注意到那个错误。我现在会进行更正。感谢你的纠正,Joey。 :) - theapache64
1
太棒了!这真是帮了大忙!非常感谢theapache64! - Tomas F.

0
int dp1 = dip2pix(getContext(), 1);
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
            dp1 * 100, ViewGroup.LayoutParams.WRAP_CONTENT);

public static int dip2pix(@NonNull Context context, int dip) {
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip,
            context.getResources().getDisplayMetrics());
}

-3

试一试,肯定能行

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                200, 200);
        params.setMargins(5, 0, 5, 0);

        mChart= new HorizontalBarChart(getApplicationContext());
        mChart.setLayoutParams(params);

        mainLayout.addView(mChart);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接