【问题标题】:Disabling the keyboard's send button when nothing has been typed yet [Android]尚未输入任何内容时禁用键盘的发送按钮 [Android]
【发布时间】:2023-03-14 02:14:01
【问题描述】:

我正在一个 android 应用程序中创建一个搜索选项。

按下屏幕键盘上的“搜索”后,将触发一个事件,该事件将查询发送到服务器。 我想要做的是禁用 screen-keyboard 上的“搜索”按钮,当尚未在对应的 EditText 中输入任何文本时。

我将此添加到EditText

android:imeOptions="actionSearch"

这就是为什么键盘有一个“搜索”按钮而不是默认的“输入”/“完成”。 (以防万一你想知道)。

【问题讨论】:

    标签: android android-softkeyboard android-xml


    【解决方案1】:

    我们无法禁用 Android 键盘上的操作按钮。您将不得不在编辑器操作侦听器中检查空字符串。

    【讨论】:

    • 那太糟糕了。我想检查一个空字符串将不得不做。我会选择这个答案,因为它是我问题的真正答案,而不仅仅是替代品。
    【解决方案2】:
    setOnEditorActionListener(new TextView.OnEditorActionListener() {
    if (txtView.getText().toString().trim().length() == 0) {
        Toast.makeText(getApplicationContext(), "Please Enter some text to search",
        Toast.Short).show();
        return true;    // returning true will keep the keyboard on
    }
    else search();
    

    【讨论】:

      【解决方案3】:

      试试这个(可能不是你想要的确切结果,但可能是你能得到的最接近的结果。

      1)从 xml 中删除 android:imeOptions="actionSearch"

      2)创建一个自定义的 TextWatcher addTextChangedListener(TextWatcher watcher),它允许您像这样动态更改键盘

      textMessage = (EditText)findViewById(R.id.textMessage);
      textMessage.addTextChangedListener(new TextWatcher(){
              public void afterTextChanged(Editable s) {
                  if(firstTime){//a boolean you init to true
                  firstTime = false;
                  textMessage.setImeOptions(EditorInfo.IME_ACTION_SEARCH);
              }
              public void beforeTextChanged(CharSequence s, int start, int count, int after){}
              public void onTextChanged(CharSequence s, int start, int before, int count){}
          });
      

      【讨论】:

      • 我试过了,但在创建视图后无法更改按钮的ImeOptions。但无论如何,它感觉不是正确的解决方案,因为我希望在输入某些内容之前禁用输入/搜索按钮。如果此答案有效,它将在输入按钮上显示文本“完成”而不是“搜索”。我只想让按钮变灰或向用户显示他/她不能搜索空字符串。
      【解决方案4】:

      您需要在其中制作 Custom EditText ,Make Extends EditText 和 @Override 下面的方法。

      这里是示例代码。

      private ArrayList<Integer> keysToIgnore = new ArrayList<Integer>();
      
          public EditTextCus(Context context) {
              super(context);
          }
      
          public EditTextCus(Context context, AttributeSet attrs){
              super(context, attrs);      
          }
      
          public EditTextCus(Context context, AttributeSet attrs, int defStyle){
              super (context, attrs, defStyle);       
          }
      
      
      
      private Boolean keyInIgnoreList(int keyCode) {      
              for (Integer i:keysToIgnore){
                  int key = i.intValue();
                  if (key == keyCode)
                      return true;
              }
              return false;
          }
      
          public void addKeyToIgnoreList(int keyCode) {
      
              if (!keyInIgnoreList(keyCode)){
                  keysToIgnore.add(keyCode);
              }
          }
      
          public void removeKeyFromIgnoreList(int keyCode) {
      
              if (keyInIgnoreList(keyCode)){
                  Integer key=new Integer(keyCode);
                  keysToIgnore.remove(key);
              }
          }
      
      
      @Override
          public boolean dispatchKeyEventPreIme(KeyEvent event) {
              //Log.d("ws", "dispatchKeyEventPreIme(" + event + ")");
      
                  // swallow the any key in the ignore list
                  if (keyInIgnoreList(event.getKeyCode())) {
                      KeyEvent.DispatcherState state = getKeyDispatcherState();
                      if (state != null) {
                          if (event.getAction() == KeyEvent.ACTION_DOWN
                                  /*&& event.getRepeatCount() == 0*/) {
                              state.startTracking(event, this);
                              return true;
                          } else if (event.getAction() == KeyEvent.ACTION_UP
                                  && !event.isCanceled() && state.isTracking(event)) {
                              return true;
                          }
                      }
                  }
              }
              return super.dispatchKeyEventPreIme(event);
          }
      

      您也可以对搜索键执行此操作:

      mCustomEditText.setOnEditorActionListener(new OnEditorActionListener() {
      
                  public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                      if(actionId==EditorInfo.IME_ACTION_SEARCH && event.getAction()==KeyEvent.KEYCODE_SEARCH){
                          System.out.println("Search pressed.........");
                      }
                      return false;
                  }
              });
      

      【讨论】:

      • 即使在从 enter (66) 和 search (84) 中添加了 keyCode 之后,它仍然不会忽略它。在取消注释记录事件的行后,我发现它永远不会到达dispatchKeyEventPreIme。没有任何东西输出到控制台。
      • @Pieter888 当搜索的硬键像在 HTC 手机中你会看到 dispatchKeyEventPreIme 这个方法会调用和接收软键盘事件你可以试试这个 mCustomEditText.setOnEditorActionListener 在 answer.Try in this method用于软键盘的回车键。
      【解决方案5】:

      在您的Activity 中实现OnKeyListener

      将此 keyListener 添加到您的 EditText

       myEditText.setOnKeyListener(this);  
      

      在您的Activity 中覆盖onKey()

      @Override
          public boolean onKey(View v, int keyCode, KeyEvent event) {
              if(v.getId() == R.id.myEditText)
              {
                  if(KeyEvent.KEYCODE_ENTER == keyCode)
                  {
                      if(myEditText.getText().toString().equals("") || myEditText.getText().toString().equals(null))
                      {
                          Toast.makeText(KeyboardTestActivity.this, "Event Eaten", Toast.LENGTH_SHORT).show();
                          Log.e("onKey", "Event Eaten");
                          return true;
                      }
                  }
              }
              return false;
          }
      

      这就完成了,只要你的EditText 为空并且你按下搜索键,它就会显示一个 Toast。

      注意onKey() 被调用两次,一次用于 keyDown,然后用于 KeyUp。您必须使用 KeyEvent 实例对其进行过滤,该实例作为 onKey() 方法中的参数接收。

      【讨论】:

        【解决方案6】:

        当 actionId 等于 IME_ACTION_DONE 时,将 OnEditorActionListener 附加到您的文本字段并从其 onEditorAction 方法返回 true。这将防止软键盘隐藏:

        EditText txtEdit = (EditText) findViewById(R.id.txtEdit);
        txtEdit.setOnEditorActionListener(new OnEditorActionListener() {
        
          public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_DONE) {
              // your additional processing... 
              return true;
            } else {
              return false;
            }
          }
        });
        

        参考这个LINKLINK

        【讨论】:

        • 他想禁用操作按钮,而不是阻止键盘隐藏。
        【解决方案7】:
            SearchInput.addTextChangedListener(new TextWatcher() {
        
                @Override
                public void afterTextChanged(Editable s) {
                    // TODO Auto-generated method stub
                    if( SearchInput.getText().toString().length() == 0 )
                    {
                        Search.setClickable(false);
                    }
                }
        
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count,
                        int after) {
                    // TODO Auto-generated method stub
                    Search.setClickable(false);
        
        
                }
        
                @Override
                public void onTextChanged(CharSequence s, int start, int before,
                        int count) {
                    // TODO Auto-generated method stub
                    Search.setClickable(true);
                }
        
            });
        

        或者试试这个..!对于花哨的错误日志

            Search.setOnClickListener(new OnClickListener() {
        
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
        
                    if( searchinput.getText().toString().length() == 0 )
                    {
                        searchinput.setError( "Enter something Blah Blah..!" );
                    }
                    else
                    {
        
        
               // Original Functions Goes Here
                    }
        

        在编辑文本中使用以下代码,

        android:imeOptions="flagNoEnterAction"
        

        我无法设置flagNoEnterAction = "false" 但是有人可以帮助你

        【讨论】:

        • 这仅适用于搜索按钮是我自己在应用程序中制作的按钮。但我说的是禁用 android-keyboard 上的 enter/search-key。
        • 我不会赞成这个答案,因为它不是我问题的有效答案。我想禁用 android 的屏幕键盘的搜索按钮。不是我的应用程序中的按钮。
        • 答案已编辑,添加了第三个代码,至少可以帮助您或其他人
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多