2016-10-13 25 views
0

我的R.string.display_preferences_sort_default_value未從strings.xml文件返回正確的值。在strings.xml中聲明的值是「流行的」,但onStart()方法返回的值是「popular.desc」。Android R.string未從strings.xml文件返回默認值

在onCreate方法我初始化偏好管理和處理通信獲得的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> 

片段類中聲明的排序順序:下面是我的片段類。默認情況下,中將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()); 
    } 
} 

}

+0

我嘗試修改getstring()方法,但問題依然存在。以前我有popular.desc,但後來我更新了strings.xml文件,並確保我清理並重新重建項目 –

+0

我有點困惑。你說'getString(R.string.display_preferences_sort_default_value)'正在返回「popular.desc」而不是「popular」?你是否支持基於locale的不同字符串資源? –

+0

不,只有一個strings.xml。 –

回答

0

試試這個:

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?

+0

這仍然不起作用。我在getstring()方法中使用了getActivity() –

+0

與問題無關,只是一個建議,對片段使用空構造函數。 它看起來像你使用的首選項,它用於管理/存儲設置界面的種類(多個參數)。但是,如果你需要一個單獨的項目,然後去SharedPreference。 檢查這些鏈接: [1] http://stackoverflow.com/questions/33447290/whats-the-difference-between-getdefaultsharedpreferences-and-getpreferences [2] https://developer.android.com/guide /topics/ui/settings.html –

0

先前的喜好值存儲在SharedPreferences從以前版本的代碼。我卸載並重新安裝了這個軟件包,它工作

+0

太棒了!無所事事 – Shivansh