2017-09-08 18 views
0

私はViewPagerを使用してフラグメントのセットを循環させています。各フラグメントを画面にスライドさせた後に更新したいと思います。基本的には、断片が整理された後にテキストを「フェードイン」したいと思います。onPageSelectedの実行前にBEFORE onCreateViewが呼び出されましたか?

フラグメントのonStartonResumeメソッドを使用しようとしましたが、これはほとんどのページで機能しますが、2番目のページでは機能しません。何故ならば、最初のページと2番目のページは、 onResumeメソッドは同時に呼び出されます(2ページ目が画面に表示される前に)。

今、私はonPageChangeListenerのonPageSelectedコールバックで動作するようにしようとしています。その方法は、次のようになります。

@Override 
public void onPageSelected(final int position) { 
    mCurrentPosition = position; 

    PageFragment fragment = (PageFragment) ((MainActivity.ScreenSlidePagerAdapter) mViewPager.getAdapter()).getItem(position); 

    fragment.onSelect(); 

} 

とフラグメントでonSelect方法は次のようになります。

public void onSelect(){ 

    new android.os.Handler().postDelayed(
      new Runnable() { 
       public void run() { 

        mSwitcher.setText(""); 

        mNum = getArguments() != null ? getArguments().getInt("num") : 1; 
        Media currentMedia = slideshow.getMedia().get(mNum); 

        mSwitcher.setText(currentMedia.getDisplayName()); 
       } 
      }, 
      4000); 
} 

この方法の問題点は、ラインmSwitcher.setText("");NullPointerException

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextSwitcher.setText(java.lang.CharSequence)' on a null object reference

投げるということです

これは、その中にonCreateViewメソッドがあることを示唆していますtクラスは実行されていないので、mSwitcher変数がインスタンス化される場所です。私はバナナのように見えますが、この時点では画面上に既にビューが表示されています。

この問題を解決する方法についてのご意見をいただければ幸いです。これは私の最初のAndroidの経験であり、私はこの愚かなテキスト・フェードインの問題を一週間も運行なしで解決しようとしてきました。現時点では、ほとんどすべてのマイナーチェンジがこれまでに痛みを伴うため、プラットフォームとしてモバイルを放棄する準備はほぼ完了しています。

+1

をアダプタを変更

if(position == 1) return new PageFragment(); 

のようなものを持っているかもしれません - これは 'ViewPager'がFragmentsとどのように機能するか(デフォルトでは)です。オフスクリーンフラグメントの読み込みをhttps://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)で調整できます – CzarMatt

+0

フラグメントに 'onCreateView()'メソッドを表示する –

答えて

0

ViewPagerは次のページをメモリに保持します&これはデフォルトの動作です。あなたのような呼び出すことによって、それを調整することができます:あなたは上記の方法で0を渡すと、viewPagerはそれを無視するよう

viewPager.setOffscreenPageLimit(2); 

は、しかし、これは便利ではないかもしれません。

あなたは正しい方向に進んでいます。私は今問題があなたのScreenSlidePagerAdapterにあると信じています。 getItem(int position)では、_「最初のページと2ページ目が同時に呼ばれる彼らのONSTART/onResumeメソッドを持っている」_代わりに、次のように

public class ScreenSlidePagerAdapter extends FragmentPagerAdapter { 

    private List<Fragment> mFragments = new ArrayList<>(); 

    public ScreenSlidePagerAdapter(FragmentManager fm, List<Item> items) { 
     super(fm); 

     for (Item item : items) { 
      mFragments.add(new PageFragment()); 
     } 
    } 


    @Override 
    public int getCount() { 
     return mFragments.size(); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragments.get(position); // Return from list instead of new PagerFragment() 
    } 
} 
+0

はいこれが有効です。問題のいくつかは、断片ごとに1つのメディアオブジェクトではなくスライドショー全体への参照を含むPageFragmentクラスにあると思いますが、あなたが述べたようにアダプタを変更することは間違いありませんでした。 これは問題なく動作していますか?この戦略は、すべてのフラグメントが事前に作成されることを保証するものなのでしょうか? –

+0

このようにすると、ViewPagerで膨らまされた同じフラグメントのインスタンスが常に取得されますが、新しいMyFragment()を返すと、呼び出すたびに異なるインスタンスが生成され、したがってnullポインタ例外 –

関連する問題