Mike
Mike

Reputation: 6839

trying to get data from spinner but its NULL

I have a fragment which has a few spinners on it, which a user can select some options from, and a button at the bottom. I have the onClick for the button set to get the data from the spinner and then send it to a database with an asyncTask.

The fragment xml looks like this:

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

    <TextView
        android:id="@+id/tastePickTitle"
        android:text="Select a Taste: "
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:textSize="20sp"
        android:textStyle = "bold"
        android:padding="5dip"
        >
    </TextView>

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/taste_array"

        />

    <View
        android:layout_width="fill_parent"
        android:layout_height="30dp">
    </View>

    <TextView
        android:id="@+id/ammountPickTitle"
        android:text="How much taste: "
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:textSize="20sp"
        android:textStyle = "bold"
        android:padding="5dip"
        >
    </TextView>

    <Spinner
        android:id="@+id/spinner2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/ammount_array"

        />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >



        <Button
            android:id="@+id/addTasteButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Add Taste"
            android:layout_weight="1"
            />




    </LinearLayout>




</LinearLayout>

the fragment code is:

public class AddTastePage extends Fragment {

    String beerId = "";
    String url = "";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        //set layout here
        View v = inflater.inflate(R.layout.add_taste_layout, container, false);
        setHasOptionsMenu(true);
        getActivity().setTitle("Style");

        Bundle args = getArguments();
        beerId = args.getString("beerIDSent");

        //get user information
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
        String userName = prefs.getString("userName", null);
        final String userID = prefs.getString("userID", null);


        //set button on click

        //add button onclick fo top beers
        Button bt = (Button)v.findViewById(R.id.addTasteButton);
        bt.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                //todo: send taste tag to server
                //get spinner text
                Spinner tasteSpinner = (Spinner)v.findViewById(R.id.spinner1);
                String tasteText = tasteSpinner.getSelectedItem().toString();

                Spinner ammountSpinner = (Spinner) v.findViewById(R.id.spinner2);
                String ammountText = ammountSpinner.getSelectedItem().toString();


                int ammount = 0;
                if(ammountText.equals("A Hint")){
                    ammount = 1;
                }
                if(ammountText.equals("Medium")){
                    ammount = 2;
                }
                if(ammountText.equals("Strong")){
                    ammount = 3;
                }

                //construct url
                String url = "myURL";



                new UpdateTaste(getActivity()).execute(url);

                //todo: send back to taste list fragment, possible launch a save confirmation
                Fragment Fragment_three;
                FragmentManager man= getFragmentManager();
                FragmentTransaction tran = man.beginTransaction();
                Fragment_three = new TasteTags2();
                final Bundle bundle = new Bundle();
                bundle.putString("beerIDSent", beerId);
                Fragment_three.setArguments(bundle);
                tran.replace(R.id.main, Fragment_three);//tran.
                tran.addToBackStack(null);
                tran.commit();

            }
        });





        // Inflate the layout for this fragment
        return v;

    }


}

FC error:

02-14 20:29:59.102  19523-19523/com.beerportfolio.beerportfoliopro E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
02-14 20:30:21.266  19523-19523/com.beerportfolio.beerportfoliopro E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.NullPointerException
            at com.beerportfolio.beerportfoliopro.AddTastePage$1.onClick(AddTastePage.java:55)
            at android.view.View.performClick(View.java:4280)
            at android.view.View$PerformClick.run(View.java:17984)
            at android.os.Handler.handleCallback(Handler.java:730)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:158)
            at android.app.ActivityThread.main(ActivityThread.java:5789)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:843)
            at dalvik.system.NativeStart.main(Native Method)

Line 55 in AddTastePage is:

String ammountText = ammountSpinner.getSelectedItem().toString();

Upvotes: 0

Views: 345

Answers (2)

mohammed momn
mohammed momn

Reputation: 3210

You just need to declare the Spinner above setOnClickListener try this code :

        //add button onclick fo top beers
    Button bt = (Button)v.findViewById(R.id.addTasteButton);
    final Spinner tasteSpinner = (Spinner)v.findViewById(R.id.spinner1);
    final Spinner ammountSpinner = (Spinner) v.findViewById(R.id.spinner2);
    bt.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            //todo: send taste tag to server
            //get spinner text

            String tasteText = tasteSpinner.getSelectedItem().toString();


            String ammountText = ammountSpinner.getSelectedItem().toString();

Upvotes: 0

tyczj
tyczj

Reputation: 73808

you have 2 declarations of v and they are probably getting mixed up. You have this v

View v = inflater.inflate(R.layout.add_taste_layout, container, false);

and then you have this one which is v is the button you clicked

@Override
public void onClick(View v)

so that v will not have your spinner in it causing your spinner to be null because it cannot find it

rename the onClick one to something else, you will also probably have to make the first v that is your layout final because you are accessing it in the onClick

Upvotes: 1

Related Questions