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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

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

Q&A

解決済

1回答

650閲覧

FragmentTabHostで表示中のFragmentのインスタンスを取得したい

i_zac8132

総合スコア16

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

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

0グッド

0クリップ

投稿2019/02/06 07:29

編集2019/02/06 08:24

こんにちは、
趣味でアプリケーションを作っているものです。

現在FragmentTabHostを用いてActivityを一つだけ持つアプリを作成しております。
その中で「FragmentTabHostで表示中のFragmentのインスタンスを取得したい」場面が出てきました。
叶えたい理由や遭遇した問題は以下のとおりです。

######叶えたい理由
・Tab1で操作や入力をして、決定を押すとTab2へ移動する、という挙動を叶えたい。
・入力はTab1で、機能諸々はTab2で実装したい。
→ Tab2内で入力を省略して機能を使うことも可能なので、機能はTab2に押し込めたい。

######遭遇した問題や試したこと
・tab1で入力完了をMainActivityへ一度伝え、MainActivityがTabを切り替えつつ値を引き渡す処理を考えている
・FragmentManager#getFragments()を用いて一覧を取得し、instanceOfなどでメソッドを利用しようとした
→ getFragments()の返り値がsize1のリスト(Tab1のみを含む)であり、Tab2を取得できなかった。
→ ならばと思いFragmentTabHost#setCurrentTabでTabを切り替えてから一覧を取得したが、やはりTab1のみを含むSize1のListしか返ってこなかった。

 ・FragmentManager#findFragmentById)を用いてLayout内Containerに含まれているFragmentのインスタンスを表示しようとした。
→ FragmentTabHost#setCurrentTabも合わせて試したが、やはりTab1しか入手できなかった。

######コード

Java

1class MainActivity extends FragmentActivity implements....{ 2 //諸々省略 3 4  //Tab1のFragmentから呼ばれるメソッド 5 void didInput(String param1, ......){ 6 //ここでFragmentTab2を取得したい。以下2パターンとも失敗した。 7 8     //パターン1 9     tabHost.setCurrentTab(1); 10     List<Fragment> fragmentList = getSupportFragmentmanager().getFragments();//長さ1のListしか返ってこない 11 for(Fragment fragment: fragmentList){ 12 if(fraagment instanceOf FragmentTab2){ 13 ((FragmentTab2)fragment).methodHoge(param1,......); 14 } 15 } 16 17 18 //パターン2 19     tabHost.setCurrentTab(1); 20 Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.container);//ここで取得されるものはFragmentTab1 21 if(fraagment instanceOf FragmentTab2){ 22 ((FragmentTab2)fragment).methodHoge(param1,......); 23 } 24 } 25}

以上です。
TabHostを使う場合のTab間でのパラメータの引き渡し方法が悪いのでしょうか?
根本的な考え方の指摘も含め、皆様のお力をお借りできれば幸いです。

ご教授のほどよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

質問をまとめていて思いついたことを実装したら解決いたしました。
同じようなことに悩んだ方がいらっしゃった時のために解決策を共有いたします。

きちんと切り替わった後にFragmentを取得しに行くのが大切?

######やったこと
・Fragmentから呼ばれるメソッド内には以下2つの機能のみを実装
- このメソッドからTabを切り替えたことを認識させるためのBooleanの値をTrueへ変更
- tabHost.setCurrentTabでTabの切り替え
・Tabが切り替わったときに呼ばれる onTabChanged(String tabId)内で以下の機能を実装
- もし切り替えが上記メソッドから呼ばれたなら、というif文の追加
- FragmentManager#findFragmentByIdを用いたFragmentの取得

######コード

Java

1class MainActivity extends FragmentActivity implements....{ 2 3 //特定のメソッドから呼んだことを管理するためのBoolean値 4  Boolean calledFromDidInput = false; 5 6 //諸々省略 7 8  //Tab1のFragmentから呼ばれるメソッド 9 void didInput(String param1, ......){ 10 11 //管理BoolをTrue変更 12 calledFromDidInput = true; 13 //基本的にはTabを切り替えるだけ 14     tabHost.setCurrentTab(1); 15 } 16 } 17 18 //中間省略...... 19 20  //Tabが切り替わった時に呼ばれるメソッド 21  @Override 22 public void onTabChanged(String tabId){ 23 switch(tabId){ 24 case tab2: 25 if(calledFromDidInput){ 26 calledFromDidInput = false //戻すことを忘れない 27           Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_TAB2); 28 if(fragment instanceOf FragmentTab2){ 29 ((FragmentTab2) fragment).anyMethod(param1......); 30 } 31 } 32 break; 33 //以下省略...... 34 } 35 36 } 37 38}

投稿2019/02/06 08:55

i_zac8132

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問