EditText为空时getText()返回值?判断为空失效原因咨询
问题1:空EditText调用getText()会返回什么?
当EditText没有输入任何内容时,调用getText()不会返回null,它会返回一个长度为0的Editable对象(实现了CharSequence接口)。这个对象本质上是一个空的字符序列,只是没有包含任何可见或不可见的字符。
问题2:为什么之前的空值判断失效,而isEmpty()有效?
咱们逐个拆解你试过的判断方式,看看问题出在哪:
text == null:完全不可能生效。因为getText()不会返回null,调用它的toString()方法也永远不会得到null值——哪怕EditText是空的,toString()也会返回一个空字符串对象(""),所以这个判断条件永远为false,程序必然走else分支。text == "":这是字符串的引用比较,而不是内容比较。在Java/Android中,""是字符串常量池里的对象,而EditText.getText().toString()返回的空字符串可能是一个新创建的对象(虽然有时候会复用常量池,但绝对不能依赖这个特性)。两个对象的引用地址不一样,所以==判断会返回false,自然进不了if分支。text.equals(null):equals()方法的规范是,当传入的参数为null时,直接返回false。所以这个条件永远不会成立,根本没法触发你要的逻辑。text.equals(""):理论上如果EditText真的是空的,这个判断应该生效。但如果它没生效,大概率是你的EditText里存在不可见的空白字符(比如空格、制表符、换行符)——这些字符肉眼看不到,但会让字符串内容不是严格的"",导致equals("")返回false。而isEmpty()是直接判断字符串的长度是否为0,是更简洁可靠的空值判断方式,和text.length() == 0效果一致。
总结一下:判断EditText内容是否为空,最稳妥的方式是先拿到字符串,然后用isEmpty();如果需要排除空白字符的干扰,可以用trim().isEmpty()。
内容的提问来源于stack exchange,提问作者tal itshak

