我有一个主要布局和一个LinearLayout。在这个LinearLayout中,我膨胀了多个xml布局,其中包含一个包含多个文本字段(3 EditText)的表单。
首次尝试时,我只显示一个表格。有用于添加更多表单的按钮。假设如果用户点击两次“添加”按钮,那么用户总共有三种形式。我成功获得了这三种形式的所有数据。
为此,我定位主要布局“LinearLayout”,然后计算其子级。在对其子进行计数之后,我通过其位置调用Main LinearLayout的子视图,然后获取EditText数据并保存到列表中。然后我将此列表移至下一页。到那时为止一切正常。但如果用户回到上一页,所有膨胀的布局都消失了。所以,我计算简历上列表的大小,并设置用户上次写入的值。
问题是我根据视图位置设置EditText的值。只有最后一个对象(列表)值显示在所有膨胀的布局中。表示for循环结束时,它在所有布局中设置最后一个对象值。这是我根据视图设置值的方法:
private void addFormDataOnResume(LinearLayout viewForm,Traveller otherTraveller)
{
EditText dateOfBirthEt = (EditText)viewForm.findViewById(R.id.dateOfBirth);
dateOfBirthEt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
showDatePickerDialog(dateOfBirthEt);
}
});
dateOfBirthEt.setText(otherTraveller.getOtherDateOfBirth());
EditText firstNameET = (EditText)viewForm.findViewById(R.id.firstName);
firstNameET.setText(otherTraveller.getOtherFirstName());
EditText lastNameEt = (EditText)viewForm.findViewById(R.id.lastName);
lastNameEt.setText(otherTraveller.getOtherLastName());
}
我的循环代码:
int otherTraSize = otherTravellersData.size();
//adultsForms is the main linear layout in which I am adding views
for(k=0; k < otherTraSize; k++)
{
addFormOnResume();//Function for adding form layout
int viewPos = adultsForms.getChildCount();
if(viewPos>0)
{
addFormDataOnResume(adultsForms.getChildAt(viewPos-1), otherTravellersData.get(k));
}
}
我添加表单的功能:
private void addFormOnResume()
{
LinearLayout viewForm = (LinearLayout)layoutInflater.inflate(R.layout.other_traveller_form, null );
adultsForms.addView(viewForm);
}
我调试我的代码,列表的所有数据似乎都很好。对象按正确顺序排列,具有适当的值 请帮助我为什么只有最后一个对象值被设置为所有膨胀的表格。
任何帮助都会非常感激......先谢谢。
答案 0 :(得分:3)
最后我得到了自己问题的答案。默认情况下,当活动进入onPause模式时。 Android将EditText值保存为id,当我们恢复它时,恢复EditText的最后保存值。因此,在我的情况下,它恢复所有布局形式中的最后一个表单值。我的问题的解决方案是在XML上的小部件条目上设置 android:saveEnabled =“false”。我在所有EditText中添加了这个。 Android不再保存我的数据和onResume我可以设置我想要的表单字段的值,只需从指定位置获取childView,即使它们具有相同的Id。
答案 1 :(得分:0)
用以下代码替换你的循环代码:
int otherTraSize = otherTravellersData.size();
//adultsForms is the main linear layout in which I am adding views
for(k=0; k < otherTraSize; k++)
{
addFormOnResume();//Function for adding form layout
}
int viewPos = adultsForms.getChildCount();
if(viewPos>0)
{
for(int x=0; x<viewPos; x++){
Log.d("current value",otherTravellersData.get(x).getOtherFirstName());
addFormDataOnResume(adultsForms.getChildAt(viewPos-1), otherTravellersData.get(x));}
}
答案 2 :(得分:-1)
我的工作代码
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnAdd:
view = layoutInflater.inflate(R.layout.fragment_add_materials, null);
parentLinearLayout.addView(view);
arrayList.add(view);
edtMaterialName = (EditText) view.findViewById(R.id.edtinput_material1);
editTextCoast = (EditText) view.findViewById(R.id.editTextCoast1);
edtMaterialName.addTextChangedListener(getMyTextWatcher(edtMaterialName,arrayListMaterials.size()-1 ,"name"));
editTextCoast.addTextChangedListener(getMyTextWatcher(editTextCoast, arrayListMaterials.size()-1, "cost"));
break;
TextWatcher getMyTextWatcher(final EditText edtText, final int listPosition, String nameOrcost){
return new MyTextWatcher(edtText, listPosition, nameOrcost);
}
class MyTextWatcher implements TextWatcher{
int position;
EditText edtText;
String nameOrcost;
MaterialData data;
boolean flag;
int count;
public MyTextWatcher(EditText edtText1, int listPosition, String nameOrcost){
this.position = listPosition;
this.edtText=edtText1;
this.nameOrcost = nameOrcost;
data = arrayListMaterials.get(position);
}
@Override
public void afterTextChanged(Editable sEditable) {
try{
if(this.nameOrcost.equals("name") && edtText.getEditableText().toString().length()>0){
data.setMaterialName(edtText.getEditableText().toString());
}
if(this.nameOrcost.equals("cost") && edtText.getEditableText().toString().trim().length()>0){
String tempCost = edtText.getEditableText().toString().trim();
NumberFormat myFormatter = NumberFormat.getInstance();
Number number = myFormatter.parse(tempCost);
data.setMaterialprice(new BigDecimal(number.toString()).toString());
}
arrayListMaterials.set(position, data);
setTotalPrice(arrayListMaterials);
}catch (Exception e) {
e.printStackTrace();
}
if(this.nameOrcost.equals("cost") && edtText.getEditableText().toString().trim().length()>0){
Utilty.insertCommaIntoNumber(edtText, sEditable.toString());
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
try{
if(this.nameOrcost.equals("cost"))
data.setMaterialprice("0");
if(this.nameOrcost.equals("name"))
data.setMaterialName("");
arrayListMaterials.set(position, data);
}catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
}