无法隐藏Android软键盘,即使使用InputManager

10

问题:

我希望在按下“添加”按钮时隐藏键盘。屏幕上有两个EditText。 在开始活动时键盘不会出现,这很好,但是点击按钮后它不会消失。

enter image description here

以下是我见过的所有可能的 Stack Overflow 问题,它们的答案都不能帮助我:

如何关闭/隐藏 Android 软键盘

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

如何在活动启动时隐藏软键盘

如何在单击 EditText 之外后将 Android 软键盘隐藏?

还有其他很多。

这是我的代码:

AddActivity

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变体:

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

我也尝试了这个:

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

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

我还尝试过:

     <activity android:name=".AddActivity"
              android:label="@string/app_name"
              android:parentActivityName=".MainActivity"
        android:windowSoftInputMode="stateAlwaysHidden">

    </activity>

   <activity android:name=".AddActivity"
              android:label="@string/app_name"
              android:parentActivityName=".MainActivity"
        android:windowSoftInputMode="stateAlwaysHidden">

    </activity>

使用这个后,我的应用程序停止工作:

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

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

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

text1.setInputType(InputType.TYPE_NULL);
text2.setInputType(InputType.TYPE_NULL);
3个回答

8

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

当我正在提问时,我决定再次尝试使用OnCliCkListener。经过几次随机尝试,以下是最终适合我的代码:

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

    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);

  • 在两个方法(onClickListenersetOnClickListener)中都使用try-catch进行异常处理。

当我搜索为什么XML属性中的onClick不起作用,而OnClickListener可以时,我发现以下链接很有用:

setOnclickListener vs OnClickListener vs View.OnClickListener

Android onClick in XML vs. OnClickListener

How exactly does the android:onClick XML attribute differ from setOnClickListener?

Difference between OnClick() event and OnClickListener?

现在,在回答的一半,我意识到我在使用XML中的onClick时犯了错误。以下是我做到摆脱OnClickListener的方法:

  • 首先,我将隐藏键盘的代码部分移动到onClick方法中。在我的情况下,我将整个代码移到addNewTask中。

关于使用onClick的一些重要点:

  • 该方法应该是publicvoid

  • 它应该带有一个View参数,例如View V

最后,可行的代码:

  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 :

    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:

      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, the XML attribute:

    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
我很感谢你的回答,但是所有的答案都已经可以在网上找到了。如果你在谷歌上做更好的搜索,会有更多的结果。不过没关系,现在这些答案也足够了。 - M D
1
@MD:你说得对,因为我是一个Android的初学者,所有的部分答案都让我感到困惑。在过去的几天里,我已经浏览了数百个链接(大多数来自SO),并尝试实现所有的答案。但它们就是不适合我的情况。例如,InputMethodManager是正确的方法,几乎所有的答案都建议使用它,但你可以看到在我的问题中它失败了。我不得不从这个答案中拼凑一部分,从那个答案中拼凑一部分,从我的逻辑中拼凑一部分,以确定哪些代码应该放在哪里等等。 - Ayushi Jha
1
是的,这就是为什么我写了“感谢你的回答”。+1 - M D

2
这将帮助您在启动时隐藏键盘,直到触摸编辑文本框。
getWindow().setSoftInputMode(
        WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
    );

在您的情况下,请尝试这样做。
btn.setOnClickListener(new View.OnClickListener() {


        public void onClick(View v) {
             getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

        }
    });

1
检查这个。
View view = this.getCurrentFocus();
if (view != null) {  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

关闭/隐藏安卓软键盘


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接