【问题标题】:How to catch the value of string on a EditText?如何在 EditText 上捕获字符串的值?
【发布时间】:2015-09-17 18:21:32
【问题描述】:

我正在登录,其中包含用户代码和密码。然后,当这些字段完成时,有一个“登录”按钮被设置。启用(假),它将被设置。启用(真)允许访问(我这样做是为了避免一致性测试)。

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final EditText codigo;
    final TextView nome;
    final EditText senha;

    codigo = (EditText) findViewById(R.id.cod_edit_text);
    senha = (EditText)findViewById(R.id.senha_edit_text);

    String cod = codigo.getEditableText().toString();
    String password = senha.getEditableText().toString();

    final Button botaologar = (Button) findViewById(R.id.button_logar);
    if(!cod.isEmpty() || !password.isEmpty())
    {
        botaologar.setClickable(true);
        botaologar.setEnabled(true);
    }
    else
    {
        botaologar.setEnabled(false);
        botaologar.setClickable(false);
    }

但是,当我捕获 EditText 的字符串时,由于某种原因它是空的,并且按钮仍然设置。启用(假)。

然后,我注意到,当我在 activity_main.xml 的 XML 上命名时,在 string.XML 上带有一些值的字符串,按钮保持 set.Enabled(true),但该值出现在 EditText 上,其值为字符串.xml。看:

文件activity_main.xml:

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:ems="10"

    android:text="@string/cod_edit_text"

    android:id="@+id/cod_edit_text"
    android:layout_below="@+id/codigo_text_view"
    android:layout_alignParentStart="true"
    android:layout_alignParentEnd="true" />
<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="textPassword"
    android:ems="10"
    android:id="@+id/senha_edit_text"

    android:text="@string/senha_edit_text"

    style="@style/AppTheme"
    android:password="true"
    android:layout_alignParentEnd="true"
    android:layout_alignParentStart="true"
    android:layout_below="@+id/senha_text_view"
    android:layout_alignParentLeft="true" />

文件字符串.xml:

<string name="cod_edit_text"> test </string>
<string name="senha_edit_text"> test  </string>

所以,问题是我不能让按钮保持 .setEnabled(true) 因为我不能正确地获取 EditText 的值。有解决问题的办法吗?

【问题讨论】:

  • 您是否使用过TextWatcher 在您的edittext 上收听文本编辑事件?从您的代码来看,if-else 似乎只在活动创建时执行.. 永远不会在您输入时执行
  • 另外,我具体不知道 getEditableText() 是做什么的,但通常 getText() 用于获取内容
  • 您显示的代码适用于您的 onCreate(...) 方法,该方法仅在创建 Activity 并且之前您的用户甚至有机会进入时调用一次任何文字。

标签: java android xml string android-edittext


【解决方案1】:

使用 TextWatcher

示例

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {
private EditText passwordEditText;
private TextView textView;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    /* Initializing views */
    passwordEditText = (EditText) findViewById(R.id.password);
    textView = (TextView) findViewById(R.id.passwordHint);
    textView.setVisibility(View.GONE);

    /* Set Text Watcher listener */
    passwordEditText.addTextChangedListener(passwordWatcher);
 }

 private final TextWatcher passwordWatcher = new TextWatcher() {
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    public void onTextChanged(CharSequence s, int start, int before, int count) {
        textView.setVisibility(View.VISIBLE);
    }

    public void afterTextChanged(Editable s) {
        if (s.length() == 0) {
            textView.setVisibility(View.GONE);
        } else{
            textView.setText("You have entered : " + passwordEditText.getText());
        }
    }
 };
}

您始终可以启用或禁用 TextWatcher 的 beforeTextChanged 或 afterTextChanged 中的按钮。根据您的要求。

【讨论】:

    【解决方案2】:

    也许有更好的方法,但您绝对可以使用一两个 TextWatcher 来更新,只要有更改和/或字符串不为空:

    codigo.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) {
            cod = s.toString();
            if(!cod.isEmpty() || !password.isEmpty())
            {
                botaologar.setClickable(true);
                botaologar.setEnabled(true);
            }
            else
            {
                botaologar.setEnabled(false);
                botaologar.setClickable(false);
            }
        }
    
        @Override
        public void afterTextChanged(Editable s) {
    
        }
    });
    

    密码的editText也是如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      • 1970-01-01
      • 2012-12-13
      • 2015-09-10
      相关资源
      最近更新 更多