내보기에 EditText 위젯이 있습니다. 사용자가 EditText 위젯을 선택하면 몇 가지 지침이 표시되고 소프트 키보드가 나타납니다.
OnEditorActionListener를 사용하여 사용자가 텍스트 입력을 완료 한시기를 감지하고 키보드를 닫고 지침을 숨기고 몇 가지 작업을 수행합니다.
내 문제는 사용자가 BACK 키를 눌러 키보드를 닫을 때입니다. OS가 키보드를 닫지 만 내 지침 (숨겨야 함)은 여전히 표시됩니다.
OnKeyDown 재정의를 시도했지만 BACK 버튼을 사용하여 키보드를 닫을 때 호출되지 않는 것 같습니다.
EditText 위젯에서 OnKeyListener를 설정하려고 시도했지만 호출되지 않는 것 같습니다.
소프트 키보드가 해제되는시기를 어떻게 감지 할 수 있습니까?
답변
나는 이것을하는 방법을 알고있다. EditText를 하위 클래스로 만들고 다음을 구현합니다.
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
// Do your thing.
return true; // So it is not propagated.
}
return super.dispatchKeyEvent(event);
}
다음은 사용자 정의보기를 사용하는 방법에 대한 링크입니다 (EditText를 하위 클래스로 지정하는 경우) :
http://developer.android.com/guide/topics/ui/custom-components.html
답변
제이, 당신의 해결책은 좋습니다! 감사 🙂
public class EditTextBackEvent extends EditText {
private EditTextImeBackListener mOnImeBack;
public EditTextBackEvent(Context context) {
super(context);
}
public EditTextBackEvent(Context context, AttributeSet attrs) {
super(context, attrs);
}
public EditTextBackEvent(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK &&
event.getAction() == KeyEvent.ACTION_UP) {
if (mOnImeBack != null)
mOnImeBack.onImeBack(this, this.getText().toString());
}
return super.dispatchKeyEvent(event);
}
public void setOnEditTextImeBackListener(EditTextImeBackListener listener) {
mOnImeBack = listener;
}
}
public interface EditTextImeBackListener {
public abstract void onImeBack(EditTextBackEvent ctrl, String text);
}
답변
super.onKeyPreIme ()를 호출하여 Jay의 솔루션을 약간 변경했습니다.
_e = new EditText(inflater.getContext()) {
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK){
cancelTextInput();
}
return super.onKeyPreIme(keyCode, event);
}
};
멋진 솔루션, Jay, +1!
답변
다음은 키보드가 표시되는지 여부를 감지하는 사용자 정의 EditText입니다.
/**
* Created by TheFinestArtist on 9/24/15.
*/
public class KeyboardEditText extends EditText {
public KeyboardEditText(Context context) {
super(context);
}
public KeyboardEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public KeyboardEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if (listener != null)
listener.onStateChanged(this, true);
}
@Override
public boolean onKeyPreIme(int keyCode, @NonNull KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK
&& event.getAction() == KeyEvent.ACTION_UP) {
if (listener != null)
listener.onStateChanged(this, false);
}
return super.onKeyPreIme(keyCode, event);
}
/**
* Keyboard Listener
*/
KeyboardListener listener;
public void setOnKeyboardListener(KeyboardListener listener) {
this.listener = listener;
}
public interface KeyboardListener {
void onStateChanged(KeyboardEditText keyboardEditText, boolean showing);
}
}
답변
이제 2019 년 …
그래서 Kotlin으로 더 깔끔한 솔루션을 만들었습니다
1. 확장 기능을 만듭니다.
fun Activity.addKeyboardToggleListener(onKeyboardToggleAction: (shown: Boolean) -> Unit): KeyboardToggleListener? {
val root = findViewById<View>(android.R.id.content)
val listener = KeyboardToggleListener(root, onKeyboardToggleAction)
return root?.viewTreeObserver?.run {
addOnGlobalLayoutListener(listener)
listener
}
}
2. 토글 리스너는 다음과 같습니다.
open class KeyboardToggleListener(
private val root: View?,
private val onKeyboardToggleAction: (shown: Boolean) -> Unit
) : ViewTreeObserver.OnGlobalLayoutListener {
private var shown = false
override fun onGlobalLayout() {
root?.run {
val heightDiff = rootView.height - height
val keyboardShown = heightDiff > dpToPx(200f)
if (shown != keyboardShown) {
onKeyboardToggleAction.invoke(keyboardShown)
shown = keyboardShown
}
}
}
}
fun View.dpToPx(dp: Float) = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, resources.displayMetrics).roundToInt()
3. 다음과 같이 간단한 활동에서 사용하십시오 .
addKeyboardToggleListener {shown ->
// hurray! Now you know when the keyboard is shown and hidden!!
}
답변
Edittext를 확장하는 클래스를 만들고 코드에서 해당 edittext를 사용하기 만하면됩니다. 사용자 정의 edittext에서 다음 메서드를 재정의하면됩니다.
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
//Here it catch all back keys
//Now you can do what you want.
} else if (keyCode == KeyEvent.KEYCODE_MENU) {
// Eat the event
return true;
}
return false;}
답변
다음은 키 리스너를 사용한 솔루션입니다. 왜 이것이 작동하는지 모르겠지만 사용자 정의 EditText에서 onKeyPreIme을 순수하게 재정의하면 OnKeyListener가 작동합니다.
SomeClass.java
customEditText.setOnKeyListener((v, keyCode, event) -> {
if(event.getAction() == KeyEvent.ACTION_DOWN) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
getPresenter().onBackPressed();
break;
}
}
return false;
});
CustomEditText.java
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
return super.dispatchKeyEvent(event);
}