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

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

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

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

# 目次
1. 悩んだ背景
2. 解決
3. 考察
   * １つ目の解決法についての考察（不備あり）
   * ２つ目の解決法についての考察
4. 参考元
5. いろいろ
6. 追記
7. ひとりごと

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

```Java: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){ 
//　ここを条件式として新しく追加
(処理部分)
}
.
.
```
という条件式を書いて、正しく動作しなかった。

アプリを作る際に参考にしたサイトは[こちら](http://www.sakc.jp/blog/archives/21645)。

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

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

もしくは

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

# 3. 考察
## １つ目の解決法についての考察
stackoverflow で参考になる回答がありました。
参考元は[こちら](http://stackoverflow.com/questions/19590472/does-edittext-gettext-ever-returns-null)の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()を使うことはできない、ということと理解しました。


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


# 4. 参考元

[EditText の null 判定 方法](http://www.android-navi.com/archives/android_1/edittext_null/)
[SQLITEデータベースの基礎を理解できるANDROIDサンプルアプリ](http://www.sakc.jp/blog/archives/21645)
[Java/Android Programming / EditText -> getText().toString()](http://stackoverflow.com/questions/14265553/java-android-programming-edittext-gettext-tostring)
[Does EditText.getText() ever returns null?](http://stackoverflow.com/questions/19590472/does-edittext-gettext-ever-returns-null)

#5. いろいろ
参考元の[Java/Android Programming / EditText -> getText().toString()](http://stackoverflow.com/questions/14265553/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.

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

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

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

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

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


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