【发布时间】:2014-05-13 00:52:58
【问题描述】:
我正在夸大一些EditTexts 并将它们添加到LinearLayout:
private void setupCommentViews(){
int i = 0;
Iterator<CommentInformation> iterator = commentInformations.iterator();
while(iterator.hasNext()) {
i++;
View v = LayoutInflater.from(context).inflate(R.layout.comment_row_item, commentsContainer, false);
EditText commentField = (EditText)v.findViewById(R.id.comment);
CommentInformation commentInformation = iterator.next();
final String uniqueId = commentInformation.getUniqueId();
String currentCommentText = comments.get(uniqueId);
if(currentCommentText != null) {
Log.v("into","Setting old text: "+currentCommentText);
commentField.setText(currentCommentText);
} else {
Log.v("into","Setting empty text: "+i);
commentField.setText("Setting empty text: "+i);
}
commentField.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
comments.put(uniqueId, s.toString().trim());
}
});
commentsContainer.addView(v);
}
}
第一次运行后的日志如下所示:
04-01 17:40:41.244: V/into(28770): Setting empty text: 1
04-01 17:40:41.254: V/into(28770): Setting empty text: 2
04-01 17:40:41.254: V/into(28770): Setting empty text: 3
并且所有的 EditText 中都有正确的文本(“设置空文本:#”)
-
我正在向我的EditText 添加一个TextChangedListener,然后我会在更改文本时更新Map<String, String>,并将uniqueId 作为键,将注释文本作为值。
在更换其中一个 cmets 后旋转手机时会出现问题。我将 cmets Map 保存在 onSaveInstanceState 内:
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable(COMMENTS, (Serializable)comments);
}
然后我在 onActivityCreated 中检索它们
if(savedInstanceState != null) {
Log.v("into","Retrieving...");
comments = (Map<String, String>)savedInstanceState.getSerializable(COMMENTS);
}
我还遍历 Map 并验证是否有一个条目具有正确的 uniqueId 和正确更改的评论文本。
-
接下来我再次拨打setupCommentViews()。这次日志看起来正确,但 EditTexts ALL 与最后一个(最后一个膨胀的)具有相同的文本。
04-01 17:42:49.664: V/into(28770): Setting empty text: 1
04-01 17:42:49.664: V/into(28770): Setting old text: Changed the second textview
04-01 17:42:49.674: V/into(28770): Setting empty text: 3
但是所有EditTexts 现在都说:“设置空文本:3”
使用ListView 不是我正在寻找的解决方案,因为ListView 内部有很多带有EditTexts 的错误AdjustResize softInputMode
-
谁能解释这里发生了什么?
【问题讨论】:
-
我收集到您的每个 EditText 组件都有自己的唯一 ID。如果是这样,并且由于您将 ID 保存到地图中,您不能只遍历地图,获取唯一 ID,将其与您的每个 EditText 匹配,然后将结果(即
setText)写入每个 EditText 吗? -
每个
EditText都有相同的ID (R.id.comment)。由于我们分别对它们进行充气,我认为这没关系,因为我们使用新充气的Viewv(v.findViewById(R.id.comment))获得对它们的引用 -
即使您单独对它们进行膨胀,当您执行
setText时,Android 也会存储为该 ID 设置的值,因此无论是最后设置的值,它都会显示给您的所有 EditText相同的 ID。 -
嗯,我不确定,因为第一遍不会导致所有
EditTexts都将“设置空文本:3”作为值吗?而是第一次正确地具有“设置空文本:1”“设置空文本:2”和“设置空文本:3” -
在您设置 EditText 的位置插入调试断点并找出答案。
标签: android android-layout android-edittext layout-inflater screen-rotation