即使使用inputmanager

时间:2015-07-10 09:31:03

标签: android keyboard

问题:

  

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

enter image description here

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

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

3 个答案:

答案 0 :(得分:6)

我决定使用onclicklistener作为我的按钮,而不是使用其他功能并通过onClick中的AddActivity.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

在搜索onClick的原因后,XML属性对我不起作用,而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 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 :(得分: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); 

        }
    });

答案 2 :(得分: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