logo サブスレッド

Androidの文字列操作用 便利クラス TextUtils について

あけましておめでとうございます

久々の更新となってしまいました。
金曜担当のしみずです。本年もどうぞよろしくお願いいたします。

早いもので、また1つ年が明けました。
子供の頃は1年がもっと長かったような気がするのですが、年を取ると生きてきた期間に対して
相対的に1年が短くなるので、短く感じるのだと思っています。

社内では、物理的に本当に昔より1年が短くなっているのでは?という話も上がりましたが
なんかうまく返しの言葉が見つからなくて、今年1年、不安でいっぱいでございます。

ということで、新年一発目のネタは Android の TextUtils クラスについて書こうと思います。

TextUtils クラスとは

Java の String クラスでは痒い所に手がとどかない事がしばしばあります。
そんなときに Android の TextUtils (android.text.TextUtils) を使うと解決できるかもしれません。
TextUtils を使えば、文字列がnullまたは空文字かどうかを判断できます。
TextUtils を使えば、文字列の配列を、指定した区切り文字で繋げることができます。
そう、TextUtils ならね。

文字列配列を指定文字列で区切る join()

String[] src = ["abc", "def", "ghi"];
String result = TextUtils.join("-", src);
// result => "abc-def-ghi"

join は色々な言語でありますね。
Java8 では String クラスに join() が追加されたようですが、Android7.0(API LEVEL24) 以降でないと Java8 は使えないようです。
なので、基本的には TextUtils#join() を使っておけば良いですね。

配列以外にも、Iterable も引数として指定できるので ArrayList とかでも大丈夫ですね!

null または 空文字を判定する isEmpty()

String text1 = "abc";
boolean result1 = TextUtils.isEmpty(text1);
// result1 => false

String text2 = "";
boolean result2 = TextUtils.isEmpty(text);
// result2 => true

String text3 = null;
boolean result3 = TextUtils.isEmpty(text);
// result3 => true

null または空文字かどうかを判定する機会はしばしばあります。
そういうときに、コレを使うと非常に便利です。
これが無いとnullチェックをした後に空文字のチェックが必要になります。
TextUtils#isEmpty() 積極的に使っていきましょう。

単純に文字列を繋げる concat()

String result = TextUtils.concat("abc", "def", "ghi");
// result => "abcdefghi"

プラス(+)で繋げても良いですが、内部的にStringBuilderを使っているようです。
長い文字列に対して + で繋げると、処理に時間がかかってしまう端末が過去にあったので
文字列を繋げるには、メリットはあるかもしれません。

また、SpannableString を使っている場合、+ では連結できないので
これで連結すればOKです。

文字列が数字のみで構成されているかどうかを調べる isDigitsOnly()

boolean result1 = TextUtils.isDigitsOnly("12345");
// result1 => true

boolean result2 = TextUtils.isDigitsOnly("12345");
// result2 => true

boolean result3 = TextUtils.isDigitsOnly("12345");
// result3 => true

boolean result4 = TextUtils.isDigitsOnly("12345a");
// result4 => false

boolean result5 = TextUtils.isDigitsOnly("abcde");
// result5 => false

boolean result6 = TextUtils.isDigitsOnly("1.2345");
// result6 => false

数字のみで構成されている場合 true が返ります。
驚くことに全角でも true となるようです。

使い所としては、数値を入力させたい場面で、TextUtils#isDigitsOnly() でチェック。
true だった場合は、全角の1から9を半角に置換する処理を入れれば全角の数字も許容できる処理が書ける感じかな。

HTMLエンコードを行う htmlEncode()

String result = TextUtils.htmlEncode("<html>");
// result => "&lt;html&gt;"

“<” が “&lt;”
”>” が “&gt;”
になってますね!

同じ文字列かどうか比較する equals()

boolean result1 = TextUtils.equals("abc", "abc");
// result1 => true

boolean result2 = TextUtils.equals("abc", "def");
// result2 => false

boolean result3 = TextUtils.equals("abc", null);
// result3 => false

boolean result4 = TextUtils.equals(null, null);
// result4 => true

boolean result5 = TextUtils.equals("abc", "abc");
// result5 => false

String#equals() を使っても良いですが、元がnullだった場合は NullPointerException が発生してしまいます。
これだと null でも大丈夫なので、null の可能性がある変数を比較したい場合は、TextUtils#equals() を使うのが良いですね!

ちなみに、null 同士を比較した場合は true が返るので、それでは困る場合は別に判定処理を入れないといけません。
注意が必要ですね。

おわりに

使いそうな TextUtils のメソッドを紹介しました。
他にもあるのですが、使い所が分からなかったりするものもあるので、ひとまずこれだけで。

また今年1年、頑張っていきますのでよろしくお願いいたします。

現在の位置:サブスレッド ホーム > 技術ブログ > Androidの文字列操作用 便利クラス TextUtils について