2014-10-26 132 views
0

我有一個包含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被破壞(這不會發生,也不想強制它),否則不會調用該文檔。

回答

1

如果我正在閱讀您的問題,聽起來您有兩個不同的ProductSearchViewFragment實例 - 在您的「主屏幕」上,在您的「搜索結果」屏幕上顯示一個實例。因此,在您的主屏幕上,它會在創建活動時創建片段,並在活動被破壞時將其破壞。然後在搜索結果活動中創建該片段的一個新實例(並在活動被銷燬時銷燬)。因此,在一個實例上設置的參數不會自動轉到單獨的實例。

我的建議是,當用戶點擊家庭活動中的「搜索」按鈕時,將搜索查詢從片段傳遞到家庭活動。然後,當家庭活動創建搜索結果活動的實例時,它可以在啓動意向中傳遞指定搜索字符串的額外信息,然後搜索結果活動可以在創建搜索片段時在片段參數中使用它。

+0

感謝您的支持。或者,是否有任何方法在兩個活動中使用相同的片段實例? – 2014-10-26 19:25:35

+0

我能想到的唯一的事情就是在同一活動中同時擁有「主頁」和「搜索結果」屏幕。然後,您將有一個始終顯示在屏幕頂部的「搜索查詢」片段。當用戶點擊搜索時,它會刪除「家庭」片段,然後在其位置顯示「搜索結果」片段,但「搜索查詢」片段將始終停留在那裏。但取決於應用中的其他屏幕以及它們之間的導航,這可能會使事情更加複雜。 – dfinn 2014-10-26 23:09:27