2013-02-22 15 views
7

私は1つのXMLレイアウトで2 SearchViewsあります二つのアクティビティで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ごとに "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); 
    } 
} 

何が問題なのか説明できますか?

+0

searchviewsが取得するのはonCreateの唯一の参考資料ですか?私は何もしないと仮定しています。そうでなければ、関連するコードを投稿したいかもしれません。 – JoxTraex

+1

私はあなたのコードを試してみて、あなたと同じ振る舞いをしています...問題を再現するためのすべてが投稿にあります – ben75

+0

はい、 1つの参照。私はもうそれを使用しません。 – lukjar

答えて

11

を持っている中での活動にマニフェストにこれを追加します。その結果、アクティビティ(あなたの場合のような)のレイアウトで使用されるSearchViewsはすべて、同じIDを持つビューとしてコンテンツとして保持されます。 Androidが設定変更を処理するために状態を保存しようとすると、SearchViewsEditTextsは同じIDを持ち、すべての状態が同じ状態に復元されます。

この問題に対処する最も簡単な方法は、このよう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); 
} 

はまた、このrelated questionを見ています。

+0

ありがとうございます。できます ;)。この場合、onRestoreInstanceState()メソッドのインスタンスを復元することが非常に重要です。 onCreateでこれを行うと、うまくいきません。 OnCreateからの "Hello"と "World"の値は、onRestoreメソッドでオーバーライドされている可能性があります。 – lukjar

-1

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

+0

あなたはこれ以上の俯瞰を書くことができますか? – lukjar

+0

それほど複雑ではないGoogleでは、あなたの活動の方向変化を聞いて、2つの検索ビューを再構成するしか方法はありません。 – JoxTraex

-2

あなたはSearchViewビューはレイアウトファイルを膨張に起因し、その内容として使用する2つのSearchView

android:configChanges="keyboardHidden|orientation|screenSize" 
+0

@ loocash1989私の答えをチェックし、これが役立つかどうか私に通知してください。 – Rahil2952

+1

...これは質問に対する答えではありません。これは回避策のようですが、いくつかの欠点があります。 – ben75

+0

それは私にとっては良い解決策ではありませんが、それもうまくいくと私は認めます。私はSearchView内のバグを探していました。さらに、画面の回転後に私のアクティビティを再作成する必要があり、デフォルトの動作を変更したくないです。ご回答有難うございます。私はそれが誰かにとって有益かもしれないと思う。 – lukjar

関連する問題