Обнаружение события на Android-клавиатуре
У меня есть некоторые намерения внутри контроллера табуляции, и для одного из них у меня есть текст редактирования, который мне нужно знать наверняка, когда он имеет фокус, и когда он теряет этот фокус.
Я отобразил большинство событий, таких как прослушиватель фокуса, OnEditorActionListener и т.д. Теперь моя единственная проблема заключается в том, что когда у меня есть фокус, появляется мягкая клавиатура, и я хочу ее закрыть:
1) кнопкой "Готово", а не кнопкой "Назад" на телефоне (отключите кнопку "Назад" , чтобы закрыть клавиатуру, когда клавиатура видна)
2) обнаруживает событие кнопки "Назад" , когда клавиатура видна, поэтому я могу передать фокус другому элементу управления.
Я пробовал несколько способов, но без успеха, например onBackPressed, onConfigurationChanged (добавить hiddenKeyboard в манифесте), key_down на активность и т.д., но без успеха.
Кто-нибудь преуспел в этом? Практически я хочу, когда клавиатура видна, и я нажимаю на телефон, мой текст редактирования теряет фокус (otherControl.requestFocus → , который является относительным расположением).
Ответы
Ответ 1
Старая тема, но вот ожидаемый ответ
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
Toast.makeText(getContext(), "BACK", Toast.LENGTH_SHORT).show();
return true;
}
return super.onKeyPreIme(keyCode, event);
}
Вы должны поместить это в класс, который переопределяет EditText (класс MyEditText расширяет EditText...)
Ответ 2
Вот способ захвата события нажатия клавиши: 1. Экстентное редактирование текста для переопределения onKeyPreIme
package com.test.test;
import android.content.Context;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.widget.EditText;
/**
* Created by sumit.saurabh on 11/10/16.
*/
public class ChatEditText extends EditText
{
/* Must use this constructor in order for the layout files to instantiate the class properly */
public ChatEditText(Context context, AttributeSet attrs)
{
super(context, attrs);
// TODO Auto-generated constructor stub
}
private KeyImeChange keyImeChangeListener;
public void setKeyImeChangeListener(KeyImeChange listener)
{
keyImeChangeListener = listener;
}
public interface KeyImeChange
{
public void onKeyIme(int keyCode, KeyEvent event);
}
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event)
{
if (keyImeChangeListener != null)
{
keyImeChangeListener.onKeyIme(keyCode, event);
}
return false;
}
}
2. ChatEditText в xml
<com.test.test.ChatEditText
android:id = "@+id/messageEditText"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_gravity = "bottom"
android:layout_marginLeft = "12dp"
android:layout_marginRight = "30dp"
android:background = "@null"
android:hint = "Type your message"
android:inputType = "textMultiLine"
android:singleLine = "false"
android:textColorHint = "#c4c0bd"
android:textSize = "18sp"/>
3. Затем присоедините слушателя из любой точки:
private ChatEditText messageEditText;
messageEditText =
(ChatEditText) findViewById(R.id.messageEditText);
messageEditText.setKeyImeChangeListener(new ChatEditText.KeyImeChange(){
@Override
public void onKeyIme(int keyCode, KeyEvent event)
{
if (KeyEvent.KEYCODE_BACK == event.getKeyCode())
{
// do something
}
}});
Ответ 3
здесь
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if(event.getKeyCode() == KeyEvent.KEYCODE_BACK)
{ //do you back event work here
}
return super.dispatchKeyEvent(event);
}