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

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

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

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

Q&A

解決済

1回答

5773閲覧

Android ViewPagerでページが表示されない

pipo

総合スコア16

Android

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

0グッド

0クリップ

投稿2016/04/12 15:00

編集2016/04/12 15:05

ViewPagerでいくつかFragmentを用意してタブで切り替えています。そのFragmentの1つの中にさらにViewPagerでページを構えているのですが、タブを2つ以上離して戻ってくるとページが表示されなくなってしまいます。
恐らくこちらのページで質問されているものと同じ現象だと思います。
https://teratail.com/questions/5601
で、そちらのサイトを参考にしながらやってると解決できたのですが、何がいけなかったのかよく分からずスッキリしません。
変更したのはViewPagerのsetAdapterなどの処理をonStartからonCreateViewに変えたことです。

###ソースコード
変更前

java

1public class HomeFragment extends Fragment{ 2 3 private ViewPager mViewPager; 4 private PagerAdapter mPagerAdapter; 5 6 public static HomeFragment newInstance() { 7 return fragment; 8 } 9 10 public HomeFragment() { 11 } 12 13 @Override 14 public View onCreateView(LayoutInflater inflater, ViewGroup container, 15 Bundle savedInstanceState) { 16 return inflater.inflate(R.layout.fragment_home, container, false); 17 } 18 19 @Override 20 public void onStart() { 21 super.onStart(); 22 23 mViewPager = (ViewPager) getView().findViewById(R.id.viewpager); 24 mPagerAdapter = new PagerAdapter(getChildFragmentManager()); 25 mViewPager.setAdapter(mPagerAdapter); 26 } 27 28 static class PagerAdapter extends FragmentPagerAdapter { 29 30 private static final int PAGE_COUNT = 5; 31 32 public PagerAdapter(FragmentManager fragmentManager) { 33 super(fragmentManager); 34 } 35 36 @Override 37 public Fragment getItem(int position) { 38 SampleFragment sampleFragment = SampleFragment.newInstance(position); 39 return sampleFragment; 40 } 41 42 @Override 43 public int getCount() { 44 return PAGE_COUNT; 45 } 46 } 47}

変更後

java

1public class HomeFragment extends Fragment{ 2 3 private ViewPager mViewPager; 4 private PagerAdapter mPagerAdapter; 5 6 public static HomeFragment newInstance() { 7 return fragment; 8 } 9 10 public HomeFragment() { 11 } 12 13 @Override 14 public View onCreateView(LayoutInflater inflater, ViewGroup container, 15 Bundle savedInstanceState) { 16 17 mViewPager = new ViewPager(getActivity()); 18 mViewPager.setId(R.id.viewpager); 19 mPagerAdapter = new PagerAdapter(getChildFragmentManager()); 20 mViewPager.setAdapter(mPagerAdapter); 21 22 return mViewPager; 23 } 24 25 26 static class PagerAdapter extends FragmentPagerAdapter { 27 28 private static final int PAGE_COUNT = 5; 29 30 public PagerAdapter(FragmentManager fragmentManager) { 31 super(fragmentManager); 32 } 33 34 @Override 35 public Fragment getItem(int position) { 36 SampleFragment sampleFragment = SampleFragment.newInstance(position); 37 return sampleFragment; 38 } 39 40 @Override 41 public int getCount() { 42 return PAGE_COUNT; 43 } 44 } 45}

なぜダメだったのか解説よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

FragmentPagerAdapterはFragmentを再利用するため、ライフサイクルが直感に反するところがあります。
確か、再利用されるときはFragment#onStartは呼ばれなかったと思います。
再利用時でもFragment#onCreateViewは呼ばれるので解決したのだと思います。

変更後のFragmentの各ライフサイクルメソッドにログを入れてみるといいかもしれませんね。

投稿2016/04/12 15:27

yona

総合スコア18155

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

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

pipo

2016/04/12 21:42

お早い回答ありがとうございました。 そうですね、ログとかはさみながら確認してみます ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問