前回までの状況はこちら。
最新ソースはこちら(gitHub)
https://github.com/takishita2nd/AroundHokkaido
さて、前回作成したJsonファイルを、実際にAndroidアプリに読み込ませるのですが、
こちらの記事を参考にさせて頂きました。
https://qiita.com/Bluewind1997/items/c3f8e90e9fb19f47daee
assetsフォルダを作成して、その下にJsonファイルを作成して設置します。
あとはassetManagerを介せば、そのJsonファイルにアクセス出来ます。
ただ、assetManagerが使えるのはMainActivityだけ。
Androidのプログラミングでは、このMainActivityが重要でして、
Androidに関する重要な処理は、このMainActivityが無ければ使用できません。
なので、どこからでもMainActivityを使用できるように、シングルトンにしてしまえば良いのではと思いましたが、
Kotlinにはシングルトン(というか、staticクラス)という概念がないので、
ここだけJavaで書きました。
package com.takilab.aroundhokkaido;
import androidx.appcompat.app.AppCompatActivity;
public class SingletonActivity {
private static AppCompatActivity _activity;
public static void SetActivity(AppCompatActivity activity) {
_activity = activity;
}
public static AppCompatActivity GetActivity(){
return _activity;
}
}
JavaとKotlinは混在できるんですね。
実際の開発現場では、どのようにMainActivityを扱っているんですかね?
このMainActivityを使ってJsonの読み出し。
package com.takilab.aroundhokkaido
class City(city: String, distance: Double) {
val city: String = city
val distance: Double = distance
}
package com.takilab.aroundhokkaido
import org.json.JSONException
import org.json.JSONObject
import java.io.BufferedReader
import java.io.InputStreamReader
class CityList {
val cityList: ArrayList<City> = ArrayList()
init{
val activity: MainActivity = SingletonActivity.GetActivity() as MainActivity
val assetManager = activity.resources.assets //アセット呼び出し
val inputStream = assetManager.open("AroundHokkaido.json") //Jsonファイル
val bufferedReader = BufferedReader(InputStreamReader(inputStream))
val str: String = bufferedReader.readText() //データ
try {
val jsonObject = JSONObject(str)
val jsonArray = jsonObject.getJSONArray("list")
for (i in 0 until jsonArray.length()) {
val jsonData = jsonArray.getJSONObject(i)
val city: City = City(jsonData.getString("city"), jsonData.getDouble("distance"))
cityList.add(city)
}
} catch (e: JSONException) {
e.printStackTrace()
}
}
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
SingletonActivity.SetActivity(this);
val cityList = CityList()
for (city in cityList.cityList) {
Log.d("Check", "${city.city} : ${city.distance}")
}
2020-08-07 09:02:07.564 6520-6520/com.takilab.aroundhokkaido D/Check: 札幌 : 35.9
2020-08-07 09:02:07.564 6520-6520/com.takilab.aroundhokkaido D/Check: 小樽 : 20.1
2020-08-07 09:02:07.564 6520-6520/com.takilab.aroundhokkaido D/Check: 余市 : 15.9
2020-08-07 09:02:07.564 6520-6520/com.takilab.aroundhokkaido D/Check: 古平 : 6.4
2020-08-07 09:02:07.564 6520-6520/com.takilab.aroundhokkaido D/Check: 積丹 : 49.0
2020-08-07 09:02:07.564 6520-6520/com.takilab.aroundhokkaido D/Check: 神恵内 : 6.3
2020-08-07 09:02:07.564 6520-6520/com.takilab.aroundhokkaido D/Check: 泊 : 17.9
:
: