2010-09-30 13 views
5

Quería un teclado numérico que tuviera un botón de ir o terminar que cerrara y ejecutara una clase de cálculo. Gracias a un consejo del commonware sobre dónde comenzar, conseguí que funcionara muy bien en el emulador. Luego vine a cargarlo a mi deseo de HTC de probar y no funciona en absoluto. Estoy seguro de que debe ser porque HTC tiene sentido propio, pero seguramente debe haber una forma de hacer que esto funcione en los teléfonos HTC. ¿Alguien más logró sortear este problema?Android: control de teclado en HTC desire

Respuesta

14

Puedo reproducir lo que creo que está viendo en el HTC Incredible.

No todos los teclados suaves admitirán el botón de acción IME. Algunos, como el "teclado" suave de Graffiti, pueden no tener ningún botón, y mucho menos un botón de acción IME. Incluso el Compatibility Definition Document no dice nada sobre la necesidad de dicho botón de acción para los teclados suministrados con un dispositivo.

Por lo tanto, no debe confiar en el botón de acción IME. Si está allí, los usuarios pueden usarlo. Sin embargo, siempre tenga algún otro medio para lograr cualquiera que sea su objetivo.

+0

¿Estás diciendo que mi mejor enfoque es crear mi propio teclado, no un IME sino una vista? Sí tuve un botón de calcular en un punto, pero estaba cubierto por el teclado. Es molesto porque la tecla de acción del teclado de HTC se pone verde cuando está configurado para escribir GO, que es genial, por lo que entiende que simplemente devuelve 0 en el actionid. Estoy empezando a pensar que crear el pequeño teclado es el camino a seguir, pero estaba tratando de evitarlo. ¿Es ese el mejor enfoque? ¿Hay alguna documentación sobre las mejores prácticas de Android que sea efectivamente legible? –

+0

Oh, me suscribí finalmente por cierto. desearía poder asistir a uno de sus cursos en Londres, sería bastante útil. Por desgracia estoy tratando de aprender Java y Android al mismo tiempo por prueba y error –

+0

@ Dream Architect: "¿Estás diciendo que mi mejor enfoque es crear mi propio teclado, no un IME sino una vista?" - para una aplicación común, simplemente tendría el botón de acción equivalente como parte de la actividad. Para una calculadora, necesitará otras "claves" de todos modos (+, -, *, /, etc.), y probablemente necesite su propio panel de botones. En ese caso, pondría las teclas numéricas en ese panel de botones, como las tiene una calculadora común. – CommonsWare

11

Estoy detectando si se ha presionado el botón DONE/GO/RETURN con un onEditorActionListener, pero buscando opciones de IME y KeyEvents para cubrir los teclados de HTC, así como cualquier teclado que acepte las opciones de IME.

(Este código funciona para HTC teclados, además de hacer cualquier teclado que tiene opciones IME)

EditText.setOnEditorActionListener(new TextView.OnEditorActionListener(){ 
    public boolean onEditorAction(TextView exampleView, int actionId, KeyEvent event){ 
     if(actionId == EditorInfo.IME_ACTION_DONE 
      || actionId == EditorInfo.IME_NULL 
      || event.getKeyCode() == KeyEvent.KEYCODE_ENTER){ 

      //Do something in here 
      return true; 
     } else { 
      return false; 
     } 
    } 
}); 
+0

Me temo que con este código, la parte ** // Hacer algo aquí ** se ejecutará dos veces ... ¿podría verificarlo? – Konsumierer

+0

Gracias Asha .... funcionó para mí – hemu

+0

para mí se obtiene ERROR/AndroidRuntime (26336): EXCEPCIÓN FATAL: main java.lang.NullPointerException ------ en la cadena "if (actionId == ..." – djdance

2

que estaba usando un EditarTexto con inputType = "número" y resolvió el problema mediante la modificación de la solución de Asha:

private TextView.OnEditorActionListener numberEnterListener = new TextView.OnEditorActionListener(){ 
     public boolean onEditorAction(TextView tv, int actionId, KeyEvent event){ 
      if(actionId == EditorInfo.IME_ACTION_DONE 
       || actionId == EditorInfo.IME_NULL 
       || event.getKeyCode() == KeyEvent.KEYCODE_ENTER){ 

       tv.clearFocus(); 

       //Stupid keyboard needs to be closed as well 
       InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); 
       imm.hideSoftInputFromWindow(tv.getWindowToken(), 0); 

       return true; 
      } else { 
       return false; 
      } 
     } 
    }; 

Se eliminó el foco para dejar de mostrar el teclado numérico. El imm era necesario porque un teclado suave aún estaba presente incluso después de borrar el foco.

Cuestiones relacionadas