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

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

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

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

Kotlin

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

Q&A

解決済

1回答

5245閲覧

Kotlin で 切り替えた Fragment の onCreate() が呼ばれない

toumorokoshi

総合スコア13

Android

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

Kotlin

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

0グッド

0クリップ

投稿2019/06/17 09:09

Activity から任意のフラグメントを読み込み、指定レイアウトの表示を切り替えたい

Kotlin で Activity から任意フラグメントを読み込み、指定レイアウト表示を切り替えたいのですが、切り替わらないので調べたところ読み込んだフラグメントの onCreate() にブレークポイントを仕掛けても止まらない状態で、onCreate() が呼ばれない状態で困っています。

FooterFragment.kt は、AndroidStudio から New > Fragment > Fragment(blank) で作成したものをそのまま使っています。

何か解決に繋がる情報があれば教えていただけると助かります。

よろしくお願いします。

発生している問題

transaction.commit() を呼んだ後も表示が読み込んだフラグメントに切り替わりません

該当のソースコード

MainActivity.kt

kotlin

1package com.test.testapp 2 3import android.net.Uri 4import android.support.v7.app.AppCompatActivity 5import android.os.Bundle 6import android.os.Handler 7import android.support.v4.app.FragmentActivity 8import android.util.Log 9 10class MainActivity : AppCompatActivity(), FooterFragment.OnFragmentInteractionListener { 11 12 override fun onCreate(savedInstanceState: Bundle?) { 13 super.onCreate(savedInstanceState) 14 setContentView(R.layout.activity_main) 15 16 if (savedInstanceState == null) { 17 try { 18 var fragment = FooterFragment.newInstance("one", "two") 19 var transaction = FragmentActivity().supportFragmentManager.beginTransaction() 20 transaction.replace(R.id.footerArea, fragment) 21 transaction.addToBackStack(null) 22 transaction.commit() 23 } catch (e: Exception) { 24 Log.d("error", e.message) 25 } 26 } 27 } 28 29 override fun onStart() { 30 super.onStart() 31 } 32 33 override fun onResume() { 34 super.onResume() 35 } 36 37 override fun onFragmentInteraction(uri: Uri) { 38 Log.d("listener", "onFragmentInteraction") 39 } 40}

MainActivity.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<android.support.constraint.ConstraintLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:tools="http://schemas.android.com/tools" 5 xmlns:app="http://schemas.android.com/apk/res-auto" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 tools:context=".MainActivity"> 9 10 <TextView 11 android:id="@+id/textView1" 12 android:layout_width="wrap_content" 13 android:layout_height="wrap_content" 14 android:text="Hello World!" 15 app:layout_constraintTop_toTopOf="parent" 16 app:layout_constraintBottom_toTopOf="@id/footerArea" 17 app:layout_constraintLeft_toLeftOf="parent" 18 app:layout_constraintRight_toRightOf="parent" 19 app:layout_constraintVertical_bias="1.0"/> 20 21 <android.support.constraint.ConstraintLayout 22 android:id="@+id/footerArea" 23 android:layout_width="match_parent" 24 android:layout_height="32dp" 25 app:layout_constraintBottom_toBottomOf="parent"> 26 27 <TextView 28 android:id="@+id/textView2" 29 android:layout_width="0dp" 30 android:layout_height="0dp" 31 android:text="Hello World!2" 32 android:background="#C0C0C0" 33 app:layout_constraintTop_toTopOf="parent" 34 app:layout_constraintBottom_toBottomOf="parent" 35 app:layout_constraintStart_toStartOf="parent" 36 app:layout_constraintEnd_toEndOf="parent" 37 /> 38 </android.support.constraint.ConstraintLayout> 39 40</android.support.constraint.ConstraintLayout>

FooterFragment.kt

kotlin

1package com.test.testapp 2 3import android.content.Context 4import android.net.Uri 5import android.os.Bundle 6import android.support.v4.app.Fragment 7import android.view.LayoutInflater 8import android.view.View 9import android.view.ViewGroup 10 11 12// TODO: Rename parameter arguments, choose names that match 13// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 14private const val ARG_PARAM1 = "param1" 15private const val ARG_PARAM2 = "param2" 16 17/** 18 * A simple [Fragment] subclass. 19 * Activities that contain this fragment must implement the 20 * [FooterFragment.OnFragmentInteractionListener] interface 21 * to handle interaction events. 22 * Use the [FooterFragment.newInstance] factory method to 23 * create an instance of this fragment. 24 * 25 */ 26class FooterFragment : Fragment() { 27 // TODO: Rename and change types of parameters 28 private var param1: String? = null 29 private var param2: String? = null 30 private var listener: OnFragmentInteractionListener? = null 31 32 override fun onCreate(savedInstanceState: Bundle?) { 33 super.onCreate(savedInstanceState) 34 arguments?.let { 35 param1 = it.getString(ARG_PARAM1) 36 param2 = it.getString(ARG_PARAM2) 37 } 38 } 39 40 override fun onCreateView( 41 inflater: LayoutInflater, container: ViewGroup?, 42 savedInstanceState: Bundle? 43 ): View? { 44 // Inflate the layout for this fragment 45 return inflater.inflate(R.layout.fragment_footer, container, false) 46 } 47 48 // TODO: Rename method, update argument and hook method into UI event 49 fun onButtonPressed(uri: Uri) { 50 listener?.onFragmentInteraction(uri) 51 } 52 53 override fun onAttach(context: Context) { 54 super.onAttach(context) 55 if (context is OnFragmentInteractionListener) { 56 listener = context 57 } else { 58 throw RuntimeException(context.toString() + " must implement OnFragmentInteractionListener") 59 } 60 } 61 62 override fun onDetach() { 63 super.onDetach() 64 listener = null 65 } 66 67 /** 68 * This interface must be implemented by activities that contain this 69 * fragment to allow an interaction in this fragment to be communicated 70 * to the activity and potentially other fragments contained in that 71 * activity. 72 * 73 * 74 * See the Android Training lesson [Communicating with Other Fragments] 75 * (http://developer.android.com/training/basics/fragments/communicating.html) 76 * for more information. 77 */ 78 interface OnFragmentInteractionListener { 79 // TODO: Update argument type and name 80 fun onFragmentInteraction(uri: Uri) 81 } 82 83 companion object { 84 /** 85 * Use this factory method to create a new instance of 86 * this fragment using the provided parameters. 87 * 88 * @param param1 Parameter 1. 89 * @param param2 Parameter 2. 90 * @return A new instance of fragment FooterFragment. 91 */ 92 // TODO: Rename and change types and number of parameters 93 @JvmStatic 94 fun newInstance(param1: String, param2: String) = 95 FooterFragment().apply { 96 arguments = Bundle().apply { 97 putString(ARG_PARAM1, param1) 98 putString(ARG_PARAM2, param2) 99 } 100 } 101 } 102}

fragment_footer.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 tools:context=".FooterFragment"> 7 8 <!-- TODO: Update blank fragment layout --> 9 <TextView 10 android:layout_width="match_parent" 11 android:layout_height="match_parent" 12 android:text="@string/hello_blank_fragment"/> 13 14</FrameLayout>

試したこと

上記ソースコードで、FooterFragment の onCreate() や onCreateView() などにブレークポイントを仕掛けてどこかで止まれば呼びされているのではないかを試しました

補足情報(FW/ツールのバージョンなど)

AndroidStudio 3.4.1
ext.kotlin_version = '1.3.31'

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

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

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

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

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

guest

回答1

0

ベストアンサー

beginTransaction()を呼び出しているところを次のように修正すればいいのではないでしょうか。

kotlin

1 var transaction = supportFragmentManager.beginTransaction() 2

FragmentActivity().を取り除いただけです。「余分な記述をしてしまった」ために、処理対象が自Activityにならず、描画が変化してくれないのでしょう。AppCompatActivityはFragmentActivityを継承しているので、supportFragmentManager()はそのまま呼び出せます。

それから、この作り方でfooterAreaにFragmentを描画しても、元々のTextViewは消されず重ね書きした格好になってしまうと思います。恐らくFragmentと入れ替わる結果を期待していると思いますが、そうはならないでしょう。この領域をFragmentで動的に切り替えるための専用領域とするならば、空っぽのレイアウトを配置しましょう。

投稿2019/06/17 12:53

keicha_hrs

総合スコア6766

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

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

toumorokoshi

2019/06/18 01:56

ありがとうございました。 FragmentActivity を継承しているので、そのまま supprtFragmentManager() を呼び出せばよい というのが正解でした。 これに気がつかなかったのはお恥ずかしい限りです。 TextView が重ね書きされてしまうのも、ご指摘の通りでした。 ただ端末の戻るボタンを押すと onDetach() が呼ばれてしまうので、実装方法を再考してみます。 今回の目的はフッター部分をどの画面でも同じ内容を呼び出すので、フラグメント化して使いまわそうと思っての実験でした。 大変助かりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問