【Kotlin】リソースを利用したプログラムの書き方を覚えよう


はじめに

Kotlinをはじめ、Androidのプログラミングにおいて文字列や数値、色などは直接指定せずにリソースに置いた物を参照する方法がよいとされています。

デザインレイアウトのプロパティ群に関してはリソースを参照した書き方にしないと警告が出ますが、プログラム上では警告が出ないこともあり直接値を書いている人も多いでしょう。

どちらが良いかは設計する人に任せるとして、ともかくリソースを利用したプログラムの書き方を覚えてみましょう。
使うか使わないかはあなた次第です。

レイアウトなどにリソースを使用する方法は下記を参考にして下さい。
参照

リソースとは

リソースとはプログラムとは区別されていて、様々な値を管理している部分になります。
プロジェクト上ではプログラム関係がjavaの下に配置されているのに対してresの下に配置されているのがリソースです。

strings.xmlがあるのもここですね。

文字列

リソースに文字列を指定して、これを参照しましょう。
res > values > strings.xml が文字列を指定するリソースになります。

strings.xml
 <string name="btStart">開始</string>

レイアウト設計をするときの textの値として @string/btStart

と指定すれば btStrt は値として 開始 を参照することになります。
ではプログラムから参照する場合はどうすればよいのでしょうか?

まずはリソースIDを取得してみましょう

sample.kt
  val id = R.string.btStart

リソースIDはリソースごとに異なる番号が割り当てられており、これを利用してリソースの値を取得する事が出来ます。

sample.kt
  val id = R.string.btStart
  val str = resources.getString(id)

1行で書くと

sample.kt
  val str = resources.getString(R.string.btStart)

文字列の配列

同様に文字列の配列も取得してみましょう

strings.xml
<?xml version="1.0" encoding="utf-8" ?>
<resources>
    <string-array name="lvEntries">
        <item>1個目</item>
        <item>2個目</item>
        <item>3個目</item>
    </string-array>
</resources>

参照する場合は

sample.kt
  val lvEntries = resources.getStringArray(R.array.lvEntrys)
 // 1個目 
 lvEntries[0]

このようになります。

数値

今度は数値です。

strings.xml
<resources>
   <integer name="intSampleValue">123</integer>
</resources>
sample.kt
  val i =  resources.getInteger(R.integer.intSampleValue)

文字列はstring.xmlに書いていましたが、色はvalues の直下に colors.xml を作成してそこに記述するのが一般的のようです。

colors.xml
<resources>
   <color name="colorSample">#FF0000</color>
</resources>
sample.kt
   // MainActivityの場合
   val col = getColor(R.color.colorSample)
   // フラグメントの場合
   val col = context!!.getColor(R.color.colorSample)

MainActivi以外で使用する場合

MainActivityにプログラムを書く場合はresourcesが定義されているので、これを参照できるのですがクラスやフラグメントに各場合は使えません。その場合は

sample.kt
  val res = context!!.resources
  val i =  res.getInteger(R.integer.intSampleValue)

コンテンツオブジェクト内にリソースがありますのでそれを参照して下さい。

終わりに

残念ながらリソースを使用した方がソース量が増えます。
しかし頻繁に変更する可能性がある値は、プログラム上にあるよりもリソース上にあった方が修正が楽なのは明白です。
出来る部分だけでも良いので、少しずつリソース化してみるのはいかがでしょうか?