0

我正在向 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 添加到视图之前给它一个唯一的 ID ...但这没有任何意义...当然膨胀的视图不知道任何其他视图(过去或现在)直到 testLinear.addView(view); 被添加?

提前致谢。

4

1 回答 1

0

Activity(您的超类)中的 onSaveInstanceState 捕获有关附加内容视图的信息并在 onCreate() 期间为您重新加载它因此,当设备旋转后重新创建 Activity 时,只要您调用,值就会被放入由 ID 找到的视图中设置内容视图()。如果您即时更改布局,这可能会产生令人惊讶的结果。

我使用的一种方法是调用 findViewById 以查看子视图是否已经存在,然后“手动”添加它。

另一种方法是先膨胀布局,对其进行调整,然后调用 setContentView。

[我不太明白 Android 这样做的原因——也许是为了让超级简单的应用程序跳过捆绑过程中的 onSaveInstanceState/reload??)

于 2013-11-06T20:39:17.897 回答