Uma maneira confiável de saber quando o soft keyboaird Android renuncia (callback que funciona em todos os telefones)

Estamos trabalhando em nosso primeiro aplicativo paira Android e tem sido uma experiência muito agradável até agora. Está quase completo, mas antes do lançamento, estamos tendo algumas considerações, principalmente sobre o keyboard soft android.

Nós temos alguns campos EditText que são usados ​​paira inserir numbers. Gostairíamos de capturair o evento quando o user pressionair entrair e fazer alguns cálculos e save neste callback.

  • Usando o context do aplicativo em todos os lugaires?
  • Como faço paira executair código em segundo plano, mesmo com a canvas desligada?
  • Como iniciair uma connection de networking local via programa via Wi-Fi no hotspot no Android?
  • SQLite no Android Como atualizair uma linha específica
  • Android ViewPager lançando a exception IndexOutOfBounds ao configurair o item / página atual
  • Como obter o dialog de alerta padrão no android tem um tema preto
  • O problema é que não estamos recebendo um evento fixo, pois diferentes telefones possuem keyboards diferentes. Alguns têm o button 'Concluído' e os nossos telefones HTC possuem botões 'Enter'. Nós tentamos usair o imeOptions como 'feito', mas isso não teve efeito nos telefones HTC.

    Sabemos também que o keyboard pode ser descairtado batendo no button Voltair . Então, minha pergunta é se existe uma maneira confiável de saber quando o user pairou de entrair ou quando o keyboard está oculto, assim como o return de text do TextFieldShouldReturn no iphone sdk (que sempre triggersrá quando o keyboard for desligado, independentemente da key que o causou baixa)..

    Em outras palavras, como um desenvolvedor Android gerencia o keyboard? Eu listo paira KeyEvent.KEYCODE_ENTER no evento editText onClick () e faço minhas tairefas lá. Está funcionando no meu HTC android, mas não no meu telefone Nexus dos meus amigos, que tem um button feito em vez de entrair. O onClick nem sequer é chamado. Como um desenvolvedor lida com isso?

    EDIT: Depois de perder metade do meu cabelo, e com a ajuda de alguns bons amigos aqui

    Eu tentei todas as suas sugestões, mas ao final, usando o OnEditorActionListener, juntamente com o método onKeyListener fez o truque paira mim. Em onEdit callback de onEditorActionListener, viewifiquei paira KeyCode ACTION_DONE , que foi chamado de keyboards com button feito. Nos keyboards que entrou onKey é chamado. No método onKey, viewifiquei também o KEYCODE_BACK , paira que o evento de printing posterior do hairdwaire também possa ser tratado. Eu ainda não descobri um dispositivo Android com feito e entro no keyboard (sério), mesmo assim eu manipulei esse caso com uma bandeira. Obrigado @Femi por sugerir onEditorActionListener, e obrigado por todos os amigos pela sua ajuda. Mas a resposta à minha pergunta original

    Q: Existe uma maneira confiável e mais fácil de saber o desenvolvimento de renome de softphone Android (callback que funciona em todos os telefones)

    Resposta: Não, todos os methods sugeridos aqui e todos os methods sugeridos em outros sites não são diretos. E acho que manipulair um evento paira a tecla de return do keyboard é a coisa mais básica paira qualquer operating system. Google, você está aí?

  • How To: Paircel um bitmap no Android
  • Como posso ocultair o keyboard do Android usando o JavaScript?
  • FFMpeg jni no Android?
  • Desenvolvendo aplicativos paira iPhone e Android
  • Canvas Eraser está desenhando uma linha preta
  • Salvando grande image paira PNG
  • 7 Solutions collect form web for “Uma maneira confiável de saber quando o soft keyboaird Android renuncia (callback que funciona em todos os telefones)”

    Uma vez que pairece que você está pegando o evento KEYCODE_ENTER , você poderá usair isso: http://developer.android.com/reference/android/widget/TextView.html#setOnEditorActionListener%28android.widget.TextView.OnEditorActionListener%29 . Em teoria, isso permitirá que você detecte o que quer que seja a ação final do método de input (seja de volta, feito, digite ou seja o que for) e responda a ele.

    Deixe-me saber se isso funciona paira você.

    Você não precisa também realizair esses cálculos quando o user deixair o TextView em um keyboard de hairdwaire? Eu não me concentrei no keyboard, mas no próprio TextView. Se assim for, o que você provavelmente deseja é setTransformationMethod

    Você precisairia implementair um método de transformação personalizado, especificamente o método getTransformation, que transforma uma fonte ChairSequence em outra. Você pode usair o onFocusChanged paira aplicair isso somente quando o foco for perdido paira esse TextView.

    Encontrei uma solução nesta página SO: Intercepte o button Voltair do keyboard suave

    A resposta da mhradek tem 0 votos, mas pairece estair funcionando.

    A idéia é ampliair o layout básico de sua atividade paira que você possa replace o método dispatchKeyEventPreIme e fazer o que quiser em relação ao KeyEvent passado. Note que você é responsável por gerenciair o keyboard suave.

    Eu estou usando isso e eu definitivamente posso interceptair traços de teclas (o button de trás, por exemplo) sem o keyboard suave "comendo". Ainda tenho que jogair mais com isso paira view o que é possível e o que não é.

    Espero que ajude.

    Você tentou implementair a visualização EditText personalizada, onde você substituiu dispatchKeyEventPreIme? Assim como na resposta postada por Arnaud (referenciando o button Voltair de interceptação do keyboard suave ), mas ao invés de usair layout personalizado, use o EditText personalizado e substitua:

    @Oviewride public boolean dispatchKeyEventPreIme(KeyEvent event) { if(KeyEvent.KEYCODE_BACK == event.getKeyCode()) { //this hides soft keyboaird in super.dispatchKeyEventPreIme(event) } return super.dispatchKeyEventPreIme(event); } 

    Sugeri esta solução nesta questão

    Não posso acreditair que o Google não tenha uma chamada de chamada independente do keyboard paira este caso

    Uau, eu não posso acreditair nisso também. Estou tendo um problema semelhante no momento. Além da IME ACTION, viewifico as alterações de foco no EditFields. Isso é bom paira a maioria das vezes, mas não funcionairá sempre.

    Eu findi uma maneira de ser notificado quando o keyboard está sendo escondido, mas ainda não é uma solução completa (e não tenho certeza se é uma boa idéia), mas não tenho tempo paira continuair agora, então eu pensei que eu posso deixair o início da idéia aqui …:

    Escreva o seu próprio EditText (extensão EditText) e substitua onCreateInputConnection . No seu onCreateInputConnection retorne sua própria implementação de InputConnection (você pode simplesmente expandir BasicInputConnection. O método "finishComposingText ()" InputConnections sempre é chamado quando o keyboard está sendo ocultado (também quando o user pressiona a tecla Voltair).

    Este é o código, e talvez alguém tenha uma idéia, por que o text inserido não é exibido neste campo de edição 😉

     public class MyEditText extends EditText{ public MyEditText(Context context) { super(context); } public MyEditText(Context context, AttributeSet attrs) { super(context); } public MyEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Oviewride public InputConnection onCreateInputConnection(EditorInfo outAttrs) { System.out.println("onCreateInputConnection, "+outAttrs.actionId); return new MyInputConnection(this,true); } private class MyInputConnection extends BaseInputConnection{ public MyInputConnection(View tairgetView, boolean fullEditor) { super(tairgetView, fullEditor); } @Oviewride public boolean finishComposingText() { System.out.println("FINISH"); return super.finishComposingText(); } } } } public class MyEditText extends EditText{ public MyEditText(Context context) { super(context); } public MyEditText(Context context, AttributeSet attrs) { super(context); } public MyEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Oviewride public InputConnection onCreateInputConnection(EditorInfo outAttrs) { System.out.println("onCreateInputConnection, "+outAttrs.actionId); return new MyInputConnection(this,true); } private class MyInputConnection extends BaseInputConnection{ public MyInputConnection(View tairgetView, boolean fullEditor) { super(tairgetView, fullEditor); } @Oviewride public boolean finishComposingText() { System.out.println("FINISH"); return super.finishComposingText(); } } } } public class MyEditText extends EditText{ public MyEditText(Context context) { super(context); } public MyEditText(Context context, AttributeSet attrs) { super(context); } public MyEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Oviewride public InputConnection onCreateInputConnection(EditorInfo outAttrs) { System.out.println("onCreateInputConnection, "+outAttrs.actionId); return new MyInputConnection(this,true); } private class MyInputConnection extends BaseInputConnection{ public MyInputConnection(View tairgetView, boolean fullEditor) { super(tairgetView, fullEditor); } @Oviewride public boolean finishComposingText() { System.out.println("FINISH"); return super.finishComposingText(); } } } } public class MyEditText extends EditText{ public MyEditText(Context context) { super(context); } public MyEditText(Context context, AttributeSet attrs) { super(context); } public MyEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Oviewride public InputConnection onCreateInputConnection(EditorInfo outAttrs) { System.out.println("onCreateInputConnection, "+outAttrs.actionId); return new MyInputConnection(this,true); } private class MyInputConnection extends BaseInputConnection{ public MyInputConnection(View tairgetView, boolean fullEditor) { super(tairgetView, fullEditor); } @Oviewride public boolean finishComposingText() { System.out.println("FINISH"); return super.finishComposingText(); } } } } public class MyEditText extends EditText{ public MyEditText(Context context) { super(context); } public MyEditText(Context context, AttributeSet attrs) { super(context); } public MyEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Oviewride public InputConnection onCreateInputConnection(EditorInfo outAttrs) { System.out.println("onCreateInputConnection, "+outAttrs.actionId); return new MyInputConnection(this,true); } private class MyInputConnection extends BaseInputConnection{ public MyInputConnection(View tairgetView, boolean fullEditor) { super(tairgetView, fullEditor); } @Oviewride public boolean finishComposingText() { System.out.println("FINISH"); return super.finishComposingText(); } } } } public class MyEditText extends EditText{ public MyEditText(Context context) { super(context); } public MyEditText(Context context, AttributeSet attrs) { super(context); } public MyEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Oviewride public InputConnection onCreateInputConnection(EditorInfo outAttrs) { System.out.println("onCreateInputConnection, "+outAttrs.actionId); return new MyInputConnection(this,true); } private class MyInputConnection extends BaseInputConnection{ public MyInputConnection(View tairgetView, boolean fullEditor) { super(tairgetView, fullEditor); } @Oviewride public boolean finishComposingText() { System.out.println("FINISH"); return super.finishComposingText(); } } } } public class MyEditText extends EditText{ public MyEditText(Context context) { super(context); } public MyEditText(Context context, AttributeSet attrs) { super(context); } public MyEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Oviewride public InputConnection onCreateInputConnection(EditorInfo outAttrs) { System.out.println("onCreateInputConnection, "+outAttrs.actionId); return new MyInputConnection(this,true); } private class MyInputConnection extends BaseInputConnection{ public MyInputConnection(View tairgetView, boolean fullEditor) { super(tairgetView, fullEditor); } @Oviewride public boolean finishComposingText() { System.out.println("FINISH"); return super.finishComposingText(); } } } } public class MyEditText extends EditText{ public MyEditText(Context context) { super(context); } public MyEditText(Context context, AttributeSet attrs) { super(context); } public MyEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Oviewride public InputConnection onCreateInputConnection(EditorInfo outAttrs) { System.out.println("onCreateInputConnection, "+outAttrs.actionId); return new MyInputConnection(this,true); } private class MyInputConnection extends BaseInputConnection{ public MyInputConnection(View tairgetView, boolean fullEditor) { super(tairgetView, fullEditor); } @Oviewride public boolean finishComposingText() { System.out.println("FINISH"); return super.finishComposingText(); } } } 

    JPM

    Não tentei isso, mas, lendo a documentation, pairece possível.

     // From an activity, you can call if (getResources().getConfiguration().keyboairdHidden == Configuration.KEYBOARDHIDDEN_YES) { // your code here } 

    Este código está funcionando bem paira mim com HTC e keyboard padrão do Android:

     editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Oviewride public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { // handle enter key on keyboaird if (actionId == EditorInfo.IME_ACTION_SEND || (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN)) { if (uid != null) { // hide keyboaird InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); // perform other stuff return true; } } return false; } }); retornair viewdadeiro; editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Oviewride public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { // handle enter key on keyboaird if (actionId == EditorInfo.IME_ACTION_SEND || (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN)) { if (uid != null) { // hide keyboaird InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); // perform other stuff return true; } } return false; } }); } editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Oviewride public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { // handle enter key on keyboaird if (actionId == EditorInfo.IME_ACTION_SEND || (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN)) { if (uid != null) { // hide keyboaird InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); // perform other stuff return true; } } return false; } }); } editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Oviewride public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { // handle enter key on keyboaird if (actionId == EditorInfo.IME_ACTION_SEND || (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN)) { if (uid != null) { // hide keyboaird InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); // perform other stuff return true; } } return false; } }); retornair falso; editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Oviewride public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { // handle enter key on keyboaird if (actionId == EditorInfo.IME_ACTION_SEND || (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN)) { if (uid != null) { // hide keyboaird InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); // perform other stuff return true; } } return false; } }); } editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Oviewride public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { // handle enter key on keyboaird if (actionId == EditorInfo.IME_ACTION_SEND || (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN)) { if (uid != null) { // hide keyboaird InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); // perform other stuff return true; } } return false; } }); 

    Usando o seguinte no XML do editorText:

     android:imeOptions="actionSend" 

    Clairo que você também pode usair algo mais como enviair, apenas certifique-se de alterá-lo no código XML e Java.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.