🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MVP

MVP(Minimum Viable Product)とは、「必要最低限の機能を兼ね備えた製品」を指します。企画書などを完成させる前に、とりあえず製品を形にする方法です。プロトタイプなどで一旦アウトプットさせることにより、無駄なコストや時間を削減できます。

Kotlin

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

Q&A

解決済

1回答

2044閲覧

MVP構成で1つのactivityで3つのfragmentの画面遷移をしたい

myokiya

総合スコア8

MVP

MVP(Minimum Viable Product)とは、「必要最低限の機能を兼ね備えた製品」を指します。企画書などを完成させる前に、とりあえず製品を形にする方法です。プロトタイプなどで一旦アウトプットさせることにより、無駄なコストや時間を削減できます。

Kotlin

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

0グッド

0クリップ

投稿2020/05/11 13:52

前提・実現したいこと

kotlinでmvp構成でアプリケーションを作っています。
bottomnavigation viewでの画面遷移を、1つのactivity、3つのfragmentを用いて行おうと考えています。

下のコードではoriginActivityで最初はoriginFriendFragmentを開いて、bottomnavでoriginFriendFragmentからoriginMyPageFragmentに遷移しようとしています。

具体的なエラーとしては、onCreateのOriginMyPgaePresenterの前にoriginMyPageFragmentの初期化をしたいのですが、どこで初期化をすればよいのか分かっておらず困っています。

よろしくお願いいたします。

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

kotlin.UninitializedPropertyAccessException: lateinit property originMyPageFragment has not been initialized

該当のソースコード

kotlin

1//importは省略 2 3class OriginActivity : AppCompatActivity() 4{ 5 6 7 8 //ここでfragmentの初期化 9 lateinit var originFriendFragment: OriginFriendFragment 10 lateinit var originEventFragment: OriginEventFragment 11 lateinit var originMyPageFragment: OriginMyPageFragment 12 lateinit var bottomNav : BottomNavigationView 13 14 15 object LogicValues{ 16 const val originFriendFragmentId = 0 17 const val originEventFragmentId = 1 18 const val originMyPageFragmentId = 2 19 } 20 21 22 private val mOnNavigationItemSelectedListener= 23 BottomNavigationView.OnNavigationItemSelectedListener{ 24 item -> 25 when (item.itemId) { 26 R.id.originFriendActivity -> { 27 replaceFragmentInActivity(originFriendFragment,originFriendFragmentId) 28 return@OnNavigationItemSelectedListener true 29 } 30 31 R.id.originEventActivity -> { 32 replaceFragmentInActivity(originEventFragment,originEventFragmentId) 33 return@OnNavigationItemSelectedListener true 34 } 35 36 R.id.originMyPageActivity -> { 37 replaceFragmentInActivity(originMyPageFragment,originMyPageFragmentId) 38 return@OnNavigationItemSelectedListener true 39 } 40 } 41 false 42 } 43 44 45 46 override fun onCreate(savedInstanceState: Bundle?) 47 { 48 49 50 super.onCreate(savedInstanceState) 51 setContentView(R.layout.activity_origin) 52 53 bottomNav = findViewById<BottomNavigationView>(R.id.btm_nav).apply{ 54 setOnNavigationItemSelectedListener( 55 mOnNavigationItemSelectedListener 56 )} 57 58 setupActionBar(R.id.toolbar) { 59 title = getString(R.string.friend_text) 60 setDisplayHomeAsUpEnabled(true) 61 } 62 63 originFriendFragment = supportFragmentManager 64 .findFragmentById(R.id.origin_content_frame) as OriginFriendFragment? 65 ?: OriginFriendFragment.newInstance().also { 66 replaceFragmentInActivity(it, R.id.origin_content_frame) 67 } 68 69 70 71 //TODO ここはダガーで書かないとやばい 72 OriginFriendPresenter( 73 FriendsRepository.getInstance( 74 FriendsRemoteDataSource.getInstance(), 75 FriendsLocalDataSource.getInstance()), 76 UserRepository.getInstance( 77 UserRemoteDataSource(), 78 UserLocalDataSource.getInstance()), 79 originFriendFragment 80 ) 81 82 83 84 OriginMyPagePresenter( 85 FriendsRepository.getInstance( 86 FriendsRemoteDataSource.getInstance(), 87 FriendsLocalDataSource.getInstance()), 88 GroupsRepository.getInstance( 89 GroupsRemoteDataSource.getInstance(), 90 GroupsLocalDataSource.getInstance() 91 ), 92 UserRepository.getInstance( 93 UserRemoteDataSource.getInstance(), 94 UserLocalDataSource.getInstance()), 95 originMyPageFragment 96 ) 97 98 } 99 100 101 companion object{ 102 const val EXTRA_FRIEND_ID = "FRIEND_ID" 103 const val EXTRA_GROUP_ID = "GROUP_ID" 104 } 105}

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

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

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

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

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

guest

回答1

0

ベストアンサー

ご提示のコードを見た限りだと、ActivityとFragmentのPresenterがなにかやり取りをしているわけでもありませんし、あえてActivity内でPresenterを生成する意味は無いのではないでしょうか?各FragmentのonCreateに書いてしまった方がスッキリしますし、ActivityからFragmentを取得する方法について頭を悩ませる必要もなくなると思います。

それと、これは余談ですが、Activityのメンバ変数としてFragmentのインスタンスを保持するのもあまり好ましくないコードです。Fragmentの生成方法にもよりますが問題の原因となりやすいので、避けた方が良いと思います。

投稿2020/05/16 23:06

kakajika

総合スコア3131

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問