关闭软键盘

时间:2016-09-01 01:58:26

标签: android

在软键盘关闭后,edittext游标是否会继续闪烁,或者这是在模拟器上进行测试的结果,并且不会在实际设备上发生? - 正如this discussion

中的第二篇文章所指出的那样

更新

我知道edittexts仍然让光标闪烁,因为它们仍然处于焦点状态 - 每当edittext失去焦点时都会记录一条消息,但是当软键盘关闭时,消息从未被记录。

更新

我已经尝试过:

@Override
public void onBackPressed() {
    super.onBackPressed();
    getCurrentFocus().clearFocus();
}

因此,每次键盘关闭时,当前焦点的EditText都会失去焦点并调用onFocusChanged()。问题是当键盘启动时按下后退按钮时,onBackPressed()不会被调用。我知道这是因为我在onBackPressed()中放了一个toast,并且在键盘启动时按下后退按钮时没有toast显示。

7 个答案:

答案 0 :(得分:1)

首先创建自定义编辑文本。下面是按下键盘后退以关闭键盘时回调的示例

public class EdittextListner extends EditText {

private KeyImeChange keyImeChangeListener;

public EdittextListner(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public void setKeyImeChangeListener(KeyImeChange listener) {
    keyImeChangeListener = listener;
}

public interface KeyImeChange {
    public boolean onKeyIme(int keyCode, KeyEvent event);
}

@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
    if (keyImeChangeListener != null) {
        return keyImeChangeListener.onKeyIme(keyCode, event);
    }
    return false;
}

}

其次将您的EditText更改为布局文件中的EdittextListner。

最后执行以下操作

 mLastNameEditText.setKeyImeChangeListener(new EdittextListner.KeyImeChange() {
        @Override
        public boolean onKeyIme(int keyCode, KeyEvent event) {
            mLastNameEditText.clearFocus();
            return true;
        }
    });

这对我有用。希望这有帮助

答案 1 :(得分:1)

Edittext是一个接受用户输入的视图,因此它与keyborad打开或关闭无关,当用户点击edittext时,edittext将获得焦点,光标将开始闪烁以进行输入,

所以你可以做一件事,就像当你关闭键盘的同时你也可以设置该edittext的光标可见性,这样它就会停止闪烁,

为此,您需要在隐藏键盘时写下以下行。

    editTextObject.setCursorVisible(false);

这将使光标停止闪烁。

答案 2 :(得分:0)

正如您所说,EditText中闪烁的光标与有焦点的EditText相关,但显示或隐藏软键盘与View获得或失去焦点无关。任何ViewEditText或其他)都可以独立于是否显示软键盘,并且EditText没有任何内在因素可以使其表现得与众不同。

如果您希望隐藏软键盘时EditText失去焦点,则需要通过监听软键盘可见性的更改并更新EditText来自行实现此功能

答案 3 :(得分:0)

知道键盘消失的唯一方法是覆盖 OnglobalLayout并检查高度。 基于该事件,你可以" setCursorVisible(false)"在您的编辑文本

答案 4 :(得分:0)

有关详细信息,请查看此Link

RelativeLayout mainLayout = findViewById(R.layout.main_layout); // You must use the layout root
InputMethodManager im = (InputMethodManager)  getSystemService(Service.INPUT_METHOD_SERVICE);

/*
Instantiate and pass a callback
*/
SoftKeyboard softKeyboard;
softKeyboard = new SoftKeyboard(mainLayout, im);
softKeyboard.setSoftKeyboardCallback(new SoftKeyboard.SoftKeyboardChanged()
{

@Override
public void onSoftKeyboardHide() 
{
    // Code here
  EditText.clearFocus();
}

@Override
public void onSoftKeyboardShow() 
{
    // Code here
}   
});

/*
Open or close the soft keyboard easily
*/
softKeyboard.openSoftKeyboard();
softKeyboard.closeSoftKeyboard();

/* Prevent memory leaks:
*/
@Override
public void onDestroy()
{
super.onDestroy();
softKeyboard.unRegisterSoftKeyboardCallback();
}

答案 5 :(得分:0)

试试这个:

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 {
    void onImeBack(EditTextBackEvent ctrl, String text);
}
  }
布局中的

<yourpackagename.EditTextBackEvent
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                />

并在你的片段中:

edittext.setOnEditTextImeBackListener(new EditTextBackEvent.EditTextImeBackListener()
    {
        @Override
        public void onImeBack(EditTextBackEvent ctrl, String text)
        {
           edittext.clearfocus();
        }
    });

答案 6 :(得分:-1)

尝试在布局中保留一个可以在editText上方聚焦的视图。

<View
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:focusable="true"
    android:focusableInTouchMode="true" />

这应该起作用,因为空白的可聚焦视图应该捕捉焦点,而不是你的编辑文本。