Dos SearchViews en una actividad y rotación de pantalla

Tengo dos SearchViews en una disposición del xml:

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

Y hincho este diseño a mi MainActivity por setContentView (). Entonces llamo a los métodos setQuery () uno para el otro.

Todo está bien hasta una rotación de pantalla. Cuando giro la pantalla cada searchView tiene texto "World" en lugar de "Hello" y "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); } } 

Alguien puede explicar lo que está pasando mal?

El SearchView utiliza como su contenido la vista resultante de inflar un archivo de diseño. Como resultado, todas las SearchViews usadas en el diseño de una actividad (como su caso) tendrán como contenido, vistas con los mismos ids. Cuando Android intente guardar el estado para manejar el cambio de configuración verá que los EditTexts de las SearchViews tienen el mismo id y restaurará el mismo estado para todos ellos.

La forma más sencilla de manejar este problema es usar el onSaveInstanceState la onSaveInstanceState y onRestoreInstanceState como este:

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

También echa un vistazo a esta cuestión relacionada .

Una forma de aliviar este problema es capturar el cambio de evento de orientación con su actividad y, a continuación, establecer la consulta de nuevo en sus dos vistas de búsqueda.

Agregue esto para manifestar en la actividad en la que tiene dos SearchView

  android:configChanges="keyboardHidden|orientation|screenSize" 
  • Convertir objeto nulo en String
  • Error en la autenticación mutua en Android con javax.net.ssl.SSLHandshakeException: El apretón de manos falló
  • Setter y Getter funciones. En Android. Rendimiento de gastos generales?
  • Problema con revelación circular y CircularRevealLibrary en Android
  • No se puede obtener la ubicación en Genymotion VM
  • Elementos de menú de la bandeja de navegación seleccionados dentro de diferentes grupos
  • Consiga un comportamiento igual que AppBarLayout para cualquier ViewGroup en CoordinatorLayout
  • ¿Es onResume () llamado antes onActivityResult ()?
  • Encontrar puntos contenidos en una ruta de acceso en Android
  • HorizontalScrollView puede alojar sólo un hijo directo
  • Añadir imagen a Media Gallery - Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.