I've this problem of not being able to get the user input from the second inflated view. I've upload an picture to this site http://postimage.org/image/b4syhdzrr/ as I'm still not allowed to post images directly on SO.

As you can see, the TextView only displays the top two EditText inputs + calculations, the third input however was not taken into consideration.(The first EditText for numbers is not inflated)

As I'm not sure how many EditText the end user would need. How should I go about getting user inputs from all of the EditText ?

Here's what I had tried, setting up a SharePreferences to store the user input inside a TextWatcher, inside a OnClickListener, but with this code, the OnClickListener for the Plus button crashes the app even if the TextWatcher is empty.

public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            // TODO Auto-generated method stub
            int position = spinner.getSelectedItemPosition();
            switch (position) {
            case 0:
                ll = (LinearLayout) findViewById(R.id.llSetView);
                ll.removeAllViews();
                View person1 = View.inflate(BillCalculator1.this,R.layout.person1, null);
                ll.addView(person1);

                btP1Add = (Button) ll.findViewById(R.id.buttonP1Add);
                btP1Gst = (Button) ll.findViewById(R.id.buttonP1GST);
                btP1Add.setOnClickListener(new View.OnClickListener() {

                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        llNewRow = (LinearLayout) findViewById(R.id.llP1AddNewRow);
                        etNewRow = (EditText) findViewById(R.id.editTextNewRow);
                        View newRow = View.inflate(BillCalculator1.this,R.layout.newrow, null);
                        llNewRow.addView(newRow);

                        TextWatcher input = new TextWatcher() {
                            public void afterTextChanged(Editable s) {
                            }
                            //SharedPreferences here

                            public void beforeTextChanged(CharSequence s,
                                    int start, int count, int after) {
                            }

                            public void onTextChanged(CharSequence s,
                                    int start, int before, int count) {
                            }
                        };

                    }
                });

The XML for the inflated view

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<EditText
    android:id="@+id/editTextNewRow"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ems="10"
    android:inputType="numberDecimal"
    android:hint="Enter new amount">

    <requestFocus />
</EditText>

Very new to programming and Android, do let me know if there's any additional information needed, Thank you very much.

有帮助吗?

解决方案

I would try another approach to what you're trying to do. I would add a special TextWatcher to the inflated EditText and store the user entered values in an ArrayList. First of all you'll need two extra fields in your class:

private ArrayList<String> mData = new ArrayList<String>(); // this will store the entered values
private static int counter = 0; // to identify the rows

Make a class that implements the TextWatcher interface like this:

    public class InputWatcher implements TextWatcher {

            private int mRowNumber;

            public InputWatcher(int rowNumber) {
                mRowNumber = rowNumber;
            }

            @Override
            public void afterTextChanged(Editable s) {
                // here you'll add the text as the user enters it in the correct position in the
                mData.set(mRowNumber, s.toString());                    
            }
     }

Then:

int position = spinner.getSelectedItemPosition();
switch (position) {
case 0:
     mData.clear();
     counter = 0;
     ll = (LinearLayout) findViewById(R.id.llSetView);
     ll.removeAllViews();
     // I sure hope that you have the Buttons with the id button1Add and buttonP1GST in the layout that you inflate
     // otherwise the code will throw a NullPointerException when you use them below
     View person1 = View.inflate(BillCalculator1.this,R.layout.person1, null);
     ll.addView(person1);
     btP1Add = (Button) ll.findViewById(R.id.buttonP1Add);
     btP1Gst = (Button) ll.findViewById(R.id.buttonP1GST);
     btP1Add.setOnClickListener(new View.OnClickListener() {

           public void onClick(View v) {
                 // add an entry in the data holder for this row
        mData.add("");
        View newRow = View.inflate(BillCalculator1.this,
                        R.layout.newrow, null);
        EditText justAdded = (EditText) newRow
                        .findViewById(R.id.editTextNewRow);
        justAdded.addTextChangedListener(new InputWatcher(counter));
        ll.addView(newRow);
        counter++;
           }
     });

When it's time to calculate the total, in a Button's OnClickListener, just do:

@Override
public void onClick(View v) {
        int storedSize = mData.size();
    int sum = 0;
    for (int i = 0; i < storedSize; i++) {
        sum += Integer.parseInt(mData.get(i).equals("") ? "0"
                            : mData.get(i));
    }
    Toast.makeText(getApplicationContext(), "Total" + sum,              Toast.LENGTH_SHORT).show();
}

From your picture I didn't understand if you already start with one EditText in the layout(the one to the left of the + Button). If this is the case then you would have to manually set the InputWatcher to it and move the counter incrementation before adding the InputWatcher where you add the rows.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top