我有一個包含SearchView的片段。這個片段包含在我的HomeActivity和我的SearchResultsActivity中。保存片段/視圖狀態
當用戶使用HomeActivity中的SearchView執行搜索時,它們會在SearchResultsActivity中顯示結果。
我想讓它使用戶在HomeActivity上的SearchView中輸入查詢時,它們的查詢字符串被SearchResultsActivity上的SearchView記住。
我已經嘗試了this similar issue的所有建議,但(與許多其他開發人員一起)似乎工作的唯一解決方案似乎並不合適 - 也就是將查詢保存在靜態字符串中片段類。
這裏是我的代碼顯示了這種做法......
'公共類ProductSearchViewFragment擴展片段{
private static final String LOG_TAG = ProductSearchViewFragment.class.getSimpleName();
private static final String KEY_QUERY = "query";
private static String mQuery = null;
public ProductSearchViewFragment() {
setArguments(new Bundle());
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_product_search_view, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
/*
* Populate the searchView if there is a previous query
*/
SearchView searchView = (SearchView)getView().findViewById(R.id.searchView);
if (mQuery != null) {
Log.d(LOG_TAG, "######################### Setting searchView query from static String: " + mQuery);
searchView.setQuery(mQuery, false);
}
else {
Bundle mySavedInstanceState = getArguments();
String query = mySavedInstanceState.getString(KEY_QUERY);
if (query != null) {
// THIS CONDITION IS NEVER MET. I.E., query IS ALWAYS NULL
Log.d(LOG_TAG, "######################### Setting searchView query from bundle arguments: " + query);
searchView.setQuery(query, false);
}
else {
Log.d(LOG_TAG, "######################### Not setting searchView query.");
}
}
}
/*
* Unfortunately, onSaveInstanceState(Bundle outState) is not called,
* so attempt to save the query in our own arguments bundle.
*
*/
@Override
public void onPause() {
super.onPause();
SearchView searchView = (SearchView)getView().findViewById(R.id.searchView);
// Save to static field
mQuery = searchView.getQuery().toString();
// Save to arguments bundle
getArguments().putString(KEY_QUERY, mQuery);
Log.d(LOG_TAG, "#################### saved query: " + mQuery);
}
}`
...我認爲必須有一個更好的辦法雖然比使用這樣的靜態字符串。請問,這是什麼?從代碼中可以看到,我試圖在setArguments()
中保存查詢,但它永遠不會被檢索到。
我花了一些時間瀏覽一下Android文檔,它暗示使用onSaveInstanceState()
,但除非HomeActivity被破壞(這不會發生,也不想強制它),否則不會調用該文檔。
感謝您的支持。或者,是否有任何方法在兩個活動中使用相同的片段實例? – 2014-10-26 19:25:35
我能想到的唯一的事情就是在同一活動中同時擁有「主頁」和「搜索結果」屏幕。然後,您將有一個始終顯示在屏幕頂部的「搜索查詢」片段。當用戶點擊搜索時,它會刪除「家庭」片段,然後在其位置顯示「搜索結果」片段,但「搜索查詢」片段將始終停留在那裏。但取決於應用中的其他屏幕以及它們之間的導航,這可能會使事情更加複雜。 – dfinn 2014-10-26 23:09:27