2016-06-27 7 views
0

私はViewPager,FragmentPagerAdapterといくつかの断片を持っています。ユーザーが別のものに切り替えると、その断片に通知する必要があります(最初の作業が終了するように)。私はViewPager.OnPageChangeListenerを探していますが、変更が発生したときに現在のフラグメントインスタンスを取得する方法はありません。 ViewPager.getCurrentItem()でも、OnPageChangeListener.onPageSelectedが呼び出されたときに新しい位置が返されます。ViewPagerとFragmentPagerAdapter:別のフラグメントに切り替えることをフラグメントインスタンスに通知する方法は?

新しいフラグメントが選択されるたびに、前のフラグメントに対してFragment.onPause()が呼び出されることは保証されますか?それは確かに事を単純化するでしょう。

答えて

0

フラグメントレベルの参照は、mCustomFragmentのように保存できます。 フラグメント設定の中で作業を確定するパブリックメソッドを設定する場合は、ViewPager.OnPageChangeListenerに必要なときにこのメソッドを呼び出します。

+0

いいえ、私はそれを動作させる方法が表示されません。現在のフラグメントへの参照を 'FragmentPagerAdapter.getItem'に保存しておきましょうが、' OnPageChangeListener.onPageSelected'が呼び出されるまでには既にそれは遅すぎます。私はどのフラグメントを**から**に切り替えるのか知っていますが、**からは**ありません。 –

+0

そして、私は 'getItem'は必ず遷移が起こるたびに呼び出されるとは思わない。それは内部的にキャッシュすることができます。 –

+0

私はあなたの意見を見ます。 getItem()から取得する必要はありません。あなたの現在のビューページのページを追跡するのはどうでしょうか?あなたは何でも、インデックス、文字列を使うことができます。次に、onPageSelectedでは、最後のページ参照を格納しているオブジェクトに基づいて参照を取得し、最終的にメソッドを呼び出します。 – Matteo

0

何らかのジェスチャリスナーを付けて、スワイプがどのように発生するかを判断することがあります。次に、コールの前に使用された最後のジェスチャに基づいてOnPageChangeListenerで、現在のビューページインデックスに+1または-1を配置するかどうかを決定します。

+0

これはフラグメント_instance_を取得する問題を解決しません。 –

+0

それでは、カスタムアダプタクラスを作成せずに、インデックスに基づいたフラグメントを返すメソッドを作成してください。私はちょうどその質問を完全に理解していないと思います。 – CodeCody

1

ドキュメントによると、onPauseはユーザーがフラグメントを離れるときに呼び出されます(必ずしもフラグメントが破棄されているとは限りません)。

https://developer.android.com/guide/components/fragments.html

+0

どうやら、私はそこにブレークポイントを入れました、そして、私が2つの断片の間を行き来するとき、それは打撃を受けません。 –

+0

FragmentPagerAdapterコード –

+0

https://gist.github.com/VioletGiraffe/99b8362e7dbfdfc2fb1309d28874725b –

0

ここでは実際に動作する私の解決策です。フラグメントに通知するためのブロードキャストが含まれます。

@SuppressLint("ValidFragment") 
public class ExtendedFragment extends Fragment { 

    public static final String FragmentIdTag = "Fragment ID"; 
    public static final String FragmentSwitchedEventId = "FragmentSwitchedEvent"; 

    @SuppressLint("ValidFragment") 
    protected ExtendedFragment(FragmentType fragmentId) { 
     m_fragmentType = fragmentId; 
    } 

    public void onSwitchedAway() { 
    } 

    public BroadcastReceiver broadcastReceiver() { 
     return m_receiver; 
    } 

    class Receiver extends BroadcastReceiver { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      FragmentType newFragmentType = (FragmentType) intent.getSerializableExtra(FragmentIdTag); 
      if (newFragmentType != m_fragmentType) 
       onSwitchedAway(); 
     } 
    } 

    protected final FragmentType m_fragmentType; 
    Receiver m_receiver = new Receiver(); 
} 

FragmentTypeは、すべてのフラグメントに異なるのですenumです:

まず、私はFragmentクラスを拡張しました。すべてのフラグメントはExtendedFragment(ひどい名前、私は知っています。より良いものを提案してください)、適切な一意のFragmentType値をコンストラクタに渡します。

それから私はフラグメントスイッチを検出するために、Viewpager.OnPageChangeListenerを使用します。

pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
      @Override 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} 

      @Override 
      public void onPageSelected(int position) { 
       FragmentType newType = fragmentTypeForPosition(position); 
       Intent i = new Intent(ExtendedFragment.FragmentSwitchedEventId); 
       i.putExtra(ExtendedFragment.FragmentIdTag, newType); 
       LocalBroadcastManager.getInstance(MainActivity.this).sendBroadcast(i); 
      } 

      @Override 
      public void onPageScrollStateChanged(int state) {} 
     }); 

そして最後に、フラグメントをインスタンス化する際には放送受信機として登録することを忘れないでください:

完了
pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

      @Override 
      public void onPageSelected(int position) { 
       FragmentType newType = fragmentTypeForPosition(position); 
       Intent i = new Intent(ExtendedFragment.FragmentSwitchedEventId); 
       i.putExtra(ExtendedFragment.FragmentIdTag, newType); 
       LocalBroadcastManager.getInstance(MainActivity.this).sendBroadcast(i); 
      } 
     }); 

。フラグメントはpublic void onSwitchedAway()を上書きできます。

関連する問題