回答編集履歴

1

コメントを受けて追記

2019/11/12 07:46

投稿

dodox86
dodox86

スコア9183

test CHANGED
@@ -51,3 +51,145 @@
51
51
  }
52
52
 
53
53
  ```
54
+
55
+ ---
56
+
57
+ **回答後のコメントを受けて追記しました:2019-11-12 16:46**
58
+
59
+
60
+
61
+ 基本的には`MainActivity`の`public`で`static`なメソッドを使う、と言う方針のままです。その内インスタンス変数やメソッドに関わる部分を切り出し、リソースIDを引数とするものと、`InputStream`を引数とするものとに分けます。
62
+
63
+ ```Java
64
+
65
+ /**
66
+
67
+ * csvReadインスタンスメソッド版
68
+
69
+ * @param filenameId リソースID
70
+
71
+ * @return
72
+
73
+ */
74
+
75
+ public ArrayList csvRead(int filenameId) {
76
+
77
+ InputStream is = getResources().openRawResource(filenameId);
78
+
79
+ ArrayList arrays = csvRead(is);
80
+
81
+ return arrays;
82
+
83
+ }
84
+
85
+
86
+
87
+ /**
88
+
89
+ * csvReadクラスメソッド版
90
+
91
+ * @param is InputStream
92
+
93
+ * @return
94
+
95
+ */
96
+
97
+ public static ArrayList csvRead(InputStream is) {
98
+
99
+ ArrayList<ArrayList<String>> arrays = new ArrayList<>();
100
+
101
+ BufferedReader reader = new BufferedReader(new InputStreamReader(is));
102
+
103
+ String line;
104
+
105
+ try {
106
+
107
+ while ((line = reader.readLine()) != null) {
108
+
109
+ //カンマ区切りで1つづつ配列に入れる
110
+
111
+ ArrayList<String> array = new ArrayList<>();
112
+
113
+ String[] RowData = line.split(",");
114
+
115
+ for (int j = 0; j < RowData.length; j++) {
116
+
117
+ array.add(RowData[j]);
118
+
119
+ }
120
+
121
+ arrays.add(array);
122
+
123
+ //Log.d("array1",""+array+"");
124
+
125
+ }
126
+
127
+ //Log.d("array2",""+arrays+"");
128
+
129
+ reader.close();
130
+
131
+ } catch (IOException e) {
132
+
133
+ e.printStackTrace();
134
+
135
+ }
136
+
137
+ return arrays;
138
+
139
+ }
140
+
141
+ ```
142
+
143
+
144
+
145
+ これを`AllEvacMapsActivity`から呼び出すときは、
146
+
147
+ ```Java
148
+
149
+ // 問題の部分。
150
+
151
+ // MainActivity.csvReadクラスメソッド版を呼び出す。
152
+
153
+ // ファイルリソースからのInputStreamは自力で取得する
154
+
155
+ InputStream is = getResources().openRawResource(R.raw.datafile);
156
+
157
+ ArrayList arrayList = MainActivity.csvRead(is);
158
+
159
+
160
+
161
+ //for文でaddMarkerをする予定
162
+
163
+ for (int i = 0; i < arrayList.size(); i++) {
164
+
165
+ ;
166
+
167
+ }
168
+
169
+
170
+
171
+ ```
172
+
173
+ のようにします。
174
+
175
+
176
+
177
+ 尚、以下のようにするとコンパイル自体はできますが、**まともに動かないので、やってはいけません。**Activityの生成は、
178
+
179
+ Androidシステムに任せなければなりません。
180
+
181
+ ```Java
182
+
183
+ // やってはいけない!!
184
+
185
+ MainActivity mainActivity = new MainActivity();
186
+
187
+ arrayList = mainActivity.csvRead(R.raw.datafile);
188
+
189
+
190
+
191
+ ```
192
+
193
+
194
+
195
+ `Application`クラスを経由して複数のActivity間でメソッドや変数を参照できるようにする方法もありますが、今回のケースでは過剰スペックだと思います。まずはJavaのメソッドの取り扱いで何とかするのをお勧めします。更に、`MainActivity`クラスに`csvRead`メソッドを持たせるのではなく、それ用のクラスを別に設けてそちらに任せてしまうようにするのも、設計面で考えるとより適切かもしれません。