【问题标题】:Android R.string not returning default value from strings.xml fileAndroid R.string 未从 strings.xml 文件返回默认值
【发布时间】: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


【解决方案1】:

试试这个:

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

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

【讨论】:

  • 这仍然不起作用。我在 getstring() 方法中使用了 getActivity()
【解决方案2】:

以前的首选项值存储在以前版本代码的 SharedPreferences 中。我卸载并重新安装了这个包,它工作了

【讨论】:

  • 太棒了!!一劳永逸
猜你喜欢
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
  • 2022-01-05
  • 2021-04-30
相关资源
最近更新 更多