如何设置宽度等于android上的另一个小部件

Posted

技术标签:

【中文标题】如何设置宽度等于android上的另一个小部件【英文标题】:how to set width which is equal to another widget on android 【发布时间】:2012-04-16 04:33:05 【问题描述】:

我需要在文本字段下方绘制一条水平线,使该线的宽度等于文本宽度(而不是全屏的宽度)。

在我的应用程序中,我在视图(水平线)下方有一个文本视图。 line view的宽度应该等于textview的宽度。 我试过android:layout_ 和"match_parent",都没有解决问题。

这是 xml 编码示例:

         ......
        <TextView
            android:id="@+id/textView1"
            android:layout_
            android:layout_
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="28dp"
            android:text="PopUpWindow"
            android:textAppearance="?android:attr/textAppearanceLarge" />


            <View
                android:id="@+id/separator"
                android:layout_
                android:layout_
                android:layout_below="@+id/textView1"
                android:background="#ffffff" />
             ......

屏幕图像是:

请帮帮我。

【问题讨论】:

您可以通过 LayoutParams 以编程方式获取 textview 的宽度,然后将此宽度应用于水平线,同样使用 LayoutParams。您会发现 很多 个在 Java 中设置宽度的示例。 【参考方案1】:

如果您使用RelativeLayout,您可以使用align-属性:

<View
    android:id="@+id/separator"
    android:layout_
    android:layout_
    android:layout_below="@+id/textView1"
    android:layout_alignLeft="@+id/textView1"
    android:layout_alignRight="@+id/textView1"
    android:background="#ffffff" />

【讨论】:

为了更好地支持从右到左的布局,您还应该添加 android:layout_alignStart="@+id/textView1"android:layout_alignEnd="@+id/textView1" 如果我使用 LinearLayout 会怎样? @ShirishHerwade 查看下面的其他一些答案。 :)【参考方案2】:

如果您使用的是非 RelativeLayout 的布局,您可以通过编程方式匹配小部件的宽度,例如在此示例中:

layout.xml:

<LinearLayout
    android:layout_
    android:layout_
    android:orientation="vertical"
    >

    <TextView
        android:id="@+id/text1"
        android:layout_
        android:layout_
        android:text="Here's some text"
        />

    <TextView
        android:id="@+id/text2"
        android:layout_
        android:layout_
        android:text="Some more text"
        />
</LinearLayout>

请注意,两个文本字段都设置为 wrap_content。

Main.java:

TextView tv1 = (TextView) findViewById(R.id.text1);
TextView tv2 = (TextView) findViewById(R.id.text2);

if(tv1.getWidth() < tv2.getWidth())
    tv1.setWidth(tv2.getWidth());
else
    tv2.setWidth(tv1.getWidth());

如果您有多个想要统一宽度的小部件,只需为新元素重复上述代码即可。例如,假设我想调整一个按钮的宽度,以匹配其他元素:

if(tv2.getWidth() < button)
    tv2.setWidth(button.getWidth());
else
    button.setWidth(tv2.getWidth());

【讨论】:

试一试,让我知道。它对我有用,所以它也应该对你有用。我相信如果您的用户旋转他们的设备方向,它也应该执行命令,所以无论他们如何使用他们的设备,您的视图都会看起来很棒。 天啊,我找了半天。谢谢@Argus9【参考方案3】:

使用RelativeLayout并在水平线视图中使用这两个属性

 android:layout_alignLeft="@+id/textView1"     android:layout_alignRight="@+id/textView1"




<RelativeLayout
        android:id="@+id/relativeLayout1"
        android:layout_
        android:layout_
        android:layout_weight="1.23" >

        <TextView
            android:id="@+id/textView1"
            android:layout_
            android:layout_
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="67dp"
            android:text="this is TextView" />


        <TextView
            android:id="@+id/textView2"
            android:layout_
            android:layout_
            android:layout_alignLeft="@+id/textView1"
            android:layout_alignRight="@+id/textView1"
            android:layout_below="@+id/textView1"
            android:background="#FF0000"
            android:text="" />

    </RelativeLayout>

【讨论】:

【参考方案4】:

如果你不想使用RelativeLayout,那么你可以设置父母的宽度来包裹内容,父母的宽度将等于最大的孩子。然后你可以将小孩的宽度设置为match_parent,它会匹配所需视图的宽度。

  <LinearLayout
        android:layout_
        android:layout_
        android:gravity="center_vertical|left"
        android:orientation="vertical"
        android:layout_gravity="center_vertical"
        android:padding="5dp">

        <TextView
            android:id="@+id/navHeaderName"
            android:layout_
            android:layout_
            android:layout_above="@+id/profile_progress_bar"
            android:text="This is a large text"
            android:textAppearance="@style/TextAppearance.AppCompat.Body1" />


        <ProgressBar
            android:id="@id/profile_progress_bar"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_
            android:layout_
            android:max="100"
            android:progress="45" />
    </LinearLayout>

【讨论】:

【参考方案5】:

Jave 所说的是正确的 - 也是最简单的,但是如果您不使用 RelativeLayout 来包含视图呢?

如果您在 onCreate() 中自定义您的 UI,那么您会发现从另一个小部件获取宽度会给您一个不正确的结果!那是因为尚未设置 UI。

但您仍然可以在 onCreate 中设置 UI...只需运行设置 UI 后执行的代码。这是通过使用View.post() 命令实现的。

XML:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_ >

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:gravity="center">

        <Button
            android:id="@+id/button_one"
            android:layout_
            android:layout_
            android:layout_marginBottom="10dp"
            android:text="short string" />

        <Button
            android:id="@+id/button_two"
            android:layout_
            android:layout_
            android:text="this is a longer string" />

    </LinearLayout>

</RelativeLayout>

Java 代码:

private Button mButtonOne;
private Button mButtonTwo;

@Override
protected void onCreate(Bundle savedInstanceState)

    super.onCreate(savedInstanceState);

    // inflate UI
    setContentView(R.layout.activity_example);

    // get references to UI elements
    mButtonOne = (Button)findViewById(R.id.button_one);
    mButtonTwo = (Button)findViewById(R.id.button_two);

    // Make buttons the same size (i.e. Button1.width = Button2.width)
    if ((mButtonOne != null) && (mButtonTwo != null))
    
        mButtonOne.post(new Runnable()
        
            @Override
            public void run()
            
                mButtonOne.setWidth(mButtonTwo.getWidth());
            
        );
    

结果是button_one 的宽度将匹配button_two 的宽度。当两个视图之间的文本量差异很大时,这是一个更好的外观。

【讨论】:

【参考方案6】:

这取决于您的用例。如果您打算动态修改布局中的内容并让它们的大小也与 TextView 相同,您可能希望将它们一起包装在父视图中。如果这是一次性的,请按照此处其他答案的建议使用 RelativeLayout。

<LinearLayout android:orientation="vertical" ... > <!-- layout parameters as appropriate-->
<TextView
        android:id="@+id/textView1"
        android:layout_
        android:layout_
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="28dp"
        android:text="PopUpWindow"
        android:textAppearance="?android:attr/textAppearanceLarge" />


        <View
            android:id="@+id/separator"
            android:layout_
            android:layout_
            android:layout_below="@+id/textView1"
            android:background="#ffffff" />

 </LinearLayout>

【讨论】:

【参考方案7】:

使用以下宽度属性。

 <TextView
        android:id="@+id/textView1"
        android:layout_
        android:layout_
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="28dp"
        android:text="PopUpWindow"
        android:textAppearance="?android:attr/textAppearanceLarge" />


        <View
            android:id="@+id/separator"
            android:layout_
            android:layout_
            android:layout_below="@+id/textView1"
            android:background="#ffffff" />

【讨论】:

以上是关于如何设置宽度等于android上的另一个小部件的主要内容,如果未能解决你的问题,请参考以下文章

我们如何使分隔线高度等于 SWIFT UI 小部件中水平堆栈的另一个子级

如何在android中正确设置一个大的小部件图标

设计 Android 小部件的宽度和高度

如何在android中获取主屏幕小部件列表项的点击事件[重复]

如何设置自定义小部件的背景颜色和边框宽度?

在 macOS 上的另一个窗口中打开小部件