【问题标题】:How to set layout params to units dp android如何将布局参数设置为单位 dp android
【发布时间】:2016-02-12 02:54:23
【问题描述】:
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 新手,所以我很困惑如何更改它。

【问题讨论】:

标签: android


【解决方案1】:

另一种方法是在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));

【讨论】:

  • layoutParams.width 期望和 int 因此您可能需要将 getResources...(int) 进行转换。
【解决方案2】:

将倾角值转换为像素将使您的布局正确构建,这行代码将解决它:

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?
    • float width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, r.getDisplayMetrics()); 并申请 mChart.setLayoutParams(new ViewGroup.LayoutParams( width, ViewGroup.LayoutParams.WRAP_CONTENT)); ,明白了吗?
    • @AxeFox,您的回答也正确,但我认为有点误导。 {widthInPixel} 应该改变 {withInDP} 因为它从 DP 转换为像素。如果我错了,请纠正我。
    • @JoeyChong 你说的完全正确,我没有注意到那个错误。我现在会纠正它。并感谢乔伊的纠正。 :)
    【解决方案4】:
    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());
    }
    

    【讨论】:

      【解决方案5】:

      试一试,肯定可以的

      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                      200, 200);
              params.setMargins(5, 0, 5, 0);
      
              mChart= new HorizontalBarChart(getApplicationContext());
              mChart.setLayoutParams(params);
      
              mainLayout.addView(mChart);
      

      【讨论】:

        猜你喜欢
        • 2011-12-03
        • 2012-02-17
        • 1970-01-01
        • 2017-09-14
        • 1970-01-01
        • 2015-12-22
        • 2011-09-21
        • 2012-02-23
        • 1970-01-01
        相关资源
        最近更新 更多