如何在不同的膨胀线性布局视图中设置具有相同ID的edittext的值?

时间:2013-11-21 10:16:11

标签: android android-layout android-fragments android-edittext

我有一个主要布局和一个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);

}

我调试我的代码,列表的所有数据似乎都很好。对象按正确顺序排列,具有适当的值 请帮助我为什么只有最后一个对象值被设置为所有膨胀的表格。

任何帮助都会非常感激......先谢谢。

3 个答案:

答案 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) {
    }


}