即使使用inputmanager也无法隐藏Android软键盘

Cannot hide Android soft keyboard even with inputmanager

问题:

I want to hide the keyboard when the button"Add" is pressed. There are two EditText on the screen. The keyboard doesn't appear at starting the activity, which is good, but it doesn't go away on clicking button.

enter image description here

以下是Stack Overflow的所有可能的问题,我看到他的答案对我没有帮助:

关闭/隐藏Android软键盘

以编程方式隐藏/显示Android软键盘

活动开始时如何隐藏软键盘

如何在EditText外单击后在android上隐藏软键盘?

和许多其他人。

这是我的代码:

AddActivity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class AddActivity extends ActionBarActivity {
EditText text1,text2;
DbHelper db;
ListView l;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add);
    db = new DbHelper(this);
    l = (ListView) findViewById(R.id.listInAddActivity);
    text1 = (EditText) findViewById(R.id.i1);
    text2 = (EditText) findViewById(R.id.i2);
//        text1.setInputType(InputType.TYPE_NULL);
  //      text2.setInputType(InputType.TYPE_NULL);
    hideKeyboard();

    loadDataInAdd();

}
public void addNewTask(View view) {
    String s1 = text1.getText().toString();
    String s2 = text2.getText().toString();
    db.addData(s1,s2);
    loadDataInAdd();
    hideKeyboard();
}
public void loadDataInAdd()
{
    try {
        Cursor cursor = db.fetchData();

        ListAdapter myAdapter = new SimpleCursorAdapter(this, R.layout.tasks,
                cursor,
                new String[]{db._ID, db.COLUMN_1, db.COLUMN_2},
                new int[]{R.id.idnum, R.id.c1, R.id.c2}, 0);
        l.setAdapter(myAdapter);
    }
    catch(NullPointerException e)
    {
        e.printStackTrace();
    }
  //  MainActivity.loadData();
}
private void hideKeyboard() {
    // Check if no view has focus:
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

}

大多数答案都是关于InputManager方法,但它对我不起作用,即单击按钮时不会隐藏键盘。这是InputManager我使用的另一种变体:

1
2
3
4
View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);

我也试过这个:

1
2
3
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
);

这也不起作用(键盘没有隐藏在点击按钮上)。

我也尝试过:

1
2
3
4
5
6
     <activity android:name=".AddActivity"
              android:label="@string/app_name"
              android:parentActivityName=".MainActivity"
        android:windowSoftInputMode="stateAlwaysHidden">

    </activity>

1
2
3
4
5
6
   <activity android:name=".AddActivity"
              android:label="@string/app_name"
              android:parentActivityName=".MainActivity"
        android:windowSoftInputMode="stateAlwaysHidden">

    </activity>

有了这个,我的应用程序停止工作:

1
2
3
4
5
   InputMethodManager inputManager = (InputMethodManager)
            getSystemService(Context.INPUT_METHOD_SERVICE);

    inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
            InputMethodManager.HIDE_NOT_ALWAYS);

这个完全隐藏了键盘(即使单击editText键盘也没出现):

1
2
text1.setInputType(InputType.TYPE_NULL);
text2.setInputType(InputType.TYPE_NULL);


我决定使用onclicklistener作为我的按钮,而不是使用另一个函数并通过AddActivity.xml中的onClick调用它。

当我决定再次尝试使用onclicklistener时,我的问题已经过了一半。经过几次随机尝试后,以下是适用于我的最终代码:

1
2
3
4
5
6
7
8
9
10
11
btn.setOnClickListener(new View.OnClickListener() {


        public void onClick(View v) {
            // TODO Auto-generated method stub

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

        }
    });

另一种方法是以下列方式使用onclicklistener

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    private View.OnClickListener mListener = new View.OnClickListener() {
    public void onClick(View v) {
        // do something when the button is clicked

        //public void onClick(View v) {

            try {
                InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
                inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
            }
 catch (Exception e) {
      e.printStackTrace();
            }

    }
};

像我这样的初学者的重点:

  • 上面的代码应该放在protected void onCreate(Bundle savedInstanceState)之前
  • 要调用上述内容,请将此代码放在protected void onCreate(Bundle savedInstanceState)中:

    btn.setOnClickListener(mListener);

  • 在两种方法中使用try-catch进行异常处理(onclicklistenersetOnClickListener)

在搜索onClick的原因时,XML属性对我不起作用,而onclicklistener,我发现以下链接有用:

setOnclickListener vs OnClickListener vs View.OnClickListener

Android onClick in XML vs. OnClickListener

android:onClick XML属性与setOnClickListener有何不同?

OnClick()事件和OnClickListener之间的区别?

现在,在我的回答中,我意识到我在使用XML中的onClick时犯了错误。这是我为摆脱onclicklistener而做的事情:

  • 首先,我将隐藏键盘的代码部分移动到onClick中的方法中。在我的例子中,我将hideKeyboard()中的整个代码移动到addNewTask

关于使用onClick的一些要点

  • 该方法应为publicvoid

  • 它应该采用View参数,例如View V

最后,有效的代码:

1
2
3
4
5
6
7
8
9
10
11
  public void addNewTask(View view) {
    String s1 = text1.getText().toString();
    String s2 = text2.getText().toString();
    db.addData(s1, s2);
    loadDataInAdd();
  //  hideKeyboard(); below is the code to hide keyboard
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }
}

摘要

我找到了三种隐藏软键盘的方法,使用:

  • OnClickListener:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    private View.OnClickListener mListener = new View.OnClickListener() {
    public void onClick(View v) {
        // do something when the button is clicked

        //public void onClick(View v) {

            try {
                InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
                inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
            }

       catch (Exception e) {
      e.printStackTrace();
            }

    }
    };
  • setOnClickListener:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      btn.setOnClickListener(new View.OnClickListener() {


        public void onClick(View v) {
            // TODO Auto-generated method stub

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

        }
    });
  • onClick,XML属性:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void addNewTask(View view) {
    String s1 = text1.getText().toString();
    String s2 = text2.getText().toString();
    db.addData(s1, s2);
    loadDataInAdd();
    //  hideKeyboard();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }
    }


看一下这个

1
2
3
4
5
View view = this.getCurrentFocus();
if (view != null) {  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

关闭/隐藏Android软键盘