Android:使用LayoutParams设置视图对象的宽度

Android:使用LayoutParams设置视图对象的宽度,android,android-layout,android-ui,android-view,layoutparams,Android,Android Layout,Android Ui,Android View,Layoutparams,我在Android应用程序中使用了一个UI元素,该元素具有自定义宽度。UI元素本质上是一个有两个绿色圆圈的块——一个圆圈在块的左侧,另一个圆圈在块的右侧 我希望能够以编程方式设置整个UI元素的宽度。圆圈应该总是有一个恒定的大小,然后坐在中间的块应该自己大小来填充其余的空间。 以下是我目前拥有的: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.andr

我在Android应用程序中使用了一个UI元素,该元素具有自定义宽度。UI元素本质上是一个有两个绿色圆圈的块——一个圆圈在块的左侧,另一个圆圈在块的右侧

我希望能够以编程方式设置整个UI元素的宽度。圆圈应该总是有一个恒定的大小,然后坐在中间的块应该自己大小来填充其余的空间。 以下是我目前拥有的:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <View
        android:background="@drawable/green_circle"
        android:id="@+id/left_green_circle"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_weight="1"
        android:layout_gravity="center_horizontal"
    />

    <View
        android:background="@drawable/blue_rectangle"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:layout_gravity="center_horizontal" 
    />

    <View
        android:background="@drawable/green_circle"
        android:id="@+id/right_green_circle"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_weight="1"
        android:layout_gravity="center_horizontal"
    />

</LinearLayout>
我在上面的代码中使用了RelativeLayout,因为整个视图元素的父元素是RelativeLayout。不幸的是,我没有得到我期望的结果。我的“块宽度”变量是“40dp”,我的“绿色圆圈宽度”变量是“20dp”。以下是我得到的:

我曾尝试在视图XML中使用“wrap\u content”而不是“match\u parent”,但这根本没有任何影响。你知道为什么我的积木会超过我想要的宽度吗


谢谢您的帮助。

您看到的是切圆,因为(我可以想象)绿色圆圈图像(jpg或png)的宽度大于20dp。如果要缩放绿色圆圈,请使用imageView并设置scaleType属性

否则你会得到你想要的。通过强制圆形视图为20dp,您为块创建了大量额外的空间来填充。正确设置圆的宽度,或者使用scaleType,它就会工作


另一方面,您可能不应该使用match_parent作为块的宽度(这意味着它将占用整个宽度,包括应该由圆占用的空间)。相反,使用一些任意宽度(例如0dp)并将布局权重设置为1。

我更担心的是在矩形块中看到的额外宽度,而不是圆被截断的事实。因为矩形块将圆推离测量宽度的边界,所以圆被切断。我只是想让蓝色的方块占据绿色圆圈没有占据的所有空间。对不起,还有一条评论:绿色圆圈不是图像。它们是单独定义的XML可绘制形状,定义如下:因此我独立定义了形状,然后在我之前发布的XML中使用该形状,并在那里给出了大小。啊,得到了,感谢您的更正。您不希望将所有三个视图的布局权重都设置为1,这意味着您希望它们的宽度相等。只需将块设置为Layou_weight为1,并将圆设置为任意大小且不带权重。尝试一下(并将块宽度设置为“填充父对象”之外的其他值)。在右侧添加一些填充怎么样?
int layoutLeft = block_x_position - green_circle_width;
int layoutWidth = block_width + (green_circle_width * 2);

RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(layoutWidth, block_height);
layoutParams.setMargins(layoutLeft, block_y_position, 0, 0);
this.setLayoutParams(layoutParams);

this.requestLayout();