1

SituationAndroid SearchView invalidantes fullscreen ne fonctionne pas après avoir sélectionné la suggestion

J'ai un SearchView dans ma barre d'outils qui affiche des suggestions à l'utilisateur quand ils entrent dans une recherche. Initialement, en orientation paysage, tout fonctionne correctement avec le clavier logiciel affiché et la vue de recherche visible. Cependant, après que l'utilisateur ait sélectionné une suggestion et essayé de faire une seconde recherche, l'interface de recherche est maintenant en plein écran où la vue de recherche est masquée et les suggestions ne peuvent pas être vues.

Problème

Comment puis-je obtenir pas toujours plein écran, peu importe combien de fois la fonction de recherche est utilisé?

choses que j'ai essayé

ImeOptions - flagNoFullscreen, flagNoExtractUi

code

MainFragment

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.favorites, menu); 

    MenuItem toggleItem = menu.findItem(R.id.toggle_shake); 
    setUpToggleShake(toggleItem); 

    MenuItem singleSearchItem = menu.findItem(R.id.search_restaurant); 
    setUpSingleSearch(menu, singleSearchItem); 
} 

private void setUpSingleSearch(final Menu menu, final MenuItem singleSearchItem) { 
    searchView = (SearchView) MenuItemCompat.getActionView(singleSearchItem); 
    searchView.setQueryHint("Search Restaurant"); 
    searchView.setMaxWidth(10000); 
    searchView.setImeOptions(searchView.getImeOptions() | EditorInfo.IME_FLAG_NO_FULLSCREEN | 
     EditorInfo.IME_FLAG_NO_EXTRACT_UI); 
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String query) { 
      return false; 
     } 

     @Override 
     public boolean onQueryTextChange(String newText) { 
      displaySuggestions(newText); 
      return false; 
     } 
    }); 
    searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() { 
     @Override 
     public boolean onSuggestionSelect(int position) { 
      return false; 
     } 

     @Override 
     public boolean onSuggestionClick(int position) { 
      MatrixCursor cursor = (MatrixCursor)(searchView.getSuggestionsAdapter() 
        .getCursor()); 
      if (cursor.moveToPosition(position)) { 
       String restaurantId = cursor.getString(cursor.getColumnIndex(
         RestaurantTable.Cols.ID)); 
       mFavoritesRestaurantListAdapter.setSingleSearchRestaurant(restaurantId); 
       mFavoritesRestaurantListAdapter.onSingleSearch(); 
      } 
      searchView.clearFocus(); 
      searchView.onActionViewCollapsed(); 
      setItemsVisibility(menu, singleSearchItem, true); 

      return false; 
     } 
    }); 
    searchView.setOnSearchClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      setItemsVisibility(menu, singleSearchItem, false); 
      searchView.setFocusable(true); 
      searchView.requestFocus(); 
      searchView.requestFocusFromTouch(); 
     } 
    }); 
    searchView.setOnCloseListener(new SearchView.OnCloseListener() { 
     @Override 
     public boolean onClose() { 
      setItemsVisibility(menu, singleSearchItem, true); 
      searchView.clearFocus(); 
      return false; 
     } 
    }); 
    final AutoCompleteTextView searchAutoCompleteTextView = (AutoCompleteTextView) searchView 
      .findViewById(R.id.search_src_text); 
    searchAutoCompleteTextView.setThreshold(1); 
} 
+0

Juste pour clarifier. Vous appuyez sur Rechercher -> barre de recherche est développée -> vous tapez requête -> vous sélectionnez élément suggéré -> barre de recherche est effondrée et le clavier est parti -> vous appuyez sur Rechercher une nouvelle fois -> vous voyez une grande zone de texte blanche sur le dessus et le clavier bas. Ai-je raison? – Andrew

+0

Oui c'est la situation. –

Répondre

1

Le problème semble être l'appel à onActionViewCollapsed de SearchView. J'ai fait une solution de contournement en ajoutant collapseActionView dans menu.xml.

<item 
    android:id="@+id/search_restaurant" 
    android:title="Search" 
    android:icon="@drawable/search" 
    android:orderInCategory="2" 
    app:actionViewClass="android.support.v7.widget.SearchView" 
    app:showAsAction="always|collapseActionView"/> 

Ensuite, retirez searchview.onActionViewCollapsed. Ajoutez plutôt menuItem.collapseActionView.

searchView.clearFocus(); 
//searchView.onActionViewCollapsed(); 
menuItem.collapseActionView(); //Added this 
setItemsVisibility(menu, singleSearchItem, true); 
1

Essayez de garder les choses simples. Je veux dire, pourquoi utilisez-vous tout ce que requestFocus, clearFocus etc. Je viens de créer une implémentation très basique de votre tâche et tout fonctionne comme un charme. Vérifiez-le:

import android.database.Cursor; 
import android.database.MatrixCursor; 
import android.os.Bundle; 
import android.provider.BaseColumns; 
import android.support.v4.view.MenuItemCompat; 
import android.support.v4.widget.SimpleCursorAdapter; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.SearchView; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.TextView; 

public class SearchableActivity extends AppCompatActivity { 

    private TextView selectedValueTextView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_searchable); 
     selectedValueTextView = (TextView) findViewById(R.id.selected_value); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_with_search, menu); 
     final MenuItem searchMenuItem = menu.findItem(R.id.action_search); 
     final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem); 
     searchView.setSuggestionsAdapter(new SimpleCursorAdapter(
       this, 
       android.R.layout.simple_list_item_1, 
       null, 
       new String[]{"value"}, 
       new int[]{android.R.id.text1}, 
       0 
     )); 
     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextSubmit(String query) { 
       return false; 
      } 
      @Override 
      public boolean onQueryTextChange(String query) { 
       MatrixCursor cursor = new MatrixCursor(new String[]{BaseColumns._ID, "value"}); 
       for (int i = 0; i < 10; i++) { 
        cursor.addRow(new Object[]{i, query + i}); 
       } 
       searchView.getSuggestionsAdapter().changeCursor(cursor); 
       return true; 
      } 
     }); 
     searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() { 
      @Override 
      public boolean onSuggestionSelect(int position) { 
       return false; 
      } 
      @Override 
      public boolean onSuggestionClick(int position) { 
       Cursor cursor = (Cursor) searchView.getSuggestionsAdapter().getItem(position); 
       selectedValueTextView.setText(cursor.getString(cursor.getColumnIndex("value"))); 
       // do this last because collapseActionView calls onQueryTextChange("") 
       // which changes cursor data 
       searchMenuItem.collapseActionView(); 
       return false; 
      } 
     }); 
     return true; 

    } 
}