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

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

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

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

Android Studio

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

Kotlin

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

Q&A

2回答

1077閲覧

Android Stdudio(Kotlin)で別のClassの変数を参照したい。

yamada_norio

総合スコア1

Android

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

Android Studio

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

Kotlin

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

0グッド

1クリップ

投稿2022/12/10 05:36

実現したいこと

Android Stdudio(Kotlin)で別のClassの変数を参照したい。

いろいろ調べてはおりますが、検討がつかず解決できずにおります。
なにとぞよろしくお願いいたします。

ソフトウェバージョン

AndroidStduio Chipmunk 2021.2.1 Patch1
Kotlin:212-1.7.10-release333-AS5457.46

発生している問題・エラーメッセージ

2022-12-10 13:58:15.656 6682-6682/com.example.testproject E/MyTag1: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference

該当のソースコード

Kotlin

1package com.example.testproject 2 3import androidx.appcompat.app.AppCompatActivity 4import android.os.Bundle 5import android.util.Log 6import android.widget.Button 7 8class MainActivity : AppCompatActivity() { 9 override fun onCreate(savedInstanceState: Bundle?) { 10 super.onCreate(savedInstanceState) 11 setContentView(R.layout.activity_main) 12 13 val testClass = TestClass() 14 testClass.button.setOnClickListener { 15 } 16 } 17} 18 19class TestClass : AppCompatActivity() { 20 val button: Button = findViewById(R.id.saveButton) 21// val testVal: Int = 10 22// val testVal : String = "Hello" 23} 24

試したこと

・もともともっと長かったコードを切り詰めてどこでエラーが出るか確認した。
・TestClassで数字や、文字は問題がないが、ボタンやTextViewなどを渡すとエラーになると切り分けた。
・Googleで、Class 変数 スコープ 渡し方 java.lang.NullPointerException などで検索した。
・trycatchでエラーを捕まえてみる。

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

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

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

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

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

guest

回答2

0

TestClass の button プロパティが testVal 等と違うのは、その値としてメソッドの戻り値を入れていることです。

TestClass も MainActivity と同じく AppCompatActivity ですので、呼んでいる findViewById は当然自身のメソッドであり、自身のビュー階層からビューを探す処理になります。
testClass オブジェクトは MainActivity で作成された単なるオブジェクトで Android アプリの土台となる機能は一切動作しませんし、プロパティの定義があるだけでビュー階層も無く、それらの理由により findViewById がその処理をする過程で例外を発する可能性は十分あるでしょう。
(どこで発生したかはエラーメッセージにスタックトレースとして表示されていたはずです。それにより『別のClassの変数を参照』したことが原因なのかも推測できたのでは無いでしょうか。)

投稿2022/12/11 17:32

編集2022/12/11 17:40
jimbe

総合スコア12648

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

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

0

findViewById関数の実行は、Viewの情報に依存するため、呼び出す場所によっては、対象のViewの情報が取得できず、NullPointerExceptionが発生してしまいます。

onCreate関数のsetContentView呼び出しの後(Viewの情報を設定した後)で、findViewById関数を呼び出すのはどうでしょうか?(別のClassの変数を参照する必要性があるのでしょうか?)。

投稿2022/12/10 10:51

knuser

総合スコア178

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

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

yamada_norio

2022/12/11 02:40

ありがとうございます。 > 別のClassの変数を参照する必要性があるのでしょうか? 絶対的な必要はなく、興味からお聞きいたしました。 SubClassの // val testVal: Int = 10 // val testVal : String = "Hello" が val testClass = TestClass() testClass.testVal のように、class MainActivityに、渡せるのに val button: Button = findViewById(R.id.saveButton) はどうしてダメなのだろうかという疑問があり、質問をした次第です。 > 呼び出す場所によっては、対象のViewの情報が取得できず、NullPointerExceptionが発生してしまいます。 という理由もわかりとても助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問