Android
StackOverflow
AndroidStudio
NULL

【Android/EditText】入力or未入力の判定に !=null は使えない

More than 1 year has passed since last update.

はじめに

意外にも解決に時間がかかりながらも自分なりに理解して解決したので、メモをしておきます。開発歴が浅いので理解が及んでないところも多々あると思いますので、指摘していただけるとありがたいです。

追記項目
タイトルを一部変更しました。
第5項目を「追記」から「いろいろ」に変更し、第6項目を「追記」にしました。
また1つ目の解決法について不備が見つかりました。一度訂正し検証します。(2016/4/16 17:02)
==> 解消しました!(追記 2016/4/16 18:19)

izumin5210 さんより、TextUtils.isEmptyを教えていただきました。この場で紹介させていただきます。

目次

  1. 悩んだ背景
  2. 解決
  3. 考察
    • 1つ目の解決法についての考察(不備あり)
    • 2つ目の解決法についての考察
  4. 参考元
  5. いろいろ
  6. 追記
  7. ひとりごと

1. 悩んだ背景

SQLiteの勉強をしようと、サイトを参考にしてAndroidアプリを作ったが、新しく条件式として「EditTextに入力された文字列が入力か未入力か」を追加した際に、

MainActivity(変更前).java
.
.
final EditText nameText = (EditText)findViewById(...);
final EditText ageText = (EditText)findViewById(...) 
String name = nameText.getText().toString();     // 入力文字の取得
String age = ageText.getText().toString();

if(name != null && age != null){ 
// ここを条件式として新しく追加
(処理部分)
}
.
.

という条件式を書いて、正しく動作しなかった。

アプリを作る際に参考にしたサイトはこちら

2. 解決

問題は以下の2つのようにして解決しました。

MainActivity(変更後-1).java
if(nameText.getText().toString().equals("") == false && ageText.getText().toString().equals("") == false){
(処理部分)
// 不備からの変更点
// .equals()の なかの””に出来ていた半角の空欄を削除。また ”== false”がどちらにも抜けていたので補完。
// git の履歴にはどちらも正しく実装されてるものが残ってたんだけどなぁ...
}

もしくは

MainActivity(変更後-2).java
if(name.length() != 0 && age.length() != 0){
(処理部分)   // とても簡単!!
}

3. 考察

1つ目の解決法についての考察

stackoverflow で参考になる回答がありました。
参考元はこちらのStinePikeの回答

getText() will not return null. So there is no chance for NPE in following method. the getText will return empty string if there is no string, which is definitely not null

getText().toString();

However the EditText itself can be null if not initialized properly, Hence the following will trigger NPE

editText.getText().toString();

※ NPE == NullPointerException

つまり、getText()そのものはnullを返さないがEditTextはnullを返し得るので、nullを返す為にEditTextのメソッドとしてgetText()を使うことはできない、ということと理解しました。

2つ目の解決法についての考察

こちらはandroidでjavaのコードが使えることからできる手法。というかこっちのほうが簡単ですね。androidの形式で解決できないか悩みすぎて、本来のjavaで書けることをすっかり忘れてました。

4. 参考元

EditText の null 判定 方法
SQLITEデータベースの基礎を理解できるANDROIDサンプルアプリ
Java/Android Programming / EditText -> getText().toString()
Does EditText.getText() ever returns null?

5. いろいろ

参考元のJava/Android Programming / EditText -> getText().toString()にあるNambariの回答が気になったのでまた調べようと思います。

one issue is:

if (textedit.getText().toString() == "abc")

should be

if (textedit.getText().toString().equals("abc") )

even better:

if ("abc".equals(textedit.getText().toString()))

It is always better to use equals() while comparing String/Objects instead of using ==

== checks for reference equality. equals() check for content equality.

6. 追記(2016/4/16)

izumin5210さんより、TextUtils.isEmptyを教えていただきました。この場で紹介いたします。

Androidのリファレンスによれば、

public static boolean isEmpty (CharSequence str)
Returns true if the string is null or 0-length.

なんと、考えてた nulllength() != 0 もできちゃう。
なのでさっきのif文の条件を

MainActivity.java
if(TextUtils.isEmpty(name) == false && TextUtils.isEmpty(age) == false){
(処理部分)
}

実はもう少し簡単にかけて、

MainActivity.java
if(!TextUtils.isEmpty(name) && !TextUtils.isEmpty(age)){
(処理部分)
}

というふうに、! マークをつけるだけでok。1つ目の解決法にも同じやりかたが可能(実は、!マークを書くやり方はAndroidStudioの補完機能で知りました)

7. ひとりごと

初投稿で緊張したのと、解決法が実は上手くいってなかった情けなさと、初投稿にコメントとアドバイスを頂いたうれしさとがいっぺんにきて、すごく新鮮な気持ちです。これからも気がついたことはメモしていきます。