【发布时间】:2016-10-13 23:21:57
【问题描述】:
我的 R.string.display_preferences_sort_default_value 没有从 strings.xml 文件返回正确的值。 strings.xml 中声明的值是“popular”,但在 onStart() 方法中返回的值是“popularity.desc”。
在 onCreate 方法中,我初始化首选项管理器并在 onStart 中获取在 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)
);
...
}
字符串.xml
<string name="display_preferences_sort_order_key">sortType</string>
<string name="display_preferences_sort_default_value">popular</string>
片段类:下面是我的片段类。 sortOrder 默认有一个值 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());
}
}
}
【问题讨论】:
-
我尝试修改 getstring() 方法,但问题仍然存在。以前我有popularity.desc,但后来我更新了strings.xml 文件,我确保我再次清理并重建项目
-
我有点困惑。你是说
getString(R.string.display_preferences_sort_default_value)返回的是“popularity.desc”而不是“popular”?您是否支持基于语言环境的不同字符串资源? -
不,只有一个strings.xml。
-
如果你试图从strings.xml访问片段中的字符串,那么你需要使用getActivity().getString(string id)
-
您还可以为排序顺序首选项发布 XML 的 sn-p 吗?如果传递给 pref.getString(key,defaultValue) 的键存在,
R.string.display_preferences_sort_default_value将不会真正使用,而是返回实际值。首选项是否可能已经存在并且已经设置为“popular.desc”?
标签: android android-studio android-fragments