teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

コメントを受けて追記

2019/11/12 07:46

投稿

dodox86
dodox86

スコア9416

answer CHANGED
@@ -24,4 +24,75 @@
24
24
  ; // 色々
25
25
  }
26
26
  }
27
- ```
27
+ ```
28
+ ---
29
+ **回答後のコメントを受けて追記しました:2019-11-12 16:46**
30
+
31
+ 基本的には`MainActivity`の`public`で`static`なメソッドを使う、と言う方針のままです。その内インスタンス変数やメソッドに関わる部分を切り出し、リソースIDを引数とするものと、`InputStream`を引数とするものとに分けます。
32
+ ```Java
33
+ /**
34
+ * csvReadインスタンスメソッド版
35
+ * @param filenameId リソースID
36
+ * @return
37
+ */
38
+ public ArrayList csvRead(int filenameId) {
39
+ InputStream is = getResources().openRawResource(filenameId);
40
+ ArrayList arrays = csvRead(is);
41
+ return arrays;
42
+ }
43
+
44
+ /**
45
+ * csvReadクラスメソッド版
46
+ * @param is InputStream
47
+ * @return
48
+ */
49
+ public static ArrayList csvRead(InputStream is) {
50
+ ArrayList<ArrayList<String>> arrays = new ArrayList<>();
51
+ BufferedReader reader = new BufferedReader(new InputStreamReader(is));
52
+ String line;
53
+ try {
54
+ while ((line = reader.readLine()) != null) {
55
+ //カンマ区切りで1つづつ配列に入れる
56
+ ArrayList<String> array = new ArrayList<>();
57
+ String[] RowData = line.split(",");
58
+ for (int j = 0; j < RowData.length; j++) {
59
+ array.add(RowData[j]);
60
+ }
61
+ arrays.add(array);
62
+ //Log.d("array1",""+array+"");
63
+ }
64
+ //Log.d("array2",""+arrays+"");
65
+ reader.close();
66
+ } catch (IOException e) {
67
+ e.printStackTrace();
68
+ }
69
+ return arrays;
70
+ }
71
+ ```
72
+
73
+ これを`AllEvacMapsActivity`から呼び出すときは、
74
+ ```Java
75
+ // 問題の部分。
76
+ // MainActivity.csvReadクラスメソッド版を呼び出す。
77
+ // ファイルリソースからのInputStreamは自力で取得する
78
+ InputStream is = getResources().openRawResource(R.raw.datafile);
79
+ ArrayList arrayList = MainActivity.csvRead(is);
80
+
81
+ //for文でaddMarkerをする予定
82
+ for (int i = 0; i < arrayList.size(); i++) {
83
+ ;
84
+ }
85
+
86
+ ```
87
+ のようにします。
88
+
89
+ 尚、以下のようにするとコンパイル自体はできますが、**まともに動かないので、やってはいけません。**Activityの生成は、
90
+ Androidシステムに任せなければなりません。
91
+ ```Java
92
+ // やってはいけない!!
93
+ MainActivity mainActivity = new MainActivity();
94
+ arrayList = mainActivity.csvRead(R.raw.datafile);
95
+
96
+ ```
97
+
98
+ `Application`クラスを経由して複数のActivity間でメソッドや変数を参照できるようにする方法もありますが、今回のケースでは過剰スペックだと思います。まずはJavaのメソッドの取り扱いで何とかするのをお勧めします。更に、`MainActivity`クラスに`csvRead`メソッドを持たせるのではなく、それ用のクラスを別に設けてそちらに任せてしまうようにするのも、設計面で考えるとより適切かもしれません。