1

СитуацииAndroid SearchView отключая весь экран не работает после выбора предложения

У меня есть SearchView в моей панели инструментов, которая отображает предложения для пользователей, когда они входят в поиске. Первоначально, в альбомной ориентации, все отлично работает с отображением экранной клавиатуры и видимым просмотром. Однако после того, как пользователь выберет предложение и попытается выполнить второй поиск, интерфейс поиска теперь находится в полноэкранном режиме, где поисковое покрытие закрыто, а предложения не видны.

Проблема

Как не я получаю не весь экран последовательно, независимо от того, сколько раз используется функция поиска?

Вещи, которые я попробовал

ImeOptions - flagNoFullscreen, flagNoExtractUi

код

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

Просто уточнить. Вы нажимаете на поиск -> панель поиска расширяется -> вы вводите запрос -> вы выбираете предлагаемый элемент -> панель поиска рушится, а клавиатура ушла -> вы снова нажимаете поиск -> вы видите большое белое текстовое поле сверху и клавиатуру на дно. Я прав? – Andrew

+0

Да, это ситуация. –

ответ

1

Проблема, кажется, призыв к onActionViewCollapsed SearchView в. Я сделал обходной путь, добавив collapseActionView в 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"/> 

Затем удалите searchview.onActionViewCollapsed. Вместо этого добавьте menuItem.collapseActionView.

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

Постарайтесь, чтобы все было просто. Я имею в виду, почему вы используете все это: requestFocus, clearFocus и т. Д. Я только что создал очень базовую реализацию вашей задачи, и все работает как шарм. Проверьте это:

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; 

    } 
}