onQueryTextChange срабатывает после возобновления работы приложения

Я застрял с анимированным поиском в QueryTextListener. Когда активность и фрагмент создаются первыми, это работает хорошо. Затем я нажимаю кнопку «Домой», открываю другие приложения, делаю там какую-то работу, чтобы стереть данные активности поиска, а затем возвращаюсь в приложение. И когда активность и фрагмент возобновляются, метод onQueryTextChange запускается своим собственным. Я попробовал эту проблему, триггеры замены фрагмента onQueryTextChange в поиске, но это не помогло, помогает только когда searchview SHOW_AS_ACTION_NEVER, но в этом случае searchview не вижу. Как предотвратить самозапуск OnQueryTextListener? Фрагмент фрагмента

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    searchView = new SearchView(getSherlockActivity().getSupportActionBar()
            .getThemedContext());
    searchView.setOnQueryTextListener(new OnQueryTextListener() {

        @Override
        public boolean onQueryTextSubmit(String query) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            if (newText.length() > 0) {

                fpAdapter.getFilter().filter(newText);
            } else {

                loadData();

            }
            return false;
        }
    });

    TextView searchText = (TextView) searchView
            .findViewById(R.id.abs__search_src_text);
    searchText.setTextColor(Color.WHITE);

    searchText.setCursorVisible(false);

    ImageView searchButton = (ImageView) searchView
            .findViewById(R.id.abs__search_button);
    searchButton.setImageResource(R.drawable.search_menu_button);
    LinearLayout searchEditFrame = (LinearLayout) searchView
            .findViewById(R.id.abs__search_edit_frame);
    searchEditFrame.setBackgroundResource(android.R.color.transparent);

    View searchPlate = searchView.findViewById(R.id.abs__search_plate);
    searchPlate.setBackgroundColor(Color.argb(0, 0, 0, 0));
    menu.add("Search")

    .setActionView(searchView)
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

    final MenuItem searchMenuItem = menu.getItem(0);
    final Animation in = AnimationUtils.loadAnimation(getSherlockActivity()
            .getApplicationContext(), R.anim.search_in);
    final Animation out = AnimationUtils.loadAnimation(
            getSherlockActivity().getApplicationContext(),
            R.anim.search_out);
    searchView.setQueryHint(getResources().getText(
            R.string.search_messages_hint));
    searchView.setIconifiedByDefault(true);
    searchView
            .setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
                @Override
                public void onFocusChange(View view,
                        boolean queryTextFocused) {

                    if (!queryTextFocused) {

                        // searchView.startAnimation(out);
                        searchMenuItem.collapseActionView();
                    } else {
                        searchView.startAnimation(in);

                    }
                }
            });

    super.onCreateOptionsMenu(menu, inflater);
}

Update: Это появляется только в HTCsensation XL с Android 4.0.3, на 4.2 такой проблемы не вижу.


person Alex Shcherbyna    schedule 12.08.2014    source источник


Ответы (4)


Нашел единственное решение - установить слушателя в onResume:

@Override
public void onResume() {

    super.onResume();

    searchView.setOnQueryTextListener(new OnQueryTextListener() {

    @Override
    public boolean onQueryTextSubmit(String query) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        if (newText.length() > 0) {

            fpAdapter.getFilter().filter(newText);
        } else {

            loadData();

        }
        return false;
    }
}); }
person Alex Shcherbyna    schedule 13.08.2014

используйте этот код

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String s) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(final String s) {

            if(searchView.getWidth()>0)
            {
                // your code here
            }

            return false;
        }
    });
person Aby Olangattu    schedule 10.04.2015

Вы можете настроить использование SearchView только тогда, когда он находится в фокусе. У меня была аналогичная проблема, когда поиск выполнялся в моем фрагменте каждый раз, когда пользователи возобновляли его. Я решаю это следующим методом:

-Добавьте логическое значение, чтобы увидеть, когда SearchView находится в фокусе:

//by default the SearchView isn't in focus so set it to false. private boolean shouldSearch = false;

searchView.setOnQueryTextFocusChangeListener((view, hasFocus) -> {
        if (hasFocus) {
            shouldSearch = true;
        } else {
            shouldSearch = false;
        }
    });

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            if (shouldSearch) {
               //do your search here
            }

            return true;
        }
    });
person Moisoni Ioan    schedule 27.02.2020

Это известная проблема. Вы можете исправить это, проверив, отображается ли поиск в виде значка, т.е. отображается только значок увеличительного стекла или он расширен (что означает, что пользователь взаимодействует с представлением поиска)

        searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(query: String?): Boolean {
                //your code here
                return true
            }

            override fun onQueryTextChange(newText: String?): Boolean {
                //this will catch firing event
                if (searchView.isIconified) {
                    return true
                }
                //your code here
                return true
            }
        })
person GraSim    schedule 05.02.2021