2013-02-22 3 views
7

Ich habe zwei SearchViews in einem XML-Layout:Zwei SearchViews in einer Aktivität und Bildschirm-Rotation

<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> 

Und ich dieses Layout meiner MainActivity durch setContentView aufblasen(). Dann rufe ich Methoden setQuery() für einander auf.

Alles ist in Ordnung, bis eine Bildschirmdrehung. Wenn ich den Bildschirm rotiere, hat jede searchView den Text "World" anstelle von "Hello" und "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); 
    } 
} 

Jemand kann erklären, was schief läuft?

+0

Ist dies die einzige Referenz, die Ihre Suchabfragen in onCreate erhalten? Ich nehme an, nein .. Wenn nicht, dann möchten Sie vielleicht diesen relevanten Code – JoxTraex

+1

Ich habe versucht, Ihren Code und haben das gleiche Verhalten wie Sie ... so alles zu reproduzieren das Problem ist in der post – ben75

+0

Ja, es ist das einzige eine Referenz. Ich benutze es nicht mehr. – lukjar

Antwort

11

Die SearchView als Inhalt verwenden die Ansicht von Aufblasen einer Layout-Datei geführt. Als Ergebnis haben alle SearchViews, die im Layout einer Aktivität (wie in Ihrem Fall) verwendet werden, als Inhalt Ansichten mit denselben IDs. Wenn Android versucht, den Status zu speichern, um die Konfigurationsänderung zu handhaben, wird es sehen, dass die EditTexts aus der SearchViews die gleiche ID haben und es den gleichen Zustand für alle von ihnen wiederherstellen wird.

Der einfachste Weg, um dieses Problem zu umgehen ist die Activity ‚s onSaveInstanceState und onRestoreInstanceState wie folgt zu verwenden:

@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); 
} 

Auch in diesem related question einen Blick.

+0

Danke. Es klappt ;). Sehr wichtig in diesem Fall ist das Wiederherstellen der Instanz in der onRestoreInstanceState() -Methode. Wenn ich dies in onCreate mache, funktioniert es nicht. Wahrscheinlich überschreiben die Werte "Hello" und "World" von onCreate in der onRestore-Methode. – lukjar

-1

Eine Möglichkeit, dieses Problem zu beheben, besteht darin, die Änderung des Orientierungsereignisses mit Ihrer Aktivität zu erfassen und dann die Abfrage erneut in Ihren beiden Suchsichten festzulegen.

+0

Kannst du etwas mehr darüber schreiben? – lukjar

+0

Es ist nicht zu kompliziert, Google, wie Sie die Ausrichtung Änderung in Ihrer Aktivität zu hören und dann nur Ihre zwei Suchansichten neu konfigurieren. – JoxTraex

-2

Fügen Sie diese in dem in Aktivität manifestieren Sie mit zwei SearchView

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

@ loocash1989 überprüfen Sie meine Antwort und benachrichtigen Sie mich, ob dies hilfreich ist oder nicht. – Rahil2952

+1

gut ... das ist keine Antwort auf die Frage. Es ist eine Art Workaround, aber es hat einige Nachteile. – ben75

+0

Es ist keine gute Lösung für mich, aber ich gebe zu, dass es auch funktioniert. Ich habe in SearchView nach einem Bug gesucht. Außerdem sollte meine Aktivität nach der Bildschirmdrehung neu erstellt werden und ich möchte ihr Standardverhalten nicht ändern. Danke für deine Antwort. Ich denke, dass es für jemanden hilfreich sein kann. – lukjar

Verwandte Themen