如何动态地将按钮添加到视图以使布局宽度正常工作?

Posted

技术标签:

【中文标题】如何动态地将按钮添加到视图以使布局宽度正常工作?【英文标题】:How to dynamically add Buttons to View so that layout width works correctly? 【发布时间】:2018-09-25 23:52:47 【问题描述】:

我正在尝试向视图动态添加几个按钮,准确地说是 ToggleButtons。如果我直接在 xml 中表示按钮,它们在显示时看起来是正确的。但是,当相同的按钮从 xml 膨胀并使用 addView(View, index) 插入时,当绘制活动时,我会得到不同的表示。

下面有两张截图。我正在尝试以编程方式重现您在第一个中看到的内容,但正在获得第二个。请注意,要添加 ToggleButton 对象的 LinearLayout 已经有两个 View 对象,它们都具有黄色背景色,并且正在它们之间插入切换按钮。 View 对象通常是不可见且必要的,因此我可以将两端的间距定义为百分比,因此是 0dp layout_width。

xml 和代码也在下面。由于我在两种情况下都使用相同的 xml,为什么屏幕呈现的不同?感谢您提供任何帮助,因为我必须以编程方式添加这些按钮,因为它们的编号在运行时未知(json 驱动,来自服务器)。

在 xml 中定义 2 个(黄色)View 对象之间的 4 个切换按钮时显示的内容:

但是当 4 个切换按钮以编程方式插入两个(黄色)视图对象之间时:

正确呈现的屏幕的 xml(根据需要):

<LinearLayout
    android:layout_
    android:layout_
    android:orientation="vertical"
    android:gravity="center"
    android:id="@+id/linLytRubCard"
    >

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="horizontal"
        android:padding="5dp"
        android:background="@color/ail_blue"
        >

        <ImageButton
            android:id="@+id/btnExpandDummy"
            android:layout_
            android:layout_
            android:layout_weight=".10"
            android:padding="5dp"
            android:background="?android:attr/selectableItemBackground"
             />

        <TextView
            android:id="@+id/tvCardTitle"
            android:layout_
            android:layout_
            android:layout_weight=".80"
            android:textColor="@color/black"
            android:textSize="16sp"
            android:gravity="center"
            android:layout_gravity="center_vertical"
            android:text="This-is-title"
            />

        <ImageButton
            android:id="@+id/btnExpandCollapse"
            android:layout_
            android:layout_
            android:layout_weight=".10"
            android:padding="5dp"
            android:background="?android:attr/selectableItemBackground"
            android:src="@drawable/down_arrow_expand_rubric" />

    </LinearLayout>

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="horizontal"
        android:padding="5dp"
        android:id="@+id/linlytSegControl"
        >

        <View
            android:layout_
            android:layout_
            android:layout_weight=".10"
            android:background="@color/yellow"
            />

        <ToggleButton
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_
            android:layout_
            android:layout_weight=".20"
            android:gravity="center"
            android:paddingTop="8dp"
            android:paddingBottom="8dp"
            android:textOn="0"
            android:textOff="0"
            android:text="0"
            android:textSize="16dp"
            android:checked="false"
            android:background="@drawable/selector_leftmost_button_state"
            />

        <ToggleButton
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_
            android:layout_
            android:layout_weight=".20"
            android:gravity="center"
            android:paddingTop="8dp"
            android:paddingBottom="8dp"
            android:textOn="2"
            android:textOff="2"
            android:text="2"
            android:textSize="16dp"
            android:background="@drawable/selector_middle_button_state"
            android:checked="false"
            />

        <ToggleButton
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_
            android:layout_
            android:layout_weight=".20"
            android:gravity="center"
            android:paddingTop="8dp"
            android:paddingBottom="8dp"
            android:textOn="3"
            android:textOff="3"
            android:text="3"
            android:textSize="16dp"
            android:background="@drawable/selector_middle_button_state"
            android:checked="false"
            />

        <ToggleButton
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_
            android:layout_
            android:layout_weight=".20"
            android:gravity="center"
            android:paddingTop="8dp"
            android:paddingBottom="8dp"
            android:textOn="4"
            android:textOff="4"
            android:text="4"
            android:textSize="16dp"
            android:checked="false"
            android:background="@drawable/selector_rightmost_button_state"
            />

        <View
            android:layout_
            android:layout_
            android:layout_weight=".10"
            android:background="@color/yellow"
            />

    </LinearLayout>

我正在循环中创建和添加切换按钮:

LinearLayout linLytSegCtrl = (LinearLayout) this.findViewById(R.id.linlytSegControl);

for (int x = 0; x < m_arrRubItemPointVals.size(); x++)

    ToggleButton tbn = (ToggleButton) View.inflate(m_context, R.layout.segmented_button_rubric, null);

    String sTitle = String.valueOf(x);
    tbn.setText(sTitle);
    tbn.setTextOn(sTitle);
    tbn.setTextOff(sTitle);
    linLytSegCtrl.addView(tbn, x+1); // inserts AFTER first yellow View in xml and before the second one

运行时读取的各个切换按钮的 xml:

<ToggleButton
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:layout_weight=".20"
    android:gravity="center"
    android:paddingTop="8dp"
    android:paddingBottom="8dp"
    android:textSize="16dp"
    android:background="@drawable/selector_middle_button_state"
    android:checked="false"
    />

是的,当我在运行时插入按钮时,我将它们从 xml 中删除,只留下两个 View 对象。

【问题讨论】:

【参考方案1】:

您可能需要在对 view.inflate 的调用中设置父级:View.inflate(m_context, R.layout.segmented_button_rubric, linLytSegCtrl);

View.Inflate 的文档指出第三个参数是“用于正确膨胀 layout_* 参数”:https://developer.android.com/reference/android/view/View.html#inflate(android.content.Context,%20int,%20android.view.ViewGroup)

【讨论】:

确实是问题所在,尽管后来我得到了 ClassCastException,因为 inflate() 开始返回 LinearLayout(我的 linLytSegCtrl 参数)而不是 ToggleButton。我改变了一些东西以使用充气机并得到了我需要的结果。谢谢。

以上是关于如何动态地将按钮添加到视图以使布局宽度正常工作?的主要内容,如果未能解决你的问题,请参考以下文章

添加cardview动态滚动视图,不显示

如何动态地将 xib 文件视图适合故事板视图?

动态添加视图并设置参数和规则无法正常工作(android)

通过自动布局添加分隔线[关闭]

自适应布局 - 根据视图宽度计算第二行视图

自动布局 swift 在标签上无法正常工作