保存片段/视图的状态

时间:2014-10-26 18:37:57

标签: android android-activity android-fragments view savestate

我有一个包含SearchView的片段。这个片段包含在我的HomeActivity和我的SearchResultsActivity中。

当用户使用HomeActivity中的SearchView执行搜索时,会在SearchResultsActivity中显示结果。

我正努力让用户在HomeActivity上向SearchView输入查询时,SearchResultsActivity上的SearchView会记住他们的查询字符串。

我已经尝试了this similar issue的所有建议,但是(以及许多其他开发人员)似乎唯一有效的解决方案似乎不合适 - 也就是说,将查询保存为静态Fragment类中的字符串。

这是我的代码,显示了这种方法......

`public class ProductSearchViewFragment扩展Fragment {

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被销毁(这不会发生,我也不想强制它),所以不会调用它。

1 个答案:

答案 0 :(得分:1)

如果我正确地阅读您的问题,听起来您有两个不同的ProductSearchViewFragment实例 - 在您的" home"屏幕,以及您的搜索结果中的一个"屏幕。因此,在主屏幕上,它会在创建活动时创建片段,并在活动被销毁时销毁它。然后在搜索结果活动上创建该片段的新实例(并在销毁活动时销毁)。因此,在一个实例上设置的参数不会自动转移到单独的实例。

我的建议是当用户点击"搜索"在您的家庭活动按钮上,您将搜索查询从片段传递到家庭活动。然后,当主页活动创建搜索结果活动的实例时,它可以在指定搜索字符串的启动意图中传递额外的内容,然后搜索结果活动可以在创建搜索片段时在片段参数中使用它。 / p>