【发布时间】:2023-03-08 06:43:01
【问题描述】:
我有一个包含 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 被销毁(这不会发生,我也不想强制它),否则不会调用它。
【问题讨论】:
标签: android android-activity android-fragments view savestate