1

当我使用 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 转换为像素取决于屏幕密度

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

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

4

2 回答 2

1

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

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

于 2013-05-13T08:30:34.383 回答
0

//试试这个它对我来说很好。我认为 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);
于 2013-05-13T08:37:13.860 回答