我正在动态地向Android添加视图,并且看到一个非常奇怪的结果,几乎没有意义。以下是显示错误的代码:
private static int count = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
count++;
// Allow 'up' action for actionBar
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle("TEST");
setContentView(R.layout.test);
LinearLayout testLinear = (LinearLayout)findViewById(R.id.testLinear);
LayoutInflater inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.job_step_text, null, false);
TextView title = (TextView) view.findViewById(R.id.jobStepTextTextView);
final EditText editText = (EditText)view.findViewById(R.id.jobStepEditText);
title.setText("Field 1");
editText.setText("Value 1");
testLinear.addView(view);
if(count == 1) {
View view2 = inflater.inflate(R.layout.job_step_text, null, false);
TextView title2 = (TextView) view2.findViewById(R.id.jobStepTextTextView);
final EditText editText2 = (EditText)view2.findViewById(R.id.jobStepEditText);
title2.setText("Field 2");
editText2.setText("Value 2");
testLinear.addView(view2);
}
}
第一轮活动如下:
字段1:[值1]
第2栏:[价值2]
然后当设备旋转时,显示以下内容:
第1栏:[价值2]
有人可以帮忙吗?似乎在第一次绕线之后:
final EditText editText = (EditText)view.findViewById(R.id.jobStepEditText);
是获取旧引用而不是调用setText()?当屏幕旋转时,甚至不调用将文本字段设置为“值2”的代码行,但这是“字段1”文本框中的结果。
有人可以帮忙吗?
顺便说一句 - 解决这个问题的一种方法是在将每个EditText添加到视图之前给每个EditText一个唯一ID ...但这没有任何意义......当然,膨胀的视图没有知道任何其他视图(过去或现在),直到testLinear.addView(view);是吗?
提前致谢。
答案 0 :(得分:0)
Activity中的onSaveInstanceState(您的超级类)捕获有关附加内容视图的信息,并在onCreate()期间为您重新加载它因此,当设备旋转后重新创建Activity时,值将被快速放入ID找到的视图中当你调用setContentView()时。如果您正在动态更改布局,这可能会产生令人惊讶的结果。
我使用的一种方法是在“手动”添加之前调用findViewById以查看子视图是否已存在。
另一种方法是首先对布局进行膨胀,对其进行调整,然后调用setContentView。
[我不太明白Android这样做的原因 - 也许是为了让超级简单的应用程序跳过onSaveInstanceState /从bundle进程重新加载?)