【问题标题】:How to disable Button if EditText is empty ?如果 EditText 为空,如何禁用 Button?
【发布时间】:2014-03-27 06:42:11
【问题描述】:

我的应用程序中有一个 EditText 和一个 Button。

当按钮被点击时,EditText中输入的文本被添加到ListView中。

如果 EditText 为空,我想禁用 Button。如何执行此操作?

这是我的按钮点击代码

ImageButton imb=(ImageButton)findViewById(R.id.btn_send);
            imb.setOnClickListener(new OnClickListener()
            {
             @Override
             public void onClick(View arg0) 
             { 
                 EditText et = (EditText)findViewById(R.id.EditText1);

                  String str = et.getText().toString();
                  web1.add(str);
                  Toast.makeText(ShoutSingleProgram.this, "You entered...."+str, Toast.LENGTH_SHORT).show();
                  adapter1.notifyDataSetChanged();
                  et.setText("");

                    }
            });
            }

我该怎么做?

【问题讨论】:

    标签: android button


    【解决方案1】:
        editText1.addTextChangedListener(new TextWatcher() {
    
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
    
               if(s.toString().trim().length()==0){
                    button.setEnabled(false);
                  } else {
                    button.setEnabled(true);
                  }
            }
    
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
                // TODO Auto-generated method stub
    
            }
    
            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub
    
            }
        });
    

    【讨论】:

    • onTextChanged 如果用户没有在编辑中输入内容,则不会被调用。除了在onClick 中处理外,我该如何处理?
    • 您可能想首先将按钮设置为 false
    【解决方案2】:

    使用TextChangedListener 并最初在 onCreate() 中禁用ImageButton

    试试这个

    public class MyActivity extends Activity {
    
    ImageButton imb;
    EditText et;
    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        imb = (ImageButton) findViewById(R.id.btn_send);
        et = (EditText) findViewById(R.id.EditText1);
    
        imb.setEnabled(false); // set button disable initially
    
        et.addTextChangedListener(new TextWatcher() {
    
            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
                // TODO Auto-generated method stub
    
                if (s.toString().equals("")) {
                    imb.setEnabled(false);
                } else {
                    imb.setEnabled(true);
                }
            }
    
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
                // TODO Auto-generated method stub
    
            }
    
            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub
    
            }
        });
    
    }
    
    }
    

    【讨论】:

      【解决方案3】:

      简单只检查onCreate中的条件

      if (et.getText().toString().trim().equals("")){
        button.setEnabled(false);
      }
      else{
      button.setEnabled(true);
      }
      

      【讨论】:

        【解决方案4】:

        简单的解决方案

        这在Data-Binding 中很容易实现。我希望你在这个时候意识到这一点。您可以仅通过 XML 使用 EditText 管理 Button。

        android:enabled="@{etName.text.length() > 0 && etPassword.text.length() > 5}"
        

        相当于

        button.setEnabled(etName.getText().length() > 0 && etPassword.getText().length() > 5 );
        
        • 这里的&HTML entity,表示&。可以有 & 之类的任何运算符。

        • etName & etPassword 是 EditTexts id。

        完整的 XML -

        <LinearLayout
            >
        
            <EditText
                android:id="@+id/etName"
                />
        
            <EditText
                android:id="@+id/etPassword"
                />
        
            <Button
                android:enabled="@{etName.text.length() > 5 &amp;&amp; etPassword.text.length() > 5}"
                />
        
        </LinearLayout>
        

        【讨论】:

        • 在满足这些条件后是否会再次启用该按钮?如果不是,我认为您的回答是无用或无关紧要的。
        【解决方案5】:

        这是 Kotlin 中的一个超级简单的答案。

        只需将“EditText”和“Button”替换为您自己的即可。

        Button.isEnabled = false
                EditText.addTextChangedListener(object: TextWatcher {
                    override fun onTextChanged(s:CharSequence, start:Int, before:Int, count:Int) {
                        Button.isEnabled = s.toString().trim{ it <= ' ' }.isNotEmpty()
                    }
                    override fun beforeTextChanged(s:CharSequence, start:Int, count:Int,
                                                   after:Int) {
                    }
                    override fun afterTextChanged(s: Editable) {
                    }
                })
        

        对于多个 EditTexts 去

        Button.isEnabled = false
                    val editTexts = listOf(editText1, editText2, editText3, editText4, editText5, editText6)
        for (editText in editTexts) {
                    editText.addTextChangedListener(object : TextWatcher {
                    override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
                        var et1 = editText1.text.toString().trim()
                        var et2 = editText2.text.toString().trim()
                        var et3 = editText3.text.toString().trim()
                        var et4 = editText4.text.toString().trim()
                        var et5 = editText5.text.toString().trim()
                        var et6 = editText6.text.toString().trim()
        
                        computeBtn.isEnabled = et1.isNotEmpty()
                                && et2.isNotEmpty()
                                && et3.isNotEmpty()
                                && et4.isNotEmpty()
                                && et5.isNotEmpty()
                                && et6.isNotEmpty()
                    }
        
                    override fun beforeTextChanged(
                        s: CharSequence, start: Int, count: Int, after: Int) {
                    }
        
                    override fun afterTextChanged(
                        s: Editable) {
                    }
                })
                }
        

        【讨论】:

          【解决方案6】:

          我使用TextUtils 来获得简洁的解决方案:

              editText.addTextChangedListener(new TextWatcher() {
                  @Override
                  public void onTextChanged(CharSequence s, int start, int before, int count) {
                      button.setEnabled(!TextUtils.isEmpty(s.toString().trim()));
                  }
          
                  @Override
                  public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                  }
          
                  @Override
                  public void afterTextChanged(Editable s) {
                  }
              });
          

          【讨论】:

            【解决方案7】:

            在 EditText 中添加一个 TextWatcher,这样当您更改其中的文本时,您的 Button 会自行启用或禁用。

            【讨论】:

              【解决方案8】:

              最初在onCreate() 中禁用该按钮。 然后在编辑文本中添加addTextChangedListener。在那检查edittext长度,如果它是0则禁用或以其他方式启用它

              【讨论】:

                【解决方案9】:

                如果您想使用面向对象的解决方案并重用您的代码

                public abstract class EmptyTextWatcher implements TextWatcher
                {
                    public abstract void onEmptyField();
                
                    public abstract void onFilledField();
                
                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count)
                    {
                        if (s.toString().trim().length() == 0)
                        {
                            onEmptyField();
                        } else
                        {
                            onFilledField();
                        }
                    }
                
                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count, int after)
                    {
                
                    }
                
                
                
                    @Override
                    public void afterTextChanged(Editable s)
                    {
                
                    }
                
                }
                

                所以你可以使用它只是做

                textView.addTextChangedListener(new EmptyTextWatcher()
                        {
                
                            @Override
                            public void onEmptyField()
                            {
                                button.setEnabled(false);
                            }
                
                            @Override
                            public void onFilledField()
                            {
                                button.setEnabled(true);
                            }
                        });
                

                【讨论】:

                  【解决方案10】:

                  在 Oncreate() 上,在单击按钮之前,您应该检查条件为,

                     ImageButton imb=(ImageButton)findViewById(R.id.btn_send);
                     EditText et = (EditText)findViewById(R.id.EditText1);
                     if(et.getText().toString().equals("")
                     {
                     imb.setEnabled(false);
                     }
                  
                     imb.setOnClickListener(new OnClickListener()
                          {
                           @Override
                           public void onClick(View arg0) 
                           { 
                               EditText et = (EditText)findViewById(R.id.EditText1);
                  
                                String str = et.getText().toString();
                                web1.add(str);
                                Toast.makeText(ShoutSingleProgram.this, "You entered...."+str, Toast.LENGTH_SHORT).show();
                                adapter1.notifyDataSetChanged();
                                et.setText("");
                  
                                  }
                          });
                  

                  【讨论】:

                  • OP 需要一个 textWatcher。
                  【解决方案11】:

                  当你想在那里禁用editText时你将使用下面的代码

                  editText.setEnabled(false); 
                  editText.setFocusable(false);
                  

                  【讨论】:

                    【解决方案12】:

                    您在运行时使用文本观察器检查编辑文本的状态。 下面的代码计算文本长度并在长度为零时禁用。 使用此代码:

                    EditText mEditText = new EditText(this);
                        mEditText.addTextChangedListener(new TextWatcher() {
                    
                            @Override
                            public void onTextChanged(CharSequence s, int start, int before,
                                    int count) {
                                // TODO Auto-generated method stub
                                if (s.length() == 0) {
                                    button.setEnabled(false);
                                }
                                                else {
                                                button.setEnabled(true);
                                            }
                            }
                    
                            @Override
                            public void beforeTextChanged(CharSequence s, int start, int count,
                                    int after) {
                                // TODO Auto-generated method stub
                    
                            }
                    
                            @Override
                            public void afterTextChanged(Editable s) {
                                // TODO Auto-generated method stub
                    
                            }
                        });
                    

                    【讨论】:

                      【解决方案13】:

                      如果有人想知道这里是 kotlin 版本的代码

                      editText1.addTextChangedListener(object: TextWatcher {
                              override fun onTextChanged(s:CharSequence, start:Int, before:Int, count:Int) {
                                  if (s.toString().trim({ it <= ' ' }).isEmpty())
                                  {
                                      button.setEnabled(false)
                                  }
                                  else
                                  {
                                      button.setEnabled(true)
                                  }
                              }
                              override fun beforeTextChanged(s:CharSequence, start:Int, count:Int,
                                                    after:Int) {
                                  // TODO Auto-generated method stub
                              }
                              override fun afterTextChanged(s: Editable) {
                                  // TODO Auto-generated method stub
                              }
                          })
                      

                      【讨论】:

                      • 如果我是对的 s.toString().trim({ it &lt;= ' ' }).isEmpty()s.isBlank() 相同。在这种情况下,onTextChanged 可以简化为:button.isEnabled = s.isBlank()
                      【解决方案14】:

                      与最受接受的答案相同,但简化了。请记住将条件包装在 () 中,以便它使用布尔值。

                      editText1.addTextChangedListener(new TextWatcher() {
                      
                          @Override
                          public void onTextChanged(CharSequence s, int start, int before, int count) {
                               button.setEnabled((s.toString().trim().length()>0));     
                          }
                      
                          @Override
                          public void beforeTextChanged(CharSequence s, int start, int count,
                                  int after) {
                              // TODO Auto-generated method stub
                      
                          }
                      
                          @Override
                          public void afterTextChanged(Editable s) {
                              // TODO Auto-generated method stub
                      
                          }
                      });
                      

                      【讨论】:

                        猜你喜欢
                        • 2018-11-06
                        • 1970-01-01
                        • 2014-05-27
                        • 1970-01-01
                        • 1970-01-01
                        • 2018-12-07
                        • 2019-07-10
                        • 1970-01-01
                        相关资源
                        最近更新 更多