2013-02-22 12 views
7

Ho due SearchViews a disposizione uno xml:Due SearchViews in un'attività e rotazione dello schermo

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

E io gonfiano questo layout al mio MainActivity da setContentView(). Quindi chiamo i metodi setQuery() l'uno per l'altro.

Tutto va bene fino alla rotazione dello schermo. Quando ruoto lo schermo, ogni ricerca ha il testo "Mondo" invece "Ciao" e "Mondo".

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

Qualcuno può spiegare cosa sta andando male?

+0

È questo l'unico riferimento che le tue immagini di ricerca ottengono su onCreate? Suppongo di no .. se così non fosse, potresti voler postare quel codice rilevante – JoxTraex

+1

Ho provato il tuo codice e ho lo stesso comportamento di te ... quindi tutto per riprodurre il problema è nel post – ben75

+0

Sì, è l'unico un riferimento Non lo uso più – lukjar

risposta

11

Il SearchView utilizza come il suo contenuto la vista il risultato di gonfiare un file di layout. Di conseguenza, tutto il SearchViews utilizzato nel layout di un'attività (come nel caso) avrà come contenuto, visualizzazioni con gli stessi ID. Quando Android tenterà di salvare lo stato per gestire la modifica della configurazione, vedrà che lo EditTexts dello SearchViews ha lo stesso ID e ripristinerà lo stesso stato per tutti loro.

Il modo più semplice per gestire questo problema è quello di utilizzare s' onSaveInstanceState e onRestoreInstanceState in questo modo il Activity:

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

hanno anche un'occhiata a questo related question.

+0

Grazie. Funziona ;). In questo caso è molto importante ripristinare l'istanza nel metodo onRestoreInstanceState(). Quando lo faccio su onCreate, non funziona. Probabilmente i valori "Hello" e "World" di onCreate sono sovrascritti nel metodo onRestore. – lukjar

-1

Un modo per alleviare questo problema è acquisire la modifica dell'evento di orientamento con l'attività e quindi impostare nuovamente la query sulle due viste di ricerca.

+0

Puoi scrivere qualcosa di più su questo? – lukjar

+0

Non è troppo complicato, Google come ascoltare il cambiamento di orientamento nella tua attività e quindi solo riconfigurare le due visualizzazioni di ricerca. – JoxTraex

-2

Aggiungi questo si manifesti in attività in cui si hanno due SearchView

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

@ loocash1989 controlla la mia risposta e informami se questo è utile o meno. – Rahil2952

+1

beh ... questa non è una risposta alla domanda. È una specie di soluzione alternativa ma presenta alcuni inconvenienti. – ben75

+0

Non è una buona soluzione per me, ma ammetto che funziona anche. Stavo cercando un bug all'interno di SearchView. Inoltre la mia attività dovrebbe essere ricreata dopo la rotazione dello schermo e non voglio cambiare il suo comportamento predefinito. Grazie per la tua risposta. Penso che possa essere utile per qualcuno. – lukjar

Problemi correlati