0

My R.string.display_preferences_sort_default_value is not returning correct value from the strings.xml file. The value declare in strings.xml is "popular", however the value that is returned in the onStart() method is "popularity.desc".

In the onCreate method i initialize the preference manager and in onStart get the sortorder declared in strings.xml

 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setHasOptionsMenu(true);
     prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
     ...
 }

public void onStart() {
    super.onStart();

    // get sort order to see if it has recently changed
    String prefSortOrder = prefs.getString(
            getString(R.string.display_preferences_sort_order_key),
            getString(R.string.display_preferences_sort_default_value)
    );

    ...
 }

strings.xml

<string name="display_preferences_sort_order_key">sortType</string>
<string name="display_preferences_sort_default_value">popular</string>

Fragment class: Below is my fragment class. The sortOrder by default has a value popularity.desc

public class MovieListFragment extends Fragment{

private final String LOG_TAG = MovieListFragment.class.getSimpleName();
private final String STORED_MOVIES = "stored_movies";
private SharedPreferences prefs;
private ImageAdapter mMoviePosterAdapter;
String sortOrder;
List<Movie> movies = new ArrayList<Movie>();

public MovieListFragment() {
    setHasOptionsMenu(true);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
    prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
    sortOrder = prefs.getString(getActivity().getString(R.string.display_preferences_sort_order_key),
            getActivity().getString(R.string.display_preferences_sort_default_value));

    if(savedInstanceState != null){
        ArrayList<Movie> storedMovies = new ArrayList<Movie>();
        storedMovies = savedInstanceState.<Movie>getParcelableArrayList(STORED_MOVIES);
        movies.clear();
        movies.addAll(storedMovies);
    }
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    return super.onOptionsItemSelected(item);
}

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

    mMoviePosterAdapter = new ImageAdapter(
            getActivity(),
            R.layout.list_item_poster,
            R.id.list_item_poster_imageview,
            new ArrayList<String>());

    View rootView = inflater.inflate(R.layout.fragment_movie_list, container, false);
    GridView gridView = (GridView) rootView.findViewById(R.id.main_movie_grid);
    gridView.setAdapter(mMoviePosterAdapter);

    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
            Movie details = movies.get(position);
            Intent intent = new Intent(getActivity(), MovieDetailActivity.class)
                    .putExtra("movies_details", details);
            startActivity(intent);
        }

    });

    return rootView;
}

@Override
public void onStart() {
    super.onStart();

    // get sort order to see if it has recently changed
    String prefSortOrder = prefs.getString(getString(R.string.display_preferences_sort_order_key),
            getString(R.string.display_preferences_sort_default_value));

    if(movies.size() > 0 && prefSortOrder.equals(sortOrder)) {
        updatePosterAdapter();
    }else{
        sortOrder = prefSortOrder;
        getMovies();
    }
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    ArrayList<Movie> storedMovies = new ArrayList<Movie>();
    storedMovies.addAll(movies);
    outState.putParcelableArrayList(STORED_MOVIES, storedMovies);
}

private void getMovies() {
    FetchMoviesTask fetchMoviesTask = new FetchMoviesTask(new AsyncResponse() {
        @Override
        public void onTaskCompleted(List<Movie> results) {
            movies.clear();
            movies.addAll(results);
            updatePosterAdapter();
        }
    });
    fetchMoviesTask.execute(sortOrder);
}

// updates the ArrayAdapter of poster images
private void updatePosterAdapter() {
    mMoviePosterAdapter.clear();
    for(Movie movie : movies) {
        mMoviePosterAdapter.add(movie.getPoster());
    }
}

}

Mahesh N
  • 772
  • 1
  • 10
  • 21
  • I tried modifying the getstring() method, but still the issue persists. Previously i had popularity.desc, but later i updated the strings.xml file and I have made sure i clean and rebuild the project again – Mahesh N Oct 13 '16 at 23:41
  • I'm a bit confused. You're saying that `getString(R.string.display_preferences_sort_default_value)` is returning "popularity.desc" instead of "popular"? Are you supporting different string resources based on locale? – Gino Mempin Oct 14 '16 at 00:13
  • No there is only one strings.xml. – Mahesh N Oct 14 '16 at 00:15
  • If you are trying to access strings in fragment from strings.xml, then you need to use getActivity().getString(string id) – Quantum_VC Oct 14 '16 at 00:16
  • Can you also post a snippet of the XML for the sort order preference? The `R.string.display_preferences_sort_default_value` will not really be used if the key passed to pref.getString(key,defaultValue) exists, the actual value will be returned instead. Is it possible that the pref already exists and is already set to "popular.desc"? – Gino Mempin Oct 15 '16 at 01:21
  • preference order from strings.xml Sort Order Select sort order for the movies sortType popular – Mahesh N Oct 15 '16 at 01:28

2 Answers2

0

Try this:

String prefSortOrder = prefs.getString(getActivity().getString(R.string.display_preferences_sort_order_key),getActivity().getString(R.string.display_preferences_sort_default_value));

Reference: Access to getString() in android.support.v4.app.FragmentPagerAdapter?

Community
  • 1
  • 1
Quantum_VC
  • 185
  • 13
0

The previous preferences value was stored in SharedPreferences from a previous version of the code. I uninstalled and -reinstalled the package and it worked

Mahesh N
  • 772
  • 1
  • 10
  • 21