副本+ id布局范围的可能用例是什么?

时间:2017-02-23 09:28:17

标签: android layout android-source

我们没有编译问题,我们只想扩展我们的知识。通过Google Code Documentation阅读,我们已经读到+ id不必是布局范围内唯一的。

编译示例下方:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.bq.testviewids.MainActivity">

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hola Mundo" />

</LinearLayout>

private void initViews() {
    txtText = (TextView) findViewById(R.id.text);

    txtText.setId(View.generateViewId());
    txtText = (TextView) findViewById(R.id.text);
}

private void changeTextView() {
    txtText.setText("");
}

如果在 initViews()中,我们没有最后两行:

txtText.setId(View.generateViewId());
txtText = (TextView) findViewById(R.id.text);

当我们对txtText进行更改时(在 changeTextView()中),第一个TextView会被修改。

如果我们确实有最后两行,则第二个TextView会被修改。

我们不知道这是可能的,我们认为如果你有两个布局范围内具有相同+ id的项目,它将无法编译。 现在,我们了解标识符在此视图的层次结构中不必是唯一的 ,但是,我们不了解此行为的用处。

有人知道非唯一标识符有用的用例吗?

当我们在设置项目CAF中的 Android for MSM this code)中看到重复ID(< EM> @ + ID /字段):

       <LinearLayout android:id="@+id/fields"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            style="@style/wifi_section"
            android:visibility="gone">

        <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                style="@style/wifi_item">
            ...
        </LinearLayout>

        <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                style="@style/wifi_item">
            ...
    </LinearLayout>

    <LinearLayout android:id="@+id/fields"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            style="@style/wifi_section" >
        ...
    </LinearLayout>

1 个答案:

答案 0 :(得分:0)

想到的用例是如果您的布局在另一个布局中包含两次或更多次,您将拥有的重复ID。它可以帮助您避免在每个重复的布局中尝试获取唯一ID的麻烦。

它还允许您使用相同的代码在每个包含的布局中工作,而不必根据您正在处理的子布局跟踪不同的ID。