无法访问tablelayout布局中的隐藏表格列:Android Kotlin

问题描述 投票:0回答:1

我动态创建 TableLayout 及其行。另外,我在表中有一个隐藏列。每次我尝试访问隐藏列的值时,我就是找不到它,即使它应该在那里。我的 TableLayout 中共有 3 列;第 1 列索引为 0 <---hidden, column 2 index is 1 and column 3 is index 2.

这是行的 XML。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TableRow
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/idautoint"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="0.25"
        android:gravity="start"
        android:visibility="invisible" /> <------- Look over here

    <TextView
        android:id="@+id/name"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="0.25"
        android:gravity="start" />

    <TextView
        android:id="@+id/title"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="0.25"
        android:gravity="start" />
</TableRow>
</androidx.constraintlayout.widget.ConstraintLayout>

以下代码是测试并且可以编译。它从所需的行和列中检索值并显示它。然而,

            val tableRow = stableLayout.getChildAt(0) as TableRow
            val cIdout = tableRow.getChildAt(0) as TextView
            Toast.makeText(this@MainActivity, cIdout.text, Toast.LENGTH_SHORT).show()

此代码应该显示的是第一行和隐藏的第一列的值,但它显示的不是左侧第二列的值。就好像隐藏的第一列不存在,即使它应该存在。当我将视图或表行添加到表布局中时,我包含隐藏的第一列。

为什么我无法访问隐藏列?

android kotlin hidden tablelayout tablerow
1个回答
0
投票

访问 TableLayout 中隐藏列的问题是因为将 TextView 的 android:visibility 属性设置为不可见并不会将其从布局层次结构中删除 虽然视图变得不可见,但它仍然占据其在 TableRow 中的位置。

这就是为什么你无法使用 getChildAt(0) 访问隐藏列的原因:

索引顺序:getChildAt(0) 检索 TableRow 的第一个可见子项。由于第一个 TextView 不可见,因此第二个 TextView(带有名称)成为索引为 0 的第一个可见子级。

你可以

  1. 维护子级顺序,即不依赖索引,而是迭代TableRow的所有子级:

    val tableRow = stableLayout.getChildAt(0) as TableRow for (i in 0 直到 tableRow.childCount) { val child = tableRow.getChildAt(i) if (child.id == R.id.idautoint) { val hideValue = (child as TextView).text.toString() 休息 } }

  2. 使用自定义布局:

创建一个自定义布局(例如 LinearLayout),其中包含三个 TextView,其中隐藏的 TextView 位于第一个位置。 将此自定义布局添加到 TableRow,而不是单个 TextView。 这样,隐藏的 TextView 保留在其父自定义布局中的索引 0 处,并且您可以在自定义布局上使用 getChildAt(0) 访问它。

© www.soinside.com 2019 - 2024. All rights reserved.