Domanda

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.

È stato utile?

Soluzione

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top