android中editText弹出软键盘并且根据editText中是否是内容来控制按钮的可用性

mppolk 9年前

来自: http://blog.csdn.net//chenguang79/article/details/48543561


      android 中editText点击弹出软键盘比较容易,可是有一种情况是,我们中转到一个编辑页面,让焦点在第一个editText中,同时自动弹出软键盘。一般情况的情况是

     

editText.setFocusable(true);     InputMethodManager inputManager =(InputMethodManager)editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);     inputManager.showSoftInput(editText, 0);

      这种情况,在写法上没有问题,可是我会发现,这种情况,很多时间是没有反应的, 为什么?因为有时候,editText并没有完全加载完,所以后面的事件,无法相应。怎么办?我们只要让弹出的软键盘延迟半秒钟就OK了,把上面的代码,改一下OK

     

editText.setFocusable(true);     Timer timer = new Timer();          timer.schedule(new TimerTask()                         {                             public void run()                             {                                 InputMethodManager inputManager = (InputMethodManager)editText.setFocusable.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);                                 inputManager.showSoftInput(editText.setFocusable, 0);                             }                         },                  500);

这回再试一下,就OK了

     还有一种需求是这样的,当editText里面的内容为空时,确定按钮为不可用,只有有内容的时候,才为可用。这个很多会说,在点提交的时候,做一下判断就可以,然后Toast一个提示,不是就可以了吗,速度还快。可是有时候,用户的需求是变态的。我们只能满足他,怎么做呢,我想大家都知道,editText有一个事件,addTextChangedListener它里面可以对editText进行监听,如下:

editText.addTextChangedListener(new TextWatcher() {                        @Override                        public void beforeTextChanged(CharSequence s, int start, int count, int after) {                  //内容改变前            }                        @Override                       public void onTextChanged(CharSequence s, int start, int before, int count) {                 //内容改后            }                        @Override                        public void afterTextChanged(Editable s) {                //结果显示在输入框中            }        });

我们一般只要在onTextChanged中,根据s.length()是否大于0就可以完成,可是这里有一个问题,你会发现,你输入的字越多,这个onTextChanged每次执行的次数也就越多,试想一下,如果是几百字,系统怕是要卡死。这怎么办呢。在editText中有一个属性叫inputType,它里面有一个值textNoSuggestions,官方的解释是“不提示”,我们只要设置了这个属性,你再试一次,你每次添加一个字或是删除一个字,editText就只会执行一次了,而不是根据你editText中有多少内容而执行多少次了。代码如下:

        

editText.addTextChangedListener(new TextWatcher() {              @Override              public void beforeTextChanged(CharSequence s, int start, int count, int after) {                    //内容改变前                }                @Override              public void onTextChanged(CharSequence s, int start, int before, int count) {                   if(s.length>0)                  {                      txt_collection_add_ok.setEnabled(true);                  }                  else                  {                      txt_collection_add_ok.setEnabled(false);                  }              }                @Override              public void afterTextChanged(Editable s) {                  //结果显示在输入框中                }          });