android - personalizar - Presiona el texto de edición externo para perder el foco
personalizar edittext android (8)
Así que busqué un poco, y ninguna otra solución era exactamente lo que estaba buscando. En mi opinión, el enfoque se comporta de manera extraña en las vistas de EditText.
Lo que hice fue ...
Asegúrese de que la vista raíz sea RelativeLayout
Agregue un diseño de superposición que esté SOBRE el área que hará que el teclado desaparezca, pero no EditText. Algo como a continuación:
En mi caso, EditText estaba en un contenedor en la parte inferior de la pantalla. entonces cubrió todo lo demás.
- Tener un método que se parece un poco a este:
private void hideKeyboard() { final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); keyboardOverlay.setVisibility(View.GONE); editText.clearFocus(); }
Ahora llama a este método en onClick de la superposición que creaste.
Lo que queremos ahora es hacer que la superposición sea visible cuando presiona EditText. No puede usar el evento onFocus (al menos no lo hice funcionar ...) Entonces, lo que hice fue administrar el evento onTouch.
editText.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(final View v, final MotionEvent event) { keyboardOverlay.setVisibility(View.VISIBLE); editText.requestFocus(); return false; } });
El requestFocus () aquí es para no anular el evento de enfoque con onTouch.
Consejo rápido: cuando pruebe esto, puede agregar un color de fondo a la superposición para ver exactamente qué está sucediendo.
¡Espero que funcione para ti!
Solo quiero hacer clic fuera del "texto de edición" para perder automáticamente el foco y ocultar el teclado. Por el momento, si hago clic en "editar texto", se enfoca, pero necesito presionar el botón Atrás para desenfocar.
El siguiente código funciona perfectamente para mí, y lo uso regularmente para cerrar el SoftKeyboard onTouch en cualquier lugar fuera de EditText.
public void hideSoftKeyboard()
{
//Hides the SoftKeyboard
InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
}
public void setupUI(View view)
{
String s = "inside";
//Set up touch listener for non-text box views to hide keyboard.
if (!(view instanceof EditText)) {
view.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
hideSoftKeyboard();
return false;
}
});
}
//If a layout container, iterate over children and seed recursion.
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
View innerView = ((ViewGroup) view).getChildAt(i);
setupUI(innerView);
}
}
}
¡Entonces solo necesita llamar a la función setupUI()
una vez en su método onCreate()
y voilla, su hideSoftKeyboard está configurado!
Para perder el enfoque completo de EditText, simplemente editText.clearFocus()
en su función hideSoftKeyboard ().
Para resolver este problema, lo primero que debe hacer es usar setOnFocusChangeListener de ese Edittext
edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
Log.d("focus", "focus loosed");
// Do whatever you want here
} else {
Log.d("focus", "focused");
}
}
});
y luego lo que debe hacer es anular el dispatchTouchEvent en la actividad que contiene ese Edittext ver el código a continuación
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
View v = getCurrentFocus();
if ( v instanceof EditText) {
Rect outRect = new Rect();
v.getGlobalVisibleRect(outRect);
if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) {
Log.d("focus", "touchevent");
v.clearFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
}
return super.dispatchTouchEvent(event);
}
Ahora, lo que sucederá es que cuando un usuario haga clic afuera, primero se llamará a este dispatchTouchEvent y se borrará el foco del texto. Ahora su OnFocusChangeListener se llamará, ese enfoque ha cambiado, ahora aquí puede hacer cualquier cosa que desee hacer, espero funciona :)
Puede lograrlo siguiendo estos pasos:
1. Haga que la vista principal (vista de contenido de su actividad) pueda hacer clic y enfocarse agregando los siguientes atributos
android:clickable="true"
android:focusableInTouchMode="true"
2. Implementar un método hideKeyboard ()
public void hideKeyboard(View view) {
InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
3. Por último, configure el OnFocusChangeListener de su texto de edición.
edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
hideKeyboard(v);
}
}
});
Supongamos que EditText se coloca en diseño lineal u otro ViewGroup. Luego debe hacer que este contenedor sea seleccionable, enfocable y enfocable en modo táctil. Después de eso, configure onClickListener en este contenedor con el siguiente código en el método onClick Override:
@Override
public void onClick(View view) {
InputMethodManager imm = (InputMethodManager) view.getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
Tenía el mismo requisito que tuve que ocultar el teclado una vez que toco en cualquier lugar fuera de mi cuadro Editar texto. El setOnFocusChangeListener no hace el trabajo, ya que incluso si toca fuera del cuadro de texto de edición todavía está seleccionado.
Para esto utilicé la solución edc598 here .
- Primero obtuve el MainLayout que contiene la vista completa y agregué el detector de pulsaciones.
- Cuando se activó el evento onTouch, verifico si el cuadro EditText tiene foco.
- Si el cuadro EditText tiene el foco, entonces verifico las coordenadas XY del evento.
- Basado en la ubicación de mi cuadro EditText, oculto el teclado si me tocan en cualquier lugar fuera de la caja
Ejemplo de código modificado desde here :
LinearLayout MainLayout = (LinearLayout) findViewById(R.id.MainLayout);
EditText textBox = (EditText) findViewById(R.id.textBox);
int X_TOP_LEFT = 157;
int Y_TOP_LEFT = 388;
int X_BOTTOM_RIGHT = 473;
int Y_BOTTOM_RIGHT = 570;
MainLayout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if(textBox.isFocused()){
Log.i("Focussed", "--" + event.getX() + " : " + event.getY() + "--");
if(event.getX() <= 157 || event.getY() <= 388 || event.getX() >= 473 || event.getY() >= 569){
//Will only enter this if the EditText already has focus
//And if a touch event happens outside of the EditText
textBox.clearFocus();
InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
//Do something else
}
}
Log.i("X-Y coordinate", "--" + event.getX() + " : " + event.getY() + "--");
//Toast.makeText(getBaseContext(), "Clicked", Toast.LENGTH_SHORT).show();
return false;
}
});
establecer en un botón o cualquier vista: this.getCurrentFocus (). clearFocus (); Por ejemplo:
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
this.getCurrentFocus().clearFocus();
return super.onMenuOpened(featureId, menu);
}
@woodshy tiene la respuesta para esconder el teclado, pero quizás poner el código en onClick
no es tan bueno como ponerlo onFocusChanged
. En cuanto a forzarlo a perder el foco, necesita establecer el objeto al que desea transferir el foco, en su archivo XML:
android:focusable="true"
android:focusableInTouchMode ="true"