我动态创建 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()
此代码应该显示的是第一行和隐藏的第一列的值,但它显示的不是左侧第二列的值。就好像隐藏的第一列不存在,即使它应该存在。当我将视图或表行添加到表布局中时,我包含隐藏的第一列。
为什么我无法访问隐藏列?
访问 TableLayout 中隐藏列的问题是因为将 TextView 的 android:visibility 属性设置为不可见并不会将其从布局层次结构中删除 虽然视图变得不可见,但它仍然占据其在 TableRow 中的位置。
这就是为什么你无法使用 getChildAt(0) 访问隐藏列的原因:
索引顺序:getChildAt(0) 检索 TableRow 的第一个可见子项。由于第一个 TextView 不可见,因此第二个 TextView(带有名称)成为索引为 0 的第一个可见子级。
你可以
维护子级顺序,即不依赖索引,而是迭代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() 休息 } }
使用自定义布局:
创建一个自定义布局(例如 LinearLayout),其中包含三个 TextView,其中隐藏的 TextView 位于第一个位置。 将此自定义布局添加到 TableRow,而不是单个 TextView。 这样,隐藏的 TextView 保留在其父自定义布局中的索引 0 处,并且您可以在自定义布局上使用 getChildAt(0) 访问它。