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

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

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

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

Q&A

1回答

1747閲覧

Tablayoutのfragmentにデータを受け渡す正しい方法がわかりません、、、

akawo

総合スコア23

Kotlin

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

0グッド

1クリップ

投稿2018/09/30 08:44

【目的】
元のactivityからtablayoutをもつactivityに値を渡し、そこで表示されるfragmentにデータを渡したい。
今回の質問は、一応動作はできたものの、何か問題がないかをお答えいただきたいといいのが目的です。

【方法】
元のactivityからtablayoutをもつactivityにintentを用いてデータを渡し、そこでSharedPreferencesを用いてデータを保持し、fragment側でそのデータを受け取る形式をとりました。

【コード】

MainActivity(元のactivity)

class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) button.setOnClickListener { val datatoTab = editText.text.toString().toInt() startActivity<TabActivity>("ID" to datatoTab) } } }

TabActivity

class TabActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_tab) val receive = intent.getIntExtra("ID" , 0) val pref = this.getSharedPreferences("result_ID", Context.MODE_PRIVATE) val e =pref.edit() e.putInt("DATA", receive) e.apply() //ViewPagerに先ほど作成したAdapterのインスタンスを渡してあげる styleviewpager.adapter = FGadapter(supportFragmentManager, this) //TabLayoutにViewPagerのインスタンスを渡すと自動的に実装してくれる tabTab01.setupWithViewPager(styleviewpager) //Tabへの処理はsetupWithViewPagerをした後だったら可能 //ここではタブ名とアイコンを設定している val tab1 = tabTab01.getTabAt(0) tab1?.text = "A" val tab2 = tabTab01.getTabAt(1) tab2?.text = "B" } }

basefragment1

class basefragment1: Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.basefragment1, null) } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) val pref = activity?.getSharedPreferences("result_ID", Context.MODE_PRIVATE) val data = pref?.getInt("DATA", 1) textView.text = data.toString() } }

basefragment2

class basefragment2: Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.basefragment2, null) } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) val pref = activity?.getSharedPreferences("result_ID", Context.MODE_PRIVATE) val data = pref?.getInt("DATA", 1) textView2.text = data.toString() }}

初心者なので、どのようなコードが問題があるかどうかがわかりません。特にfragmentに関しては中々理解が追い付いていない状態で、tablayoutに関しても初めて使用している状態です。

よろしければ問題ないかどうか、アドバイス等いただけると幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

正しい方法かという観点で言えば、SharedPreferencesを使って画面内のデータの受け渡しをするのはあまり正しい方法とは言えません。SharedPreferencesは本来データの永続化(アプリを再起動したときにもデータを利用できるよう保存する)のために使うものですし、アプリ内全体で共有されるものなので複数のタブを表示する際に問題が出たり、ファイルへの読み書きを挟みますからデータが大量になった場合にパフォーマンスに影響が出ます。

Fragmentの生成時にデータを渡すには setArguments というメソッドが用意されているので、それを使いましょう。また、ViewPager内の各Fragmentへデータを渡すにはPagerAdapterを経由するのがベーシックな方法です。

FGAdapterのソースを提示いただいてないので、以下はデータ受け渡しの箇所のみの実装例です。

kotlin

1class ExamplePagerAdapter( 2 fm: FragmentManager, 3 private val dataList: List<Int> 4) : FragmentPagerAdapter(fm) { 5 6 override fun getItem(position: Int): Fragment { 7 val fragment = xxxFragment() 8 // タブの位置に対応するデータを取得してFragmentに渡す 9 val data = dataList[position] 10 fragment.arguments = Bundle().apply { 11 putInt("DATA", data) 12 } 13 return fragment 14 } 15}

kotlin

1class TabActivity : AppCompatActivity() { 2 override fun onCreate(savedInstanceState: Bundle?) { 3 super.onCreate(savedInstanceState) 4 setContentView(R.layout.activity_tab) 5 6 val receive = intent.getIntExtra("ID" , 0) 7 // PagerAdapterに渡すデータのリスト 8 val dataList = listOf(receive, receive) 9 10 styleviewpager.adapter = ExamplePagerAdapter(supportFragmentManager, dataList) 11 } 12}

kotlin

1class basefragment1: Fragment() { 2 override fun onActivityCreated(savedInstanceState: Bundle?) { 3 super.onActivityCreated(savedInstanceState) 4 5 // 渡されたデータを表示 6 val data = arguments.getInt("DATA", 1) 7 textView.text = data.toString() 8 } 9}

投稿2018/10/01 05:35

編集2018/10/01 05:38
kakajika

総合スコア3131

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問