一个Activity和屏幕旋转中的两个SearchView

luk*_*jar 7 java android

我在一个xml布局中有两个SearchView:

<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>
Run Code Online (Sandbox Code Playgroud)

我通过setContentView()将此布局扩展到我的MainActivity.然后我为彼此调用方法setQuery().

在屏幕旋转之前一切正常.当我旋转屏幕时,每个searchView都有文本"World"而不是"Hello"和"World".

 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释出了什么问题吗?

Luk*_*rog 12

所述SearchView用途作为其内容的视图是由于膨胀的布局文件中.因此,SearchViews活动布局中使用的所有内容(如您的情况)将具有内容,具有相同ID的视图.当Android尝试保存状态以处理配置更改时,它将看到EditTexts来自SearchViews具有相同id的状态,并且它将为所有这些状态恢复相同的状态.

处理这个问题最简单的方法是使用Activity's onSaveInstanceStateonRestoreInstanceState这样:

@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);
}
Run Code Online (Sandbox Code Playgroud)

另外看看这个相关的问题.