7

1 つの xml レイアウトに 2 つの 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>

そして、setContentView() によって、このレイアウトを MainActivity にインフレートします。次に、メソッド setQuery() を相互に呼び出します。

画面が回転するまでは問題ありません。画面を回転すると、すべての searchView に「Hello」と「World」の代わりに「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);
    }
}

誰かが何がうまくいかないのか説明できますか?

4

3 に答える 3

13

SearchView、レイアウト ファイルを膨張させた結果のビューをコンテンツとして使用します。その結果、SearchViewsアクティビティのレイアウトで使用されるすべてのもの(あなたのケースのように)は、コンテンツとして同じIDを持つビューを持ちます。EditTextsAndroid が構成の変更を処理するために状態を保存しようとすると、からが同じ ID を持っていることがわかり、SearchViewsそれらすべてに対して同じ状態が復元されます。

この問題を処理する最も簡単な方法は、 を次のように使用することActivityです。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);
}

この関連する質問もご覧ください。

于 2013-02-28T12:48:38.580 に答える
-1

この問題を軽減する 1 つの方法は、アクティビティで方向イベントの変化をキャプチャし、2 つの検索ビューでクエリを再度設定することです。

于 2013-02-22T13:11:45.527 に答える
-2

これを2つ持っているアクティビティのマニフェストに追加しますSearchView

 android:configChanges="keyboardHidden|orientation|screenSize"
于 2013-02-28T12:40:09.930 に答える