android - 在同一 TableRow 中查找元素

标签 android

我正在尝试创建一个函数,将目前分散在项目不同部分的信息汇集在一起​​。

作为此任务的一部分,我有一个包含类似以下内容的布局文件...基本上是一组行,每行都有一个标签 (TextView) 和一个 UI 元素 (例如 CheckBoxSpinnerEditText)从用户那里收集信息:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/MyLinearLayout.Section"
    android:id="@+id/section_pressure" >

    <TableLayout style="@style/MyTableLayout"
        android:id="@+id/table_pressure" >

        <TableRow style="@style/MyTableRow" >

            <TextView
                style="@style/MyTextView.Label.WithHelp"
                android:tag="label_show"
                android:text="@string/label_show" />

            <CheckBox
                style="@style/MyCheckBox"
                android:id="@+id/pressure" />

        </TableRow>

        <TableRow style="@style/MyTableRow" >

            <TextView
                style="@style/MyTextView.Label.WithHelp"
                android:tag="label_unit"
                android:text="@string/label_unit" />

            <Spinner
                style="@style/MySpinnerStyle"
                android:id="@+id/pressureUnit" />

        </TableRow>

    </TableLayout>

</LinearLayout>

我已经有了一个包含 UI 元素的所有 android:id 值的数组,我想从中生成另一个包含相应 android:text 标签的数组.

例如从 R.id.pressureUnit 我想从 TableRow 中找到关联的 R.string.label_unit,这样我就有了一个中央记录每个 UI 元素使用什么标签...目前,该信息分散在许多不同的布局文件中。

这可以通过编程实现吗?

最佳答案

据我了解,您想查找给定 View 的同级 View 的 @string 资源 ID。

假设您已经扩充了 xml 文件,您可以执行以下操作:

private int getSiblingStringId(@IdRes int viewId) {
    View uiElement = findViewById(viewId);
    ViewGroup parent = (ViewGroup) uiElement.getParent();

    // iterate through the siblings
    for (int i = 0; i < parent.getChildCount(); i++) {
        View view = parent.getChildAt(i);
        if (view instanceof TextView) {
            String value = ((TextView) view).getText().toString();

            // found
            return getStringIdFromValue(value);
        }
    }

    throw new IllegalArgumentException("no TextView sibling for " + viewId);
}

private int getStringIdFromValue(String value) {
    // get all fields using reflection
    Field[] fields = R.string.class.getDeclaredFields();

    for (Field field : fields) {
        int stringResId = getResources().getIdentifier(field.getName(), "string", getPackageName());
        String s = getString(stringResId);
        if (s.equals(value)) return stringResId;
    }

    throw new IllegalArgumentException("no matching string for " + value);
}

以上代码将在 Activity 中运行。您可能需要为其他类稍微修改一下。 (您需要调用 findViewByIdgetResourcesgetString)

关于android - 在同一 TableRow 中查找元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50249564/

相关文章:

android - 为什么 Aviary 返回按比例缩小的图像?

Android Custom ArrayAdapter 不接受数组

java - Android 中的埃塞俄比亚日历

android - 我的Android音乐播放器怎么了?每次都会在try\catch语句中进行CATCH,为什么?

android - 使用 android camera2 API 手动对焦

android - 运行flutter应用程序时如何解决 'dart:ui'错误?

android - FirebaseCrashlytics.getInstance() 在多进程应用程序中崩溃应用程序

android - 如何使用 RxJava 从 Android Room 数据库选择查询中获取返回值

android - 适用于 Android 的 Google Drive Rest API 的文件选取器

android - 刷新选项卡 onTabReselected Android