androiddynamicviewaddtextchangedlistener

Dynamic View with add button, how to find unique edtxt ID or anything else


I am building an android application where I am creating dynamic EditText View. I need to display the sum of all EditText on the top TextView. I am unable to find a way to do that, Can anyone help me with this.

And I am also not understanding, when I click on add button only one dynamic view seems to be LIVE, and rest seems to be sleeping....(this is just a part of my program...)

ThankYou in Advance.

Here is my XML

<LinearLayout
    android:id="@+id/linearBelowBoard"
    android:orientation="vertical"
    android:layout_below="@+id/button2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

</LinearLayout>

<Button
    android:text="Add"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/button2"
    android:layout_below="@+id/totalText"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginLeft="111dp"
    android:layout_marginStart="111dp" />

<TextView
    android:text="Sum"
    android:textStyle="bold"
    android:textSize="40dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/totalText"
    android:layout_alignParentTop="true"
    android:layout_alignRight="@+id/button2"
    android:layout_alignEnd="@+id/button2" />

row.xml

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="number"
            android:ems="10"
            android:id="@+id/editText"
            android:textColor="#000000"
            android:layout_toLeftOf="@+id/button"
            android:layout_toStartOf="@+id/button" />

        <Button
            android:text="Delete"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:id="@+id/button" />


    </RelativeLayout>


</LinearLayout>

Here is my Java File

    package com.example.rajiv.aaaplusbutton;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    EditText edt1;
    Button but_add, but_remove;
    TextView txtSum;
    LinearLayout linearBelowBoard;
    int e1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        linearBelowBoard = (LinearLayout) findViewById(R.id.linearBelowBoard);

        txtSum=(TextView)findViewById(R.id.totalText);


        but_add = (Button) findViewById(R.id.button2);
        but_add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                LayoutInflater layoutInflater =
                        (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                final View addView = layoutInflater.inflate(R.layout.row, null);


                edt1 = (EditText) addView.findViewById(R.id.editText);

                edt1.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) {
                        if (s.length() > 0) {

                        }
                    }

                    @Override
                    public void afterTextChanged(Editable s) {
                        calCheck();
                    }
                });


                Button but_remove = (Button) addView.findViewById(R.id.button);
                final View.OnClickListener thisListener = new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        ((LinearLayout) addView.getParent()).removeView(addView);
                    }
                };

                but_remove.setOnClickListener(thisListener);
                linearBelowBoard.addView(addView);


            }

        });

    }



    public void calCheck() {

        try {
            e1 = Integer.parseInt(edt1.getText().toString());
            txtSum.setText(Integer.toString(" What to Do? "));

        } catch (Exception e) {
}
}

Solution

  • Use below code to solve your problem: I made some changes in your code Try with this:

    package com.cj.myapplication;
    
    import android.content.Context;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.text.Editable;
    import android.text.TextWatcher;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    
    /**
     * Created by CHETAN JOSHI on 3/6/2017.
     */
    
    public class MainActivity extends AppCompatActivity {
    
        EditText edt1;
        Button but_add, but_remove;
        TextView txtSum;
        LinearLayout linearBelowBoard;
        int e1;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_my);
    
            linearBelowBoard = (LinearLayout) findViewById(R.id.linearBelowBoard);
            txtSum = (TextView) findViewById(R.id.totalText);
            but_add = (Button) findViewById(R.id.button2);
    
            but_add.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                    LayoutInflater layoutInflater =
                            (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    final View addView = layoutInflater.inflate(R.layout.row, null);
    
    
                    edt1 = (EditText) addView.findViewById(R.id.editText);
                    edt1.addTextChangedListener(new MyTextWatcher(edt1));
                    Button but_remove = (Button) addView.findViewById(R.id.button);
                    final View.OnClickListener thisListener = new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            ((LinearLayout) addView.getParent()).removeView(addView);
                        }
                    };
    
                    but_remove.setOnClickListener(thisListener);
                    linearBelowBoard.addView(addView);
    
                }
    
            });
    
        }
    
        private class MyTextWatcher implements TextWatcher {
    
            EditText mEditText = null;
    
            public MyTextWatcher(EditText mEditText) {
                this.mEditText = mEditText;
            }
    
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
            }
    
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
    
            }
    
            @Override
            public void afterTextChanged(Editable s) {
                calCheck(mEditText);
            }
        }
    
        public void calCheck(EditText editText) {
      try {
            if (linearBelowBoard != null) {
                e1 =0;
                for (int i = 0; i < linearBelowBoard.getChildCount(); i++) {
                    LinearLayout linearLayout = (LinearLayout)linearBelowBoard.getChildAt(i);
                    RelativeLayout relativeLayout = (RelativeLayout)linearLayout.getChildAt(0);
                    View view = relativeLayout.getChildAt(0);
                    EditText editText1 = null;
                    if (view instanceof EditText) {
                        editText1 = (EditText) view;
                    } else {
                        view = relativeLayout.getChildAt(1);
                        editText1 = (EditText) view;
                    }
                    String str = editText1.getText().toString();
                    if(str!=null && !str.equals("") && str.length()>0)
                    e1 = e1 + Integer.parseInt(editText1.getText().toString());
                }
                }
            txtSum.setText("" + String.valueOf(e1));
    
        } catch (Exception e) {
            e.printStackTrace();
        }
        }
    }
    

    enter image description here

    Please Check I crate one more method that return EditText by passing position. So you need to pass any position up to added counts of EditText then you will get EditText and you can getText().toString().

    update calCheck() method:

      public void calCheck(EditText editText) {
            try {
                if (linearBelowBoard != null) {
                    e1 = 0;
                    for (int i = 0; i < linearBelowBoard.getChildCount(); i++) {
                        EditText editText1 = getEditTextFromPosition(i);
                        String str = editText1.getText().toString();
                        if (str != null && !str.equals("") && str.length() > 0)
                            e1 = e1 + Integer.parseInt(editText1.getText().toString());
                    }
                }
                txtSum.setText("" + String.valueOf(e1));
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    Use Below Method to get Editext:

        private EditText getEditTextFromPosition(int position){
            EditText editText=null;
            LinearLayout linearLayout = (LinearLayout)linearBelowBoard.getChildAt(position);
            RelativeLayout relativeLayout = (RelativeLayout)linearLayout.getChildAt(0);
            View view = relativeLayout.getChildAt(0);
    
            if (view instanceof EditText) {
                editText = (EditText) view;
            } else {
                view = relativeLayout.getChildAt(1);
                editText = (EditText) view;
            }
            return editText;
        }