两个SearchViews在一个活动和屏幕旋转

我有一个xml布局中的两个SearchViews:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <SearchView android:id="@+id/my_first_custom_view" android:layout_width="wrap_content" android:layout_height="wrap_content" > </SearchView> <SearchView android:id="@+id/my_second_custom_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/my_first_custom_view" > </SearchView> </RelativeLayout> 

我通过setContentView()将这个布局膨胀到我的MainActivity。 然后我为对方调用方法setQuery()。

一切都很好,直到屏幕旋转。 当我旋转屏幕每个searchView有文本“世界”,而不是“你好”和“世界”。

  public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SearchView firstSearchView = (SearchView) findViewById(R.id.my_first_custom_view); SearchView secondSearchView = (SearchView) findViewById(R.id.my_second_custom_view); firstSearchView.setQuery("Hello!", false); secondSearchView.setQuery("World", false); } } 

有人可以解释发生了什么问题?

Solutions Collecting From Web of "两个SearchViews在一个活动和屏幕旋转"

SearchView使用膨胀布局文件导致的视图作为其内容。 因此,活动布局中使用的所有SearchViews (如您的情况)将具有相同ID的内容和视图。 当Android将尝试保存状态来处理configuration更改时,它会看到来自SearchViewsEditTexts具有相同的ID,并且它将为它们恢复相同的状态。

处理这个问题最简单的方法是使用ActivityonSaveInstanceStateonRestoreInstanceState像这样:

 @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // state for the first SearchView outState.putString("sv1", firstSearchView.getQuery().toString()); // state for the second SearchView outState.putString("sv2", secondSearchView.getQuery().toString()); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); // properly set the state to balance Android's own restore mechanism firstSearchView.setQuery(savedInstanceState.getString("sv1"), false); secondSearchView.setQuery(savedInstanceState.getString("sv2"), false); } 

也看看这个相关的问题 。

解决此问题的一种方法是,捕获您的活动的方向事件更改,然后在两个search视图中再次设置查询。

将其添加到您有两个SearchView活动中的清单

  android:configChanges="keyboardHidden|orientation|screenSize"