studio example ejemplo android android-layout android-searchmanager

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.

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

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 para setOnClickListener 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"); } });