【Android】android.content.res.Resources$NotFoundExceptionの解決方法

Android開発
この記事は約4分で読めます。

最近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型を渡すとその値をそのままセットする

おすすめ書籍

タイトルとURLをコピーしました