在android中输入EditText后如何隐藏键盘?


73

我有一个EditText和按钮对齐到父母的底部。

当我在其中输入文本并按下按钮保存数据时,虚拟键盘不会消失。

谁能指导我如何隐藏键盘?


您不是说EditText(不是TextView)吗?
SMBiggs

Answers:


126

这应该工作。

InputMethodManager inputManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS); 

只要确保this.getCurrentFocus()不返回null,如果没有焦点,它将返回null。


遇到以下错误oncreate无法从类型
UMAR-MOBITSOLUTIONS

32
InputMethodManager imm =(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(myEditText.getWindowToken(),0); 现在正在工作...
UMAR-MOBITSOLUTIONS 2010年

2
您无需使用此方法隐藏软键盘。请参阅下面的@angelrh答案以及说在OnEditorActionListener中返回false以及将xml中的编辑文本标记为singleLine = true的注释。
Nilesh

getCurrentFocus()获得null
android_jain

@android_jain是因为没有任何焦点。
Ryan Alford

135

您可能还需要在EditText中定义imeOptions。这样,一旦您按“完成”,键盘就会消失:

<EditText
    android:id="@+id/editText1"
    android:inputType="text"
    android:imeOptions="actionDone"/>

41
如果您在实现时不使用该事件,则这仅适用于true onEditorAction([...])。返回true会阻止键盘正确隐藏。
埃里克

9
一旦为actionDone或actionSearch按下“完成”或“搜索”,软键盘将关闭,但是您必须在onEditorActionListener中返回false。
alexhilton 2014年

7
这个和android:singleLine="true"
Simas 2014年

1
@Simasandroid:singleLine="true"已弃用,无法使用maxLines=1。有任何想法吗?
Borja

1
@BorjasingleLine已替换为maxLines=1。应该按预期工作。如果不是,请创建一个单独的问题。
Simas

25
   mEtNumber.setOnEditorActionListener(new TextView.OnEditorActionListener() {

            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (actionId == EditorInfo.IME_ACTION_DONE) {
                    // do something, e.g. set your TextView here via .setText()
                    InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                    return true;
                }
                return false;
            }
        });

并在xml中

  android:imeOptions="actionDone"

11
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

9

我没有看到任何人使用此方法:

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View view, boolean focused) {
        InputMethodManager keyboard = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (focused)
            keyboard.showSoftInput(editText, 0);
        else
            keyboard.hideSoftInputFromWindow(editText.getWindowToken(), 0);
    }
});

然后只请求将焦点放在editText上:

editText.requestFocus();

5

EditText操作侦听器中包含的解决方案:

public void onCreate(Bundle savedInstanceState) {
    ...
    ...
    edittext = (EditText) findViewById(R.id.EditText01);
    edittext.setOnEditorActionListener(new OnEditorActionListener() {
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (event != null&& (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
                InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                in.hideSoftInputFromWindow(edittext.getApplicationWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
            }
            return false;
        }
    });
    ...
    ...
}

3

我发现这是因为我的EditText在进入时并没有自动被解雇。

这是我的原始代码。

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if ( (actionId == EditorInfo.IME_ACTION_DONE) || ((event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN ))) {

            // Do stuff when user presses enter

            return true;

        }

        return false;
    }
});

我通过删除线解决了它

return true;

在用户按回车键完成操作后。

希望这对某人有帮助。


3

只需写下这两行代码,在其中输入选项将起作用。

InputMethodManager inputManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);


2

您可以像这样轻松地为呼叫创建单例类:

public class KeyboardUtils {

    private static KeyboardUtils instance;
    private InputMethodManager inputMethodManager;

    private KeyboardUtils() {
    }

    public static KeyboardUtils getInstance() {
        if (instance == null)
            instance = new KeyboardUtils();
        return instance;
    }

    private InputMethodManager getInputMethodManager() {
        if (inputMethodManager == null)
            inputMethodManager = (InputMethodManager) Application.getInstance().getSystemService(Activity.INPUT_METHOD_SERVICE);
        return inputMethodManager;
    }

    @SuppressWarnings("ConstantConditions")
    public void hide(final Activity activity) {
        new Handler().post(new Runnable() {
            @Override
            public void run() {
                try {
                    getInputMethodManager().hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
                } catch (NullPointerException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

这样,以后可以调用活动下一个表格了:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity);
        KeyboardUtils.getInstance().hide(this);
    }

}

2

您可以在顶部看到标记的答案。但是我用getDialog().getCurrentFocus()得很好并且运行良好。我发布此答案是因为我无法输入"this"oncreatedialog。

这就是我的答案。如果您尝试了带标记的答案但不起作用,则可以尝试以下操作:

InputMethodManager inputManager = (InputMethodManager) getActivity().getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getDialog().getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

1

我使用此方法从编辑文本中删除键盘:

 public static void hideKeyboard(Activity activity, IBinder binder) {
    if (activity != null) {
        InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (binder != null && inputManager != null) {
            inputManager.hideSoftInputFromWindow(binder, 0);//HIDE_NOT_ALWAYS
            inputManager.showSoftInputFromInputMethod(binder, 0);
        }
    }
}

而且这种将键盘从活动中移除的方法(在某些情况下不起作用,例如,当edittext绑定到键盘时,失去焦点,它将无法工作。但是在其他情况下,它会很好用,并且您没有关心容纳键盘的元素)。

 public static void hideKeyboard(Activity activity) {
    if (activity != null) {
        InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (activity.getCurrentFocus() != null && inputManager != null) {
            inputManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
            inputManager.showSoftInputFromInputMethod(activity.getCurrentFocus().getWindowToken(), 0);
        }
    }
}

1
int klavStat = 1; // for keyboard soft/hide button
int inType;  // to remeber your default keybort Type

编辑器-是EditText字段

/// metod for onclick button ///
public void keyboard(View view) {
    if (klavStat == 1) {
        klavStat = 0;
        
        inType = editor.getInputType();
        
        InputMethodManager imm = (InputMethodManager)
                getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
     

        editor.setInputType(InputType.TYPE_NULL);

        editor.setTextIsSelectable(true);
    } else {
        klavStat = 1;


        InputMethodManager imm = (InputMethodManager)
                getSystemService(Context.INPUT_METHOD_SERVICE);

        imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

        editor.setInputType(inType);
    }
}

如果您有另一个EditText字段,则需要注意焦点更改。


为了让Kit-kat隐藏,我使用这个:`editor.setInputType(InputType.TYPE_NULL); editor.setSingleLine(false); editor.setTextIsSelectable(true);`
D.Dzugo

0

就我而言,为了在按下“发送按钮”时隐藏键盘,我使用了可接受的答案,但是将上下文更改为getApplication并添加了getWindow()。

InputMethodManager inputManager = (InputMethodManager) getApplication().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

-1
editText.setInputType(InputType.TYPE_NULL);

请添加说明。您的答案目前正在投票删除。请这样做以避免将来的误会。
张敬轩

@ daniel-cheung:我不理解这种评论。从上下文来看不是很明显吗?如果不是,那么这里不是学习上下文的地方。
Protean '18

2
应否决/删除此答案的原因是,它起初看起来像是可以工作的,但随后键盘再也不会出现,因此这不是一个合适的解决方案。
Protean '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.