example - Android: Cómo detectar, haga clic en el elemento SearchView personalizado
searchview android ejemplo (5)
¿Qué tal esto?
public void setOnSearchClickListener (View.OnClickListener listener)
La descripción del sitio web del desarrollador de Android dice ... Establece un oyente para informar cuando se presiona el botón de búsqueda. Esto solo es relevante cuando el campo de texto no está visible por defecto. Llamar a setIconified (false) también puede causar que este oyente sea informado.
Estoy creando un SearchView personalizado, pero hasta ahora no encontré un evento (clic) o un oyente, si el usuario hace clic en el widget searchView. Por lo tanto, SearchView está cerca, el usuario hace clic en el ícono de búsqueda (¿qué oyente ?!), se abre SearchView. Vea la imagen de abajo. Necesito ese evento, porque quiero cambiar la interfaz de usuario después de que el usuario abra searchView
EDITAR: Lo que intenté hasta ahora es
setOnClickListener
parasetOnClickListener
Element -> pero solo se activa si SearchView está abierto (2da imagen)busqué en
SearchView
Api, pero no hay un oyente para esa acción (¿o estoy ciego?)probé una solución alternativa con
onWindowFocusChanged
de searchView, pero debido al hecho de que searchView está oculto en algún tipo de barra lateral de youtube / facebook, esto no funciona
¿Algunas ideas? También adjunté mi Código SearchView, pero no creo que el código sea incorrecto. simplemente no hay oyente todavía. por cierto: cualquier solución son bienvenidos. ¡Pero sería bueno, si SearchView está cerrado al principio! (como en las fotos de arriba)
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: el cambio de enfoque no funciona aquí, porque la vista de búsqueda es invisible al principio y se inserta en la interfaz de usuario más adelante ...
Esto fue escrito con API 15. No ha sido probado. Detalles en la parte inferior.
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();
}
}
Le asigna un OnOpenListener y cuando se hace clic en la vista, se activará el evento. Cuando pierde el foco, restablecerá el valor booleano. Creo que también activará el OnClose también que ya está incorporado. Lo que puede ser un problema es el bit de enfoque; He tenido problemas antes de usar un SearchView y no va a renunciar a su enfoque. Tal vez puede asignar fuera de la clase cuando la vista debe tener foco o no. Si quieres más características, debes construir la tuya propia.
Prueba esto en Kotlin:
searchView.setOnQueryTextFocusChangeListener { _ , hasFocus ->
if (hasFocus) {
// searchView expanded
} else {
// searchView not expanded
}
}
En Java:
searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
// searchView expanded
} else {
// searchView not expanded
}
}
});
para uso visible del campo de texto:
SearchView searchView = (SearchView) findViewById(R.id.searchView);
searchView.setOnSearchClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//your code here
}
});
para campo de texto uso invisible:
searchView.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
//your code here
return false;
}
});
public void setOnSearchClickListener (View.OnClickListener listener)
Resuelve el problema. en realidad pensé que había estado usando este servicio de escucha antes, pero OnSearchClickListener
no es el OnClickListener
en mi SearchView. Tienes que declarar a ese oyente desde afuera como
AmplifySearchView sv = (AmplifySearchView) findViewById(...);
sv.setOnSearchClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d("CLICK","CLICK");
}
});