web-dev-qa-db-fra.com

Android: comment détecter un clic sur un élément SearchView personnalisé

Je crée un SearchView personnalisé, mais jusqu'à présent je n'ai pas trouvé d'événement (d'écoute) ou d'écouteur (click) si l'utilisateur clique sur le widget searchView. Donc SearchView est proche, l'utilisateur clique sur l'icône de recherche (quel auditeur?!), SearchView est ouvert. Voir l'image ci-dessous. J'ai besoin de cet événement, car je veux changer l'interface utilisateur après que l'utilisateur a ouvert la recherche

enter image description here

EDIT: Ce que j'ai essayé jusqu'à présent, c'est

  • setOnClickListener vers l'élément SearchView -> mais il n'est déclenché que si le SearchView est ouvert (2e image)

  • recherché SearchView Api, mais il n'y a pas d'écouteur pour cette action (ou suis-je aveugle?)

  • essayé une solution de contournement avec onWindowFocusChanged du searchView, mais en raison du fait que le searchView est caché dans une sorte de barre latérale youtube/facebook, cela ne fonctionne pas

Des idées? J'ai également joint mon code SearchView, mais je ne pense pas que le code soit incorrect. aucun auditeur pour le moment. btw: toutes les solutions de contournement sont les bienvenues. Mais ce serait bien, si le SearchView est fermé au début! (comme sur les photos ci-dessus)

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: le changement de focus ne fonctionne pas ici, car la vue de recherche est invisible au début et insérée dans l'interface utilisateur plus tard ...

31
longilong

Que dis-tu de ça?

public void setOnSearchClickListener (View.OnClickListener listener)

Description de Android indique .. Définit un écouteur pour informer lorsque le bouton de recherche est enfoncé. Cela n'est pertinent que lorsque le champ de texte n'est pas visible par défaut. L'appel à setIconified (false) peut également faire en sorte que cet auditeur soit informé.

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

55
chuthan20
 public void setOnSearchClickListener (View.OnClickListener listener)

résout le problème. en fait, je pensais avoir utilisé cet écouteur auparavant, mais le OnSearchClickListener n'est pas le OnClickListener dans ma SearchView. Vous devez déclarer cet auditeur de l'extérieur comme

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

 sv.setOnSearchClickListener(new OnClickListener() {

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

        }
 });
8
longilong

pour une utilisation visible du champ de texte:

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

pour une utilisation invisible du champ de texte:

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

Essayez ceci dans Kotlin:

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

Dans Java:

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

Cela a été écrit avec l'API 15. Il n'a pas été testé. Détails en bas.

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

Vous lui donnez un OnOpenListener et lorsque vous cliquez sur la vue, elle déclenche l'événement. Quand il perd le focus, il réinitialise la valeur booléenne. Je pense que cela déclenchera également le OnClose qui est déjà intégré. Ce qui peut être un problème, c'est le bit de mise au point; J'ai eu des problèmes avant d'utiliser un SearchView et il ne renoncera pas à sa concentration. Vous pouvez peut-être, en dehors de la classe, attribuer le moment où la vue doit avoir le focus ou non. Si vous voulez plus de fonctionnalités, vous devez créer les vôtres.

2
Simon Zettervall