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

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

ただいまの
回答率

90.34%

  • Android

    6720questions

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

Android TabLayout + ViewPager の入れ子について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,134

WestField

score 12

タブレイアウトの入れ子構造にしたいのですが、どうしても2つ目のタブ移行にページが表示されなく困っております。
実現したい事は親タブにA,Bとありそれぞれのタブに1,2,3とタブがあります。
ここまでは表示出来ています。
そしてその子タブ1,2,3には共通のレイアウトを呼出しフラグメントで切り替えるようにしたいのです。

現在の問題はAタブには子タブ1,2,3それぞれにページが表示されています。
しかし、Bタブには子タブ1,2,3は表示されるもののページが表示されません。

[PageAdapter]

public class PageAdapter extends FragmentPagerAdapter {
   @Override
   public Fragment getItem(int position) {
      PageFragment frPage = new PageFragment();
      frPage.setPosition(position);
      return frPage;
   }
}


[PageFragment]

public class PageFragment extends Fragment {
   @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
      View view = inflater.inflate(R.layout.fr_page, container, false);

      ViewPager mPager = (ViewPager) view.findViewById(R.id.nestViewpager);
      mPager.setAdapter(new NestPageAdapter(getFragmentManager(),mContext, position));
      TabLayout tabLayout = (TabLayout) view.findViewById(R.id.nestTabs);
      tabLayout.setupWithViewPager(mPager);

      return view;
   }
}


[NestPageAdapter]

public class NestPageAdapter extends FragmentPagerAdapter {
   @Override
   public Fragment getItem(int position) {
      NestPageFragment frPage = new NestPageFragment();
      frPage.setPostion(position);
      return frPage;
   }
}


[NestPageFragment]

public class NestPageFragment extends Fragment {
   @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
      View view = inflater.inflate(R.layout.fr_nestpage, container, false);

      return view
   }
}


[TabActivity]

Public class TabActivity extends BaseActivity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.tabactivity);

      ViewPager mPager = (ViewPager) findViewById(R.id.viewpager);
      mPager.setAdapter(new PageAdapter(getSupportFragmentManager(),TabActivity.this);
      TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
      tabLayout.setupWithViewPager(mPager);
   }
}


コードは上記のように書いています。
実際は多くの処理を書いておりますが、表示に掛かると思われる部分を抜粋しました。

何故、タブBには表示がされないのでしょうか?

何卒、ご教授お願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yona

    2017/03/30 21:35

    AとB、子タブはそれぞれどのクラスのインスタンスかを質問に追記してください。

    キャンセル

回答 2

check解決した方法

0

フラグメントの中で子フラグメントを呼び出す場合にgetFragmentManagerとしてしまうと、ライフサイクルを無視し、バックグラウンドに存在するフラグメントが表示されないというバグが発生するようです。

public class PageFragment extends Fragment {
   @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
      View view = inflater.inflate(R.layout.fr_page, container, false);

      ViewPager mPager = (ViewPager) view.findViewById(R.id.nestViewpager);
      //mPager.setAdapter(new NestPageAdapter(getFragmentManager(),mContext, position));

      mPager.setAdapter(new NestPageAdapter(getChildFragmentManager()mContext, position));
      TabLayout tabLayout = (TabLayout) view.findViewById(R.id.nestTabs);
      tabLayout.setupWithViewPager(mPager);

      return view;
   }
}

getChildFragmentManager()としてやれば上手く表示が出来ました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

NestPageFragmentのonCreateで適当なログ出力を行なってください、同じログが6つ出ると推測できます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/31 14:13

    ご回答有難う御座います。
    親フラグメントの中で子のフラグメントを呼び出すAdapterをセットする所に問題があったようです。

    キャンセル

同じタグがついた質問を見る

  • Android

    6720questions

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