アクティビティから ViewPager Fragment メソッドにアクセスする
シナリオでは、複数の Fragment インスタンスを持つ ViewPager があり、GET を実行したいと考えています。
最初のアプローチ: setUserVisibleHint
setUserVisibleHint の使用は、次の場合にすぐにリクエストをトリガーするため、理想的ではありません。フラグメントが表示され、スワイプのスムーズなアニメーションが中断されます。
2 番目のアプローチ: OnPageChangeListener
OnPageChangeListener は、より適切なアプローチを提供します。ただし、onPageScrollStateChanged メソッドで sendGetRequest() を呼び出そうとすると、NullPointerException が発生します。
Solution
NullPointerException が発生するのは、フラグメント内の ViewPager の OnPageChangeListener。この場合のコンテキストは MainActivity ですが、これはフラグメントの操作には適切ではありません。
これを解決するには、代わりにフラグメントのコンテキストへの参照を渡す必要があります。改訂された OnPageChangeListener は次のとおりです。
<code class="java">viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { int currentPosition = 0; @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { currentPosition = position; } @Override public void onPageScrollStateChanged(int state) { if (state == ViewPager.SCROLL_STATE_IDLE && currentPosition != 0) { try { Fragment fragment = mAdapter.fragments[currentPosition]; if (fragment != null && fragment instanceof FragmentTwo) { ((FragmentTwo) fragment).sendGetRequest(); } } catch (Exception ex) { ex.printStackTrace(); } } } });</code>
このコードでは、FragmentAdapter のフラグメント配列を使用して、現在の位置にあるフラグメントへの参照を取得します。次に、フラグメントを適切なタイプ (この場合は FragmentTwo) にキャストし、その sendGetRequest() メソッドを呼び出します。
このアプローチを使用すると、GET リクエストをトリガーし、取得したデータを目的のフラグメントに表示できます。スワイプアニメーションはスムーズに完了します。
以上がNullPointerException を発生させずに ViewPager OnPageChangeListener から Fragment メソッドを呼び出す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。