【问题标题】:setLayoutParams does not display things correctlysetLayoutParams 无法正确显示内容
【发布时间】:2013-05-13 08:04:56
【问题描述】:

当我使用 xml 设置布局参数时,它工作正常。但是当我尝试以编程方式设置布局参数时,它会出错。我哪里失败了?

我需要在我的 LinearLayout 中设置参数,这里是:

<LinearLayout
        android:id="@+id/buttons_layout"
        android:layout_width="231dp"
        android:layout_height="40dp"
        android:layout_marginTop="40dp"
        android:layout_marginRight="85dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:orientation="horizontal"
        android:baselineAligned="true"
        android:weightSum="603" >

这是我设置参数的代码:

rl = (LinearLayout)findViewById(R.id.buttons_layout);
lp = new RelativeLayout.LayoutParams(pixelsFromDP(231), pixelsFromDP(40));
lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
lp.addRule(RelativeLayout.ALIGN_PARENT_TOP);
lp.setMargins(0, pixelsFromDP(40), pixelsFromDP(85), 0);
rl.setLayoutParams(lp);

这是我通过 xml 设置参数得到的结果:

这是我通过以编程方式设置参数得到的结果:

方法pixelFromDP返回int值:

public int pixelsFromDP(int pixels){
        return (int)(40 * getResources().getDisplayMetrics().density + 0.5f);
    }

使用这种方法的原因是 LayoutParams 中的值是以像素为单位的,但我需要 dp 中的值,所以在这种方法中我将 dp 转换为像素取决于屏幕密度

哎呀,我发现了一个错误!天哪,我太傻了:D

通过在方法 pixelFromDP 中将“40”替换为“像素”来解决问题

【问题讨论】:

    标签: android android-linearlayout layoutparams


    【解决方案1】:

    我认为 LayoutParams 用于测量阶段,因此当您以编程方式执行此操作时,您必须重新测量布局,我会尝试使用 invalidate()。我对此不是 100% 确定,但我认为值得一试。

    通常我会将其添加为评论,但由于我没有足够的代表,我必须将其发布为答案。

    【讨论】:

    • 它没有用。顺便说一句,我的实现在前一段时间就工作了,但是在没有对代码进行任何重大更改的情况下突然停止工作。我只改变了视图的大小(就像 lp = new RelativeLayout.LayoutParams(pixelsFromDP(214), pixelsFromDP(37));)这就是我改变的全部
    【解决方案2】:

    // 试试这个对我来说很好用。我认为 pixelFromDP() 有一些问题

        LinearLayout  rl = (LinearLayout)findViewById(R.id.buttons_layout);
        LayoutParams    lp = new RelativeLayout.LayoutParams(231, 40);
          lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
          lp.addRule(RelativeLayout.ALIGN_PARENT_TOP);
          lp.setMargins(0, 40, 85, 0);
          rl.setBackgroundColor(Color.DKGRAY);
          rl.setLayoutParams(lp);
    

    【讨论】:

    • 你能分享pixelFromDp()方法吗?我使用 int 值作为参数然后它工作正常
    • pixelsFromDP() 方法返回 int。这里是: public int pixelFromDP(int pixel){ return (int)(40 * getResources().getDisplayMetrics().density + 0.5f); }
    • 使用这种方法的原因是LayoutParams中的值是以像素为单位的,但我需要dp中的值,所以在这种方法中我将dp转换为像素取决于屏幕密度
    • public int pixelFromDP(int pixel){ return (int)(pixels * getResources().getDisplayMetrics().density + 0.5f); }
    • 在pixelFromDP()中使用像素而不是40
    猜你喜欢
    • 2021-10-24
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    相关资源
    最近更新 更多