EditableとR.stringとStringの区別がついてなかった話

最近はAndroidStudioなんかちょくちょく触ってみたりしているのですが、その時にハマったお話をさせていただきます。

入力フォーム(EditText)に入力した文字列がstrings.xmlに記述した文字列にマッチしたら処理を進めるようなプログラムが書きたくて、次のように記述しました。

final EditText edit = (EditText)findViewById(R.id.edit);
if(edit.getText().equals(R.string.password)){
  //処理を続ける
}

これでできるんじゃないかと思ったんですが、左辺と右辺のタイプが違うというメッセージがでるのです。

調べてみると僕の認識に誤りがあったようで、getTextというメソッドは当然戻り値はStringなのだろうと思っていたのですが、実は戻り値はEditableというクラスだったようです。なので、EditableのtoStringメソッド(正確にはCharSequenceクラスから継承している)を使ってStringにしてやらなければなりません。

さらに、R.string.~の内容も実はint型のIDであってStringではないので、getStringというメソッドを使ってStringにしてやらなければなりません。

最終的にこういう記述になりました。

final EditText edit =(EditText)findViewById(R.id.edit);
if(edit.getText().toString().equals(getString(R.string.password)){
  //処理を続ける
}