Android 将唯一ID分配给包含布局的后代

Android 将唯一ID分配给包含布局的后代,android,android-layout,Android,Android Layout,我有以下布局设置,我忽略了不相关的标记: main.xml: <include android:id="@+id/test1" layout="@layout/mylayout" /> <include android:id="@+id/test2" layout="@layout/mylayout" /> mylayout.xml: <LinearLayout <EditText a

我有以下布局设置,我忽略了不相关的标记:

main.xml:
<include
    android:id="@+id/test1"
    layout="@layout/mylayout"
    />

<include
    android:id="@+id/test2"
    layout="@layout/mylayout"
    />

mylayout.xml:
<LinearLayout
    <EditText
        android:id="@+id/myedittext"
    />
</LinearLayout>
当我尝试更改屏幕方向时出现了问题:由于这些非唯一ID,两个EditText恢复了相同的状态。好的,我想,我只需要在values目录中定义一些id,然后在editText上使用View.setId方法。但是,这种方法存在一些问题:特别是,我必须手动并以编程方式为mylayout.xml中具有ID的每个视图设置这些ID。更重要的是,即使我这样做了,我将无法以某种统一的方式访问这些子视图,因为它们都有不同的ID,特别是,我将无法进行这些漂亮的Butterknife注入


我想出了一些其他的方法来解决这个问题,但它们更复杂,更难看。那么,有什么好的通用方法来满足我的需求吗?我想知道我在web上找不到任何东西,因为重用布局以避免代码重复实际上是xml重复,但这似乎是一件很自然的事情。

我一直在使用我在一个开源项目中找到的代码

public class Utils {

    private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);
     /**
     * Generate a value suitable for use in setId(int}.
     * This value will not collide with ID values generated at build time by aapt for R.id.
     *
     * @return a generated ID value
     */
    private static int generateViewId() {
        for (; ; ) {
            final int result = sNextGeneratedId.get();
            // aapt-generated IDs have the high byte nonzero; clamp to the range under that.
            int newValue = result + 1;
            if (newValue > 0x00FFFFFF) {
                newValue = 1; // Roll over to 1, not 0.
            }
            if (sNextGeneratedId.compareAndSet(result, newValue)) {
                return result;
            }
        }
    }

    @SuppressLint("NewApi")
    public static int generateId() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {

            return generateViewId();
        }
        else {

            return View.generateViewId();
        }
    }
}

修补butterknife,因此它将支持两个这样的ID

@InjectView(R.id.mylayout, R.id.myedittext)
@InjectView(R.id.mylayout, R.id.myedittext)