LoginSignup
3
3

More than 5 years have passed since last update.

ネストしたデータをresourceで管理する

Last updated at Posted at 2018-05-19

 概要

AndroidでDBで管理するほどでもないマスタデータなどをresourceで管理する方法メモ

JSONで書くと以下のようなデータをresourceで管理する

{
  "menu": {
    "food": [
      "Samdwich",
      "Hot dog",
      "Salad",
      "Donuts"
    ],
    "drink": [
      "Coffee",
      "Tea",
      "Coke",
      "Water"
    ]
  }
}

実装

res 配下に以下のようなarrays.xmlを作成する
ネストしたデータを記述するには、itemに@array/**でidを指定する

arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <array name="menu">
        <item>@array/food_menu</item>
        <item>@array/drink_menu</item>
    </array>

    <array name="food_menu">
        <item>food</item>
        <item>@array/food_array</item>
    </array>

    <array name="drink_menu">
        <item>drink</item>
        <item>@array/drink_array</item>
    </array>

    <string-array name="food_array">
        <item>Sandwich</item>
        <item>Hot dog</item>
        <item>Salad</item>
        <item>Donuts</item>
    </string-array>

    <string-array name="drink_array">
        <item>Coffee</item>
        <item>Tea</item>
        <item>Coke</item>
        <item>Water</item>
    </string-array>
</resources>

Kotlinでresourceファイルからデータを読み込むサンプル

MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        loadMenu()
    }

    private fun loadMenu() {
        val tag = "Sample"
        // <array name="menu">のデータを読み込む
        val menus = resources.obtainTypedArray(R.array.menu)

        // 0番目がメニューの名前で、1番目がメニュー配列のResourceID
        @StyleableRes val nameIndex = 0
        @StyleableRes val arrayIndex = 1

        for (i in 0 until menus.length()) {
            // @array/*_menu のResourceIdを取得
            val menuId = menus.getResourceId(i, -1)
            if (menuId < 0) {
                break
            }
            // @array/*_arrayを読み込む
            val menu = resources.obtainTypedArray(menuId)

            // 1番目のメニュー配列のResourceIDを取得
            val arrayId = menu.getResourceId(arrayIndex, -1)
            if (arrayId < 0) {
                menu.recycle()
                break
            }
            // メニュー配列取得
            val array = resources.obtainTypedArray(arrayId)

            // 出力
            Log.d(tag, menu.getString(nameIndex))
            for (j in 0 until array.length()) {
                Log.d(tag, " └── " + array.getString(j))
            }

            menu.recycle()
            array.recycle()
        }
        menus.recycle()
    }
}

ログ

05-19 05:44:01.973 5423-5423/com.github.bassaer.nestarrayapp D/Sample: food
05-19 05:44:01.973 5423-5423/com.github.bassaer.nestarrayapp D/Sample:  └── Sandwich
05-19 05:44:01.973 5423-5423/com.github.bassaer.nestarrayapp D/Sample:  └── Hot dog
05-19 05:44:01.973 5423-5423/com.github.bassaer.nestarrayapp D/Sample:  └── Salad
05-19 05:44:01.973 5423-5423/com.github.bassaer.nestarrayapp D/Sample:  └── Donuts
05-19 05:44:01.974 5423-5423/com.github.bassaer.nestarrayapp D/Sample: drink
05-19 05:44:01.974 5423-5423/com.github.bassaer.nestarrayapp D/Sample:  └── Coffee
05-19 05:44:01.974 5423-5423/com.github.bassaer.nestarrayapp D/Sample:  └── Tea
05-19 05:44:01.974 5423-5423/com.github.bassaer.nestarrayapp D/Sample:  └── Coke
05-19 05:44:01.974 5423-5423/com.github.bassaer.nestarrayapp D/Sample:  └── Water

サンプル

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3