Подтвердить что ты не робот

Android: как обнаружить клик на пользовательском элементе SearchView

Я создаю пользовательский SearchView, но до сих пор я не нашел (клик) событие или прослушиватель, если пользователь нажимает на виджет searchView. Таким образом, SearchView близок, пользователь нажимает на значок поиска (который прослушиватель?!), SearchView открывается. См. Рисунок ниже. Мне нужно это событие, потому что я хочу изменить пользовательский интерфейс после того, как пользователь откроет searchView

enter image description here

EDIT: Я пробовал до сих пор

  • setOnClickListener для элемента SearchView → , но он запускается только при открытии SearchView (2-е изображение)

  • просмотрел SearchView Api, но нет слушателя для этого действия (или я слепой?)

  • попробовал обходной путь с onWindowFocusChanged в searchView, но из-за того, что searchView скрыт в какой-либо боковой панели youtube/facebook, это не работает

Любые идеи? Я также прикрепил код SearchView, но не думаю, что код неправильный. пока еще нет слушателя. btw: любые обходные пути приветствуются. Но было бы неплохо, если бы SearchView был закрыт в начале! (например, на рисунках выше)

public class AmplifySearchView extends SearchView implements
        OnQueryTextListener, OnFocusChangeListener,
        OnCloseListener {

    private static final String DEBUG_TAG = "AmplifySeachView";

    private Context context;
    private DataBaseController datasource;
    private StationListView searchResultListView;
    private TextView noResultTextView;

    private Boolean searchStarted = false;

    public AmplifySearchView(Context context) {
        super(context);
        this.context = context;
    }

    public AmplifySearchView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
    }

    public void initSearchView(StationListView view, TextView noResultTextView) {
        this.searchResultListView = view;
        this.searchResultListView.setActivityId(Constants.UI_SEARCH_RESULT_LIST);
        this.noResultTextView = noResultTextView;


        this.setOnQueryTextListener(this);
        this.setOnFocusChangeListener(this);
        this.setOnCloseListener(this);
        this.setOnCloseListener(this);

        setIconifiedByDefault(true);

        datasource = DataBaseController.getInstance(context);

        int id = this.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
        TextView textView = (TextView) findViewById(id);
        textView.setTextColor(Color.WHITE);


        resetSearchInputTextField();
    }

    private void resetSearchInputTextField() {
        setQueryHint(getResources().getString(R.string.search_hint));
    }

    @Override
    public boolean onClose() {
        Log.d(DEBUG_TAG, "onClose()");
        searchResultListView.setVisibility(View.GONE);
        noResultTextView.setVisibility(View.GONE);

        searchStarted = false;

        Intent intent = new Intent(Constants.SEARCH_ENDED);
        intent.addCategory(Constants.UI_AMPLIFY_CATEGORY);
        context.sendBroadcast(intent);

        return false;
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        Log.d(DEBUG_TAG,"onFocusChange()" + hasFocus);

    }


    @Override
    public boolean onQueryTextChange(String newText) {

        //do sth...
    }

    @Override
    public boolean onQueryTextSubmit(String query) {
        Log.d(DEBUG_TAG, "onQueryTextSubmit -> " + query);
        return true;
    }

    @Override
    protected void onFocusChanged(boolean gainFocus, int direction,
            Rect previouslyFocusedRect) {
        Log.d(DEBUG_TAG, "onQueryTextSubmit -> " + gainFocus);
        // TODO Auto-generated method stub
        super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
    }

    @Override
    public void onActionViewCollapsed() {
        Log.d(DEBUG_TAG, "onActionViewCollapsed");
        super.onActionViewCollapsed();
    }

    @Override
    public void onActionViewExpanded() {
        Log.d(DEBUG_TAG, "onActionViewExpanded");
        super.onActionViewExpanded();
    }
}

btw: on Focus change здесь не работает, потому что searchview невидим в начале и вставляет позже ui...

4b9b3361

Ответ 1

Как насчет этого?

public void setOnSearchClickListener (View.OnClickListener listener)

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

http://developer.android.com/reference/android/widget/SearchView.html#setOnSearchClickListener(android.view.View.OnClickListener)

Ответ 2

 public void setOnSearchClickListener (View.OnClickListener listener)

решает проблему. На самом деле, я думал, что раньше использовал этот прослушиватель, но OnSearchClickListener не является OnClickListener в моем SearchView. Вы должны объявить этого слушателя извне, как

 AmplifySearchView sv = (AmplifySearchView) findViewById(...);

 sv.setOnSearchClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Log.d("CLICK","CLICK");

        }
 });

Ответ 3

для видимого текстового поля:

SearchView searchView = (SearchView) findViewById(R.id.searchView);
    searchView.setOnSearchClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //your code here
        }
    });

для невидимого использования текстового поля:

searchView.setOnCloseListener(new SearchView.OnCloseListener() {
        @Override
        public boolean onClose() {
            //your code here
            return false;
        }
    });

Ответ 4

Это было написано с помощью API 15. Он не был протестирован. Детали внизу.

public class MySearchView extends SearchView {
    private boolean mHasFocus;
    private OnOpenListener mOnOpenListener;

    public MySearchView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setOnOpenListener(OnOpenListener onOpenListener) {
        mOnOpenListener = onOpenListener;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        boolean onTouchEvent = super.onTouchEvent(event);

        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if (!mHasFocus) {
                mHasFocus = true;

                if (mOnOpenListener != null) {
                    mOnOpenListener.onOpen();
                }
            }

            break;
        }

        return onTouchEvent;
    }

    @Override
    protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
        super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);

        if (!gainFocus) {
            mHasFocus = false;
        }
    }

    public interface OnOpenListener {
        public void onOpen();
    }
}

Вы даете ему OnOpenListener, и при нажатии на View он запускает событие. Когда он потеряет фокус, он будет reset логическим значением. Я думаю, что он также включит OnClose, который уже встроен. Что может быть проблемой, это бит фокуса; У меня были проблемы, прежде чем использовать SearchView, и он не перестанет фокусироваться. Возможно, вы можете за пределами класса назначить, когда View будет иметь фокус или нет. Если вам нужны дополнительные функции, вы должны создать свои собственные.

Ответ 5

Попробуйте это в Котлине:

    searchView.setOnQueryTextFocusChangeListener { _ , hasFocus ->
        if (hasFocus) {
            // searchView expanded
        } else {
            // searchView not expanded
        }
    }

В Java:

searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            // searchView expanded
        } else {
            // searchView not expanded
        }
    }
});