0

I have:

  1. Fragment 1 that contains spinner of categories ,imageView.

  2. Fragment 2 contains back button.

At the beginning I select a value of spinner category after that when I download the picture from gallery the value of the spinner changes and returns to its initial position 0 and it's the same problem when I click button back on fragment2.

I was tinking using spinner.setSelection(poisition) but I dont know where shoud I make it in fragment!!

So How can I keep the selected value of spinner even if I get the image from gallery or I click on back button?

Source of CrateView:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    final View rootView = inflater.inflate(R.layout.fragment_add_book_photos,
            container, false);

    auth = FirebaseAuth.getInstance();
    mDatabase = FirebaseDatabase.getInstance();
    myRef = mDatabase.getReference("categories");
    spinnerCat = (Spinner) rootView.findViewById(R.id.spinner_cat_book);
    selectImage = (ImageView) rootView.findViewById(R.id.book_picture);

    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            final List<String> catListBook = new ArrayList<String>();

            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {

                Categoriesbook book = snapshot.getValue(Categoriesbook.class);
                String catBook = book.getNom_cat();
                catListBook.add(catBook);
            }

            ArrayAdapter<String> catAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, catListBook);
            spinnerCat.setAdapter(catAdapter);

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

            System.out.println("The read failed: " + databaseError.getMessage());

        }
    });

    spinnerCat.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            catlivre = (String) parent.getItemAtPosition(position);
        }

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

        }
    });

    selectImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showFileChooser();

        }
    });

    return rootView;

}
rafsanahmad007
  • 23,683
  • 6
  • 47
  • 62
Amal
  • 279
  • 3
  • 5
  • 21

2 Answers2

2

try this:

use SharedPreferences to save the selected position of Spinner

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    catlivre = (String) parent.getItemAtPosition(position);
    int selected_item = spinner.getSelectedItemPosition();
    SharedPreferences sharedPref = getActivity().getSharedPreferences("Position",0);
    SharedPreferences.Editor prefEditor = sharedPref.edit();
    prefEditor.putInt("spinner_item", selected_item);
    prefEditor.commit();
}

Now in your Framgent's onCreateView() you can load the previous selected spinner position at the beginning:

SharedPreferences sharedPref = getActivity().getSharedPreferences("Position", Context.MODE_PRIVATE);
    int spinnerValue = sharedPref.getInt("spinner_item",-1);
    if(spinnerValue != -1) {
        // set the value of the spinner 
        spinner.setSelection(spinnerValue,true);
    }
rafsanahmad007
  • 23,683
  • 6
  • 47
  • 62
  • I have err : `java.lang.NullPointerException at spinnerCat.setSelection(spinnerValue);` – Amal Mar 15 '17 at 17:40
  • you need to initialize the `spinnerCat = (Spinner) rootView.findViewById(R.id.spinner_cat_book);` first..add the code after that.. – rafsanahmad007 Mar 15 '17 at 17:44
  • Now I get the spinnerValue position but `spinnerCat.setSelection(spinnerValue);` dont work – Amal Mar 15 '17 at 19:03
  • 1
    Noted from this [Answer](http://stackoverflow.com/questions/1484528/android-setselection-having-no-effect-on-spinner) `spinner.setSelection(spinnerValue,true);` should be called after u set the adapter. to make it work – rafsanahmad007 Mar 15 '17 at 19:13
  • It is forbidden to say thank you but Thank you. it works – Amal Mar 15 '17 at 19:31
0

A fragment tells you when it comes out of view by calling the callbacks defined in the Fragment lifecycle. https://developer.android.com/guide/components/fragments.html

All you need to do is code the state storage and retrieval in those callbacks.

Radovan
  • 142
  • 1
  • 10