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)