質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

3041閲覧

【Kotlin】xmlファイルに記述したリソースstring-arrayをActivityを継承していないクラスから読み込みたい

atRhod

総合スコア10

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/09/06 11:03

編集2020/09/06 11:05

Kotlin言語にて開発中、どうしても進めない部分がありますので、質問させてください。

実現したいこと

下記xmlのような文字列アレイがあり、フラグメント内のKotlinコードで文字配列を読み込ませていました。

xml

1 <string-array name="a00_namelist1"> 2 <item>文字列1</item> 3 <item>文字列2</item> 4 <item>文字列3</item> 5 </string-array>

Kotlin

1class fragment: Fragment() { 2 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 3 super.onViewCreated(view, savedInstanceState) 4    //・・・・・ 5    val nameList = resources.getStringArray(R.array.a00_namelist1)//文字配列の読み込み。実際のコードではこの文章が大量にあるため、今後の修正を考えるとクラス分けし、メソッドを作りたいと考えた。 6 //・・・・・ 7 } 8}

実際のコードでは文字配列の読み込みが大量にあるため、今後の修正を考え、クラス分けし、メソッドを作りたいと考えました。

問題点

しかし、クラス分けをしたところ、「resources.〜」以降が使用できず、文字配列が読み込めなくなってしまいました。

Kotlin

1class FormulaData{ 2 fun formula_dataRead(homeId: String, categoryId: String): Array<String> { 3 return resources.getStringArray(R.array.a00_namelist1)//ここでエラー 4 } 5}

試していること

Application()クラスを継承させることでエラー自体は出なくなりました。

Kotlin

1class FormulaData:Application(){ 2 fun formula_dataRead(homeId: String, categoryId: String): Array<String> { 3 return resources.getStringArray(R.array.a00_namelist1)//ここのエラーはなくなった。しかし、ここでアプリクラッシュ。 4 } 5}

しかし今度はアプリが上記コード実行時にクラッシュするようになりました。
エラー内容は、下記のとおりです。

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference

nullによるアプリクラッシュは「context」というキーワードに原因があると考え、調べているのですが、サイト等を調べても理解不足からかうまく自分のコードに落とし込むことが出来ず、開発が停滞してしまっている状況です。

ご教授頂ければ幸いです。

環境

Android Studio 4.0.1
Build #AI-193.6911.18.40.6626763, built on June 25, 2020
Runtime version: 1.8.0_242-release-1644-b3-6222593 x86_64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
macOS 10.15.6
GC: ParNew, ConcurrentMarkSweep
Memory: 2014M
Cores: 4
Registry: ide.new.welcome.screen.force=true
Non-Bundled Plugins: org.jetbrains.kotlin, com.google.services.firebase

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

FormulaDataの生成をどこで行うのかわからないのですが、Fragment継承クラスの中で作るのであれば

kotlin

1class FormulaData(private val fragment: Fragment) { 2 fun formula_dataRead(homeId: String, categoryId: String): Array<String> { 3 return fragment.resources.getStringArray(R.array.a00_namelist1) 4 } 5}

のようにしてコンストラクターの引数としてFragmentを渡すようにして、生成する箇所では

kotlin

1 val data = FormulaData(this)

のようにすればいいのではないでしょうか。

投稿2020/09/06 12:40

keicha_hrs

総合スコア6766

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

atRhod

2020/09/06 13:00

keicha_hrs様 教えて頂いたとおり、クラス生成時にFragmentを受け取るようにし、Fragment内でクラスを生成する際に渡したところ、コンパイルエラー、実行時エラー共に無くなりました。 どこでクラス生成するか等の説明が抜けており分かりにくい投稿であったかと思います。答えいただき、本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問