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

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

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

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

Kotlin

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

Q&A

解決済

2回答

2068閲覧

inflateの挙動について、想定外の処理順序となっている

bluvenz

総合スコア22

Android

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

Kotlin

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

0グッド

0クリップ

投稿2021/11/16 17:40

前提・実現したいこと

「はじめてのAndroidプログラミング 第5版」という本を参考に学習しております。
その中で、予期せぬ順番で処理が動いており困っています。

具体的には以下のソースコード中に記載しました(1)の後に(3)以降が走り、(4)、(5)と進んで最終的に「Caused by: kotlin.UninitializedPropertyAccessException: lateinit property binding has not been initialized」が発生してアプリが起動しません。
デバッグしたところ(2)以降の処理は(5)までの間に行われていないようです。

想定では(1)、(2)、(3)、(4)、(5)の順番で処理されると思いました。

記載ミスや、何かあればご教示お願いいたします。

該当のソースコード

MainActivity.kt(kotlin)

1class MainActivity : AppCompatActivity() { 2 3 private lateinit var appBarConfiguration: AppBarConfiguration 4 private lateinit var binding: ActivityMainBinding 5 6 override fun onCreate(savedInstanceState: Bundle?) { 7 super.onCreate(savedInstanceState) 8 9 binding = ActivityMainBinding.inflate(layoutInflater)・・・・・・・・・・・・・・・(1) 10 setContentView(binding.root)・・・・・・・・・・・・・・・・・・・・・・・・・・・ (2) 11 12 setSupportActionBar(binding.toolbar) 13 14 val navController = findNavController(R.id.nav_host_fragment_content_main) 15 appBarConfiguration = AppBarConfiguration(navController.graph) 16 setupActionBarWithNavController(navController, appBarConfiguration) 17 18 binding.fab.setOnClickListener { view -> 19 navController.navigate(R.id.action_to_scheduleEditFragment) 20 } 21 } 22 23 override fun onSupportNavigateUp(): Boolean { 24 val navController = findNavController(R.id.nav_host_fragment_content_main) 25 return navController.navigateUp(appBarConfiguration) 26 || super.onSupportNavigateUp() 27 } 28 29 fun setFabVisible(visibility: Int) { 30 binding.fab.visibility = visibility・・・・・・・・・・・・・・・・・・・・・・・・(5) 31 } 32}

FirstFragment.kt(kotlin)

1class FirstFragment : Fragment() { 2 3 private var _binding: FragmentFirstBinding? = null 4 private val binding get() = _binding!! 5 private lateinit var realm: Realm 6 7 override fun onCreate(savedInstanceState: Bundle?) { 8 super.onCreate(savedInstanceState) 9 realm = Realm.getDefaultInstance() 10 } 11 12 override fun onCreateView( 13 inflater: LayoutInflater, container: ViewGroup?, 14 savedInstanceState: Bundle? 15 ): View? { 16 _binding = FragmentFirstBinding.inflate(inflater, container, false) 17 return binding.root 18 } 19 20 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 21 super.onViewCreated(view, savedInstanceState)・・・・・・・・・・・・・・・・・・・・(3) 22 23 view.findViewById<Button>(R.id.button_first).setOnClickListener { 24 findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment) 25 } 26 27 binding.list.layoutManager = LinearLayoutManager(context) 28 val schedules = realm.where<Schedule>().findAll() 29 val adapter = ScheduleAdapter(schedules) 30 binding.list.adapter = adapter 31 32 adapter.setOnItemClickListener { id -> 33 id?.let { 34 findNavController().navigate(R.id.action_to_scheduleEditFragment) 35 } 36 } 37 38 (activity as? MainActivity)?.setFabVisible(View.VISIBLE)・・・・・・・・・・・・・・・(4) 39 } 40 41 override fun onDestroyView() { 42 super.onDestroyView() 43 _binding = null 44 } 45 46 override fun onDestroy() { 47 super.onDestroy() 48 realm.close() 49 } 50}

補足情報

本の内容としてはNavigationコンポーネントを使用した学習内容となっています。

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

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

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

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

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

hoshi-takanori

2021/11/17 00:20 編集

プロジェクト作成時に Basic Activity を選びましたか? その場合、ActivityMainBinding.inflate() の中で content_main.xml にある NavHostFragment が生成され、navigation graph を読み込んで、たぶん FirstFragment のビューも生成するのでしょうね。というか、MainActivity の FAB は複数のフラグメントで共通して表示されることになるので、それを隠すような処理はフラグメントの生成時ではなく、実際に画面に表示したり隠したりする時 (onResume や onPause) に行うか、使い方によってはフラグメント側に持たせる方が良いのでは。
bluvenz

2021/11/18 14:58

Basic Activity を選んでいます。 一先ずonResumeで行うことで実現したいことができました。 ありがとうございます。
guest

回答2

0

自己解決

「はじめてのAndroidプログラミング 第5版」のサンプル通りに記載して動かなかったために質問させていただいた次第でした。

hoshi-takanoriさんのアドバイスを基にonResumeにて実装する方法で想定された挙動を実現することができました。

ありがとうございました。

投稿2021/11/18 15:02

bluvenz

総合スコア22

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

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

0

~ 予期せぬ順番で処理が動いて ~

想定では ~ の順番で処理されると思いました

単に「予期・想定が間違っている」だけでしょう。
レイアウトに FirstFragment が書かれていれば当然生成するでしょうし、 (3) の後 (4) があって (5) を呼び出し、(5) の binding はまだ( (1) の inflateメソッドの実行中なので)設定されていないのですから例外が発生して、処理が中断されれば (2) は実行されません。

投稿2021/11/17 10:03

編集2021/11/17 10:04
jimbe

総合スコア12639

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問