我正在尝试创建一个函数,将目前分散在项目不同部分的信息汇集在一起。
作为此任务的一部分,我有一个包含类似以下内容的布局文件...基本上是一组行,每行都有一个标签 (TextView
) 和一个 UI 元素 (例如 CheckBox
、Spinner
或 EditText
)从用户那里收集信息:
<?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 中运行。您可能需要为其他类稍微修改一下。 (您需要调用 findViewById
、getResources
和 getString
)
关于android - 在同一 TableRow 中查找元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50249564/