最近kotlinでandroidアプリの勉強を初めて上記のエラー遭遇しました。この記事ではこのエラーの原因と解決方法を解説します。
原因
下記のコードの24行目に関して、以下のエラーが出力されていました。
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mysize/com.example.mysize.HeightActivity}: android.content.res.Resources$NotFoundException: String resource ID #0xa0
class HeightActivity : AppCompatActivity() {
public lateinit var mHeight: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_height)
// 身長のデフォルト値をセット
this.mHeight = findViewById(R.id.height)
var pref: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
val height: Int = pref.getInt(HEIGHT, 160)
this.mHeight.setText(height)
// 省略
エラー文の意味は「リソースIDがa0(10進数で160)のリソースが見つかりません。」になります。
24行目を見てみると、TextViewのsetTextにInt型の変数を渡しています。この場合、渡された値をリソースIDとみなして、対応するリソースの値をセットしようとします。今回heightの値が160(16進数でa0)で該当するリソースがないのでエラーになっています。
Int型のheighをそのまま文字列として表示してくれると思ってましたが、これが間違いでした。
解決方法
今回やりたいことはheightを文字列としてそのまま表示することです。
setTextにString型の値を渡すと、それをそのまま表示してくれるのでheightをtoStringでStringに変換すれば、エラーが出なくなりました。
もし、たまたまリソースIDが160(16進数でa0)のリソースが存在すると、意図しない値がセットされるので、setTextに渡す値の型をきちんと意識しないといけないです。
class HeightActivity : AppCompatActivity() {
public lateinit var mHeight: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_height)
// 身長のデフォルト値をセット
this.mHeight = findViewById(R.id.height)
var pref: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
val height: Int = pref.getInt(HEIGHT, 160)
this.mHeight.setText(height.toString())
// 省略
まとめ
- 「android.content.res.Resources$NotFoundException」はリソースが見つからない場合のエラー
- setTextはInt型を渡すとそれをリソースIDとみなして、対応するリソースの値をセットする
- setTextはString型を渡すとその値をそのままセットする
おすすめ書籍
リンク
リンク