2013-02-22 6 views
7

Mam dwa SearchViews w układzie jeden xml:Dwa SearchViews w jednym rodzaju działalności i obrotu ekranu

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

I nadmuchać ten układ do mojego główną działalność przez setContentView(). Następnie wywołuję metody setQuery() dla siebie nawzajem.

Wszystko jest w porządku do momentu obrócenia ekranu. Po obróceniu ekranu każde wyszukiwanie wyświetla tekst "Świat" zamiast "Cześć" i "Świat".

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

Ktoś może wyjaśnić, co się dzieje?

+0

Czy to jedyne odniesienie, które uzyskuje się w wynikach wyszukiwania w onCreate? Zakładam, że nie. Jeśli nie, to możesz opublikować odpowiedni kod. – JoxTraex

+1

Próbowałem twojego kodu i zachowałem się tak samo jak ty ... więc wszystko, aby odtworzyć problem, znajduje się w poście – ben75

+0

Tak, jest to jedyne jedno odniesienie. Już go nie używam. – lukjar

Odpowiedz

11

SearchView używa jako jego zawartości widok wynikiem pompowania plik układu. W rezultacie wszystkie SearchViews użyte w układzie działania (podobnie jak w przypadku) będą miały treść, widoki z tymi samymi identyfikatorami. Gdy Android spróbuje zapisać stan, aby obsłużyć zmianę konfiguracji, zobaczy, że EditTexts z SearchViews ma ten sam identyfikator i przywróci ten sam stan dla wszystkich z nich.

Najprostszym sposobem radzenia sobie z tego problemu jest użycie Activity „s onSaveInstanceState i onRestoreInstanceState tak:

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

Mają również spojrzeć na ten related question.

+0

Dziękuję. To działa ;). Bardzo ważne w tym przypadku jest instancja przywracania w metodzie onRestoreInstanceState(). Kiedy robię to w onCreate, to nie działa. Prawdopodobnie wartości "Hello" i "World" z onCreate są nadpisywane w metodzie onRestore. – lukjar

-1

Jednym ze sposobów rozwiązania tego problemu jest uchwycenie zmiany orientacji wydarzenia za pomocą aktywności, a następnie ponowne ustawienie zapytania w dwóch widokach wyszukiwania.

+0

Czy możesz napisać coś więcej na ten temat? – lukjar

+0

To nie jest zbyt skomplikowane, Google, jak słuchać zmiany orientacji w Twojej aktywności, a następnie po prostu ponownie skonfigurować dwa widoki wyszukiwania. – JoxTraex

-2

Dodaj to przejawiać w działalności, w której występują dwa SearchView

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

@ loocash1989 sprawdź moją odpowiedź i powiadom mnie, czy jest to pomocne, czy nie. – Rahil2952

+1

cóż ... to nie jest odpowiedź na pytanie. Jest to rodzaj obejścia, ale ma pewne wady. – ben75

+0

To nie jest dobre rozwiązanie dla mnie, ale przyznaję, że to też działa. Szukałem błędu w SearchView. Co więcej, moja aktywność powinna zostać odtworzona po obróceniu ekranu i nie chcę zmienić domyślnego zachowania. Dzięki za odpowiedź. Myślę, że może to być pomocne dla kogoś. – lukjar

Powiązane problemy