2015-07-10 84 views
6

问题:无法隐藏Android的软键盘,即使输入管理

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

enter image description here

下面是堆栈溢出所有可能的问题,我已经看到其答案不帮我:

Close/hide the Android Soft Keyboard

Programmatically Hide/Show Android Soft Keyboard

How to hide Soft Keyboard when activity starts

How to hide soft keyboard on android after clicking outside EditText?

等等。

这里是我的代码:

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

回答

6

我决定使用onclicklistener我的按钮,而不是使用其他功能,并通过onClickAddActivity.xml调用它。

当我决定尝试再次尝试使用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);

  • 使用try-catch在这两种方法的异常处理(onClickListenersetOnClickListener

在寻找为什么onClickXML属性不为我工作,而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?

现在,中途我的回答,我意识到自己的错误,在使用onClick从XML。这里是我做了什么,摆脱OnClickListener S的:

  • 首先,我提出我的代码掩藏键盘进入方法onClick的一部分。在我的情况下,我将hideKeyboard()中的整个代码移动到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); 
    } 
} 

摘要

我发现3种方式来隐藏软键盘对我的情况下,使用:

  • 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中,XML属性:

    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

我感谢您的回答。但所有的答案已经可用。如果您在_Google_上进行了更好的搜索。但没关系,一切都在一起。 –

+1

@MD:你可能是对的,因为我是Android的初学者,所有的部分答案让我困惑不已。在过去的几天里,我经历了数百个链接(大部分来自SO),并试图实现所有的答案。但他们只是不适合我的情况。例如,'InputMethodManager'是要走的路,几乎所有的答案都表明,但是你可以看到我的问题是如何失败的。我必须从这个答案拼凑出一部分,从这个答案的一部分,我自己逻辑的一部分,以及代码应该到哪里去,等等。 –

+1

雅这就是为什么我写'赞赏你的答案'。 +1 up –

1

检查了这一点

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

Close/hide the Android Soft Keyboard