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
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 ...
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é.
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");
}
});
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;
}
});
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
}
}
});
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.