【问题标题】:Android EditText setError() doesn't work as expectedAndroid EditText setError() 无法按预期工作
【发布时间】:2023-03-05 12:49:01
【问题描述】:

我在EditText 上遇到了setError() 的问题。打开活动时,它会检查某些字段是否为空,如果为真,则在其上设置错误消息。但是,感叹号图标仅在我在字段中写入一些文本然后删除它的情况下才会显示。如果我失去对该领域的关注,该图标将再次消失。 Naam 和 Telefonnumer 两个字段都有此验证。

我使用的是 Android 2.2.2 SDK,该应用程序在 Nexus 7 上运行,并提供最新更新。

我有 Util 类:

public class Util {

    private static String TAG = "Util Class";

    public static boolean editTextIsEmpty(EditText edittext) {
        if (edittext.getText().toString().trim().length() < 1)
            return true;
        else
            return false;
    }

    public void editTextListener(final EditText editText) {
        editText.addTextChangedListener(new TextWatcher() {

            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                if (editTextIsEmpty(editText) && editText.isEnabled())
                    editText.setError("Nodig");
                else
                    editText.setError(null);
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (editTextIsEmpty(editText) && editText.isEnabled())
                    editText.setError("Nodig");
                else
                    editText.setError(null);
            }
        });
    }
}

然后我的活动中有validateInput() 方法:

public class DeliveryActivity extends BaseActivity {

    private ImageButton btnSetDate;

    private Button btnToSummary;
    private Button btnSearchAddress;

    private EditText txtPostcode;
    private EditText txtHouseNumber;
    private EditText txtHouseNumberSuffix;
    private EditText txtStreet;
    private EditText txtCity;
    private EditText txtDeliveryDate;
    private EditText txtName;
    private EditText txtPhone;
    private EditText txtEmail;
    private EditText txtRemark;

    private TextView lblExtraDeliveryInfo;

    private Spinner spinnerDelivery;
    private Spinner spinnerDeliveryPeriod;
    private Spinner spinnerContact;
    private Spinner spinnerDeliveryAddress;
    private Spinner spinnerExtraDeliveryInfo;

    private RelativeLayout rlDeliveryAddressDetails;

    private DevRestHelper additionalDeliveryInfo;
    private DevRestHelper searchClientAddress;

    private Util util = new Util();

    private int year;
    private int month;
    private int day;

    public static final int DIALOG_DATEPICKER = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_delivery);

        initControls();

        validateInput();
    }

    private void initControls() {
        btnSetDate = (ImageButton) findViewById(R.id.activity_delivery_btnCalendar);

        btnToSummary = (Button) findViewById(R.id.activity_delivery_btnSummary);
        btnSearchAddress = (Button) findViewById(R.id.activity_delivery_btnSearchAddress);

        spinnerDelivery = (Spinner) findViewById(R.id.activity_delivery_spinnerDeliveryMethod);
        spinnerDeliveryPeriod = (Spinner) findViewById(R.id.activity_delivery_spinnerDeliveryPeriod);
        spinnerContact = (Spinner) findViewById(R.id.activity_delivery_spinnerContactperson);
        spinnerDeliveryAddress = (Spinner) findViewById(R.id.activity_delivery_spinnerDeliveryAddress);
        spinnerExtraDeliveryInfo = (Spinner) findViewById(R.id.activity_delivery_spinnerExtraDeliveryInformation);

        txtPostcode = (EditText) findViewById(R.id.activity_delivery_txtPostcode);
        txtHouseNumber = (EditText) findViewById(R.id.activity_delivery_txtHousenumber);
        txtHouseNumberSuffix = (EditText) findViewById(R.id.activity_delivery_txtHousenumberSuffix);
        txtStreet = (EditText) findViewById(R.id.activity_delivery_txtStreet);
        txtCity = (EditText) findViewById(R.id.activity_delivery_txtCity);
        txtDeliveryDate = (EditText) findViewById(R.id.activity_delivery_txtDeliveryDate);
        txtName = (EditText) findViewById(R.id.activity_delivery_txtName);
        txtPhone = (EditText) findViewById(R.id.activity_delivery_txtPhone);
        txtEmail = (EditText) findViewById(R.id.activity_delivery_txtEmail);
        txtRemark = (EditText) findViewById(R.id.activity_delivery_txtRemark);

        lblExtraDeliveryInfo = (TextView) findViewById(R.id.activity_delivery_lblExtraDetailInformation);

        rlDeliveryAddressDetails = (RelativeLayout) findViewById(R.id.activity_delivery_rlDeliveryAddressDetails);
    }

    private void validateInput() {
        util.editTextListener(txtPostcode);
        util.editTextListener(txtHouseNumber);
        util.editTextListener(txtDeliveryDate);
    }
}

我只想说代码可以在 BlueStacks 模拟器上运行。

【问题讨论】:

  • 你试过editText.setError(" ");而不是editText.setError(null);?
  • 您的问题不清楚...详细说明您的问题...您是否对所有 EditTexts 使用相同的 TextWatcher?
  • @imrankhan 是的,我已经尝试过,但它不起作用。

标签: android validation android-edittext textwatcher


【解决方案1】:

试试这个

new TextWatcher() {

    @Override
    public void afterTextChanged(Editable s) {
        if (editTextIsEmpty(editText) && editText.isEnabled())
            editText.setError("Nodig");
        else
            editText.setError(null);
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        // nothing here
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        // nothing here
    }

}

【讨论】:

  • 这将有相同的结果,只是它会在文本更改后触发,但我实际上需要在文本更改之前和之后。
  • 确保在EditText 为空时处理按下的删除键:stackoverflow.com/a/13983097/832776
【解决方案2】:

Jelly Bean_MR1(4.2 和 4.2.1)上的 setError 存在一个已知错误。但是,我假设您正在测试的 Nexus 7 正在运行这些版本的 Android 之一。见这里:http://code.google.com/p/android/issues/detail?id=40417

当您专注于该 EditText 字段时将显示错误,但当您失去焦点时,错误图标将不可见以通知用户该问题。

【讨论】:

  • 非常感谢您的澄清。
【解决方案3】:

您可以使用以下代码:

希望对你有帮助:

mPopupInlineErrorBackgroundId = getResourceId(mPopupInlineErrorBackgroundId,
                    com.android.internal.R.styleable.Theme_errorMessageBackground);
mView.setBackgroundResource(mPopupInlineErrorBackgroundId);

但是,您可以使用重载的setError(CharSequence, Drawable) 设置跨区和自定义错误图标。

您可以使用 fromHtml() 从 HTML 轻松创建 Spanned。

例如:

yourEditText.setError(Html.fromHtml("<font color='blue'>this is the error</font>"));

【讨论】:

    【解决方案4】:

    这是你唯一需要在 TextView 上获得预期的 setError 行为

    android:focusable="true"
    android:clickable="true"
    android:focusableInTouchMode="true"
    

    【讨论】:

      【解决方案5】:

      在任何视图或编辑文本上设置错误之前,只需调用

      yourEditText.requestFocus();
      yourEditText.setError("Your Error Message");
      

      然后设置错误。它会解决你的问题。至少我的做到了。

      【讨论】:

        猜你喜欢
        • 2016-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-21
        • 1970-01-01
        • 2023-03-19
        相关资源
        最近更新 更多