Android Searchview, отключающий полноэкранный режим, не работает после выбора предложения

Ситуация

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

Проблема

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

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

ImeOptions — флагноутиллскрин, флагноэкстрактуи

Код

Главный фрагмент

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

person Kevin.Lam    schedule 03.04.2016    source источник
comment
Просто для уточнения. Вы нажимаете поиск —> строка поиска расширяется —> вы вводите запрос —> вы выбираете предложенный элемент —> панель поиска свернута и клавиатура исчезла —> вы снова нажимаете поиск —> вы видите большое белое текстовое поле сверху и клавиатуру сверху низ. Я прав?   -  person Andrew    schedule 03.04.2016
comment
Да ситуация такая.   -  person Kevin.Lam    schedule 03.04.2016


Ответы (2)


Проблема, похоже, заключается в вызове SearchView onActionViewCollapsed. Я сделал обходной путь, добавив коллапсActionView в 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);
person Kevin.Lam    schedule 03.04.2016

Старайтесь, чтобы все было просто. Я имею в виду, почему вы используете все эти 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;

    }
}
person Andrew    schedule 03.04.2016