Error getting data from a Spinner

0

I'm getting some data from 3 spinner and I get an error, it says it's a null object, however, this same code works for me in another activity, only now I'm using it in a fragment and it gives me an error.

This is the logcat

05-03 23:14:29.952 32009-32009/com.example.matias.finalcode E/AndroidRuntime: FATAL EXCEPTION: main
                                                                              Process: com.example.matias.finalcode, PID: 32009
                                                                              java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.matias.finalcode/com.example.matias.finalcode.InicioActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
                                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2309)
                                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2369)
                                                                                  at android.app.ActivityThread.access$800(ActivityThread.java:149)
                                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1289)
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                  at android.os.Looper.loop(Looper.java:135)
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:5258)
                                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                                  at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
                                                                               Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
                                                                                  at com.example.matias.finalcode.Fragments.InicioFragment_LookingService.onCreateView(InicioFragment_LookingService.java:161)
                                                                                  at android.support.v4.app.Fragment.performCreateView(Fragment.java:2261)
                                                                                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1419)
                                                                                  at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1750)
                                                                                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1819)
                                                                                  at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797)
                                                                                  at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2590)
                                                                                  at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2377)
                                                                                  at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2332)
                                                                                  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2239)
                                                                                  at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3231)
                                                                                  at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3181)
                                                                                  at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:192)
                                                                                  at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:572)
                                                                                  at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:177)
                                                                                  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1220)
                                                                                  at android.app.Activity.performStart(Activity.java:5995)
                                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2272)
                                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2369) 
                                                                                  at android.app.ActivityThread.access$800(ActivityThread.java:149) 
                                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1289) 
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                  at android.os.Looper.loop(Looper.java:135) 
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:5258) 
                                                                                  at java.lang.reflect.Method.invoke(Native Method) 
                                                                                  at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898) 
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693) 
05-03 23:14:29.954 788-6026/? W/ActivityManager:   Force finishing activity com.example.matias.finalcode/.InicioActivity

And this is the code of my spinner and the variables where I get the spinner data

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    final View vista = inflater.inflate(R.layout.fragment_inicio_lookingservice, container, false);

    signOut = (Button) vista.findViewById(R.id.sign_out); //--------ESTO ES PARA LOGOUT
    email = (TextView) vista.findViewById(R.id.email);
    btnseleccionar = (Button) vista.findViewById(R.id.btnseleccionar);
    spinnerPro = (Spinner) vista.findViewById(R.id.spinnerProvincia);
    spinnerLoc = (Spinner) vista.findViewById(R.id.spinnerLocalizacion);
    spinnerTipoEmpresa = (Spinner) vista.findViewById(R.id.spinnerTipoEmpresa);
    spinnerElegirEmpresa = (Spinner) vista.findViewById(R.id.spinnerElegirEmpresa);
    email.setVisibility(View.INVISIBLE);



    // ESTO ES PARA LOS SPINNER

    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
            getActivity(),
            R.array.array_provincias,
            android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinnerPro.setAdapter(adapter);
    spinnerPro.setOnItemSelectedListener(this);

    spinnerLoc.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
            // Tu código aquí

            final String selecteditemLoc = spinnerLoc.getSelectedItem().toString();
            //txtloc.setText(selecteditem);

        }

        @Override
        public void onNothingSelected(AdapterView<?> parentView) {
            // Tu código aquí
        }

    });

    ArrayAdapter<CharSequence> adapterempresa = ArrayAdapter.createFromResource(
            getActivity(),
            R.array.array_tipoempresa,
            android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinnerTipoEmpresa.setAdapter(adapterempresa);
    spinnerTipoEmpresa.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
            final String selecteditemEmp = spinnerTipoEmpresa.getSelectedItem().toString();
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }
    });

    final String selecteditemLoc = spinnerLoc.getSelectedItem().toString();
    String selecteditemEmp = spinnerTipoEmpresa.getSelectedItem().toString();
    final String provincias = provincia;

    mDatabase.child("z Empresas " + provincia).child(selecteditemLoc).child(selecteditemEmp).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // Is better to use a List, because you don't know the size
            // of the iterator returned by dataSnapshot.getChildren() to
            // initialize the array
            final List<String> Usuarios = new ArrayList<String>();

            for (DataSnapshot usuarioSnapshot: dataSnapshot.getChildren()) {
                String Usuario = usuarioSnapshot.child("Usuario").getValue(String.class);
                Usuarios.add(Usuario);
            }

            spinnerElegirEmpresa = (Spinner) vista.findViewById(R.id.spinnerElegirEmpresa);
            ArrayAdapter<String> empresasAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, Usuarios);
            empresasAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spinnerElegirEmpresa.setAdapter(empresasAdapter);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    // ESTO ES PARA LOS SPINNER

    return vista;
}

// ESTO ES PARA LOS SPINNER FUERA DEL ONCREATEVIEW
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {

    int[] localidades = {R.array.array_selecciona, R.array.array_sevilla, R.array.array_malaga};

    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
            getActivity(),
            localidades[i],
            android.R.layout.simple_spinner_item);

    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinnerLoc.setAdapter(adapter);

    //txtloc.setText(spinnerLoc.getSelectedItem().toString());
    //txtpro.setText(adapterView.getItemAtPosition(i).toString());
    provincia = adapterView.getItemAtPosition(i).toString();

}

@Override
public void onNothingSelected(AdapterView<?> adapterView) {

}
// ESTO ES PARA LOS SPINNER

And these are the array from which I get the values for the spinners, they are in the file string.xml

<string-array name="array_tipoempresa">
        <item>Selecciona un tipo de empresa</item>
        <item>Banco</item>
        <item>Farmacia</item>
        <item>Notaría</item>
        <item>Ferretería</item>
        <item>Atención pública</item>
        <item>Hospital</item>
        <item>Telefonía</item>
        <item>Otro tipo de empresas</item>
    </string-array>

    <string-array name="array_selecciona">
        <item>Selecciona una ciudad</item>
    </string-array>

    <string-array name="array_provincias">
        <item>Selecciona un país</item>
        <item>Sevilla</item>
        <item>Malaga</item>
    </string-array>

    <string-array name="array_sevilla">
        <item>Selecciona una ciudad</item>
        <item>Tomares</item>
        <item>Camas</item>
    </string-array>

    <string-array name="array_malaga">
        <item>Selecciona una ciudad</item>
        <item>Casares</item>
        <item>Estepona</item>
    </string-array>

What will be the problem that tells me that it is a null object reference, if this same code works for me in a normal activity and now in a fragment it gives me an error ...

Of course, thank you very much for your time!

    
asked by Matías Nicolás Núñez Rivas 04.05.2018 в 04:22
source

1 answer

1

As the exception says, the error occurs on the following line:

  

Caused by: java.lang.NullPointerException: Attempt to invoke virtual   method 'java.lang.String java.lang.Object.toString ()' on a null object   reference                                                                                     at   com.example.matias.finalcode.Fragments.InicioFragment_LookingService.onCreateView (StartFragment_LookingService.java: 161 )

Assuming you mean this:

final String selecteditemLoc = spinnerLoc.getSelectedItem().toString();
final String selecteditemEmp = spinnerTipoEmpresa.getSelectedItem().toString();

You must ensure that said Spinners , both spinnerLoc , and spinnerTipoEmpresa have a selected item when invoking getSelectedItem() , because if not, it returns null and said null you are doing a conversion to toString(); . If you are obtaining the data that will be loaded to the Spinners in an asynchronous manner, that is, the data takes a while to arrive, you should assign these values to their variables, within the listener that obtains the data, once the set of the values at Spinner . In any case it is not necessary to check if the data is not null before saving it in a variable, with a simple if, example:

if(spinnerLoc.getSelectedItem() != null)
   selecteditemLoc = spinnerLoc.getSelectedItem().toString();

If this is not the case described above, you have another option:

  • Assign the onItemSelectedListener before assigning or selecting the item you want as manually selected.
  • Assign the element manually of the item you want example: spinnerLoc.setSelection(/*indice del elemento*/);
  • Once the previous two steps have been done, assign the value in onItemSelected corresponding to Spinner .

    selecteditemLoc = spinnerLoc.getSelectedItem().toString();
    

Update:

According to what you tell me in your comment, what you want is "to obtain the data but taking into account that Spinners are connected":

Simply do the following:

Delete all local variables:

final String selecteditemLoc = spinnerLoc.getSelectedItem().toString();
final String selecteditemEmp = spinnerTipoEmpresa.getSelectedItem().toString();
final provincia = provincias;

Declare the variables that will save the data of the selected item globally, in the class.

private String selecteditemLoc;
private String selecteditemEmp;
private String provincia;

and in each onItemSelected call its corresponding value, for example for spinnerLoc :

spinnerLoc.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {

            selecteditemLoc = spinnerLoc.getSelectedItem().toString();

        }

        @Override
        public void onNothingSelected(AdapterView<?> parentView) {
            // Tu código aquí
        }
    });

and so on with each of the values. So you can be sure that these variables will save their respective selected values and you can use them anywhere in the class.

    
answered by 04.05.2018 / 12:32
source