Activity から ViewPager Fragment メソッドにアクセスする
多くのモバイル アプリケーションは、モジュラー画面セクションを表す自己完結型コンポーネントであるフラグメントを利用します。ビュー ページャーを使用して複数のフラグメントを管理すると、スムーズなナビゲーションとページ アニメーションが実現します。開発者は、ビュー ページャーでのユーザーのスワイプなどの外部イベントに応じて、フラグメント内で特定のアクションを実行する必要がある場合があります。ただし、この機能を実装すると、特定の課題に直面する可能性があります。
初期のアプローチと制限事項
最初は、setUserVisibleHint メソッドをオーバーライドすることによって、フラグメントの可視性を検出する試みが行われました。このアプローチは機能しましたが、フラグメントの遷移中に顕著な遅延が発生しました。
別のアプローチでは、ビュー ページャーに登録されたリスナーである OnPageChangeListener を利用することで、フラグメント アクションのタイミングをより詳細に制御できました。ただし、OnPageChangeListener からフラグメント内のメソッドを実行しようとすると、NullPointerException が発生しました。
解決策
解決策は、フラグメント内の各フラグメント インスタンスへの参照を維持することにあります。ポケベルアダプター。 ViewPager は、配列またはコレクションにフラグメント参照を格納するためにオーバーライドできる instantiateItem と呼ばれるメソッドを提供します。 onPageSelected イベント中に、アダプターから目的のフラグメント インスタンスにアクセスし、ネットワーク リクエストの開始などの必要なアクションを実行できます。
サンプル コード (Java)
public class PagerAdapter extends FragmentPagerAdapter {
private Fragment[] fragments;
public PagerAdapter(FragmentManager fm, Context context) {
super(fm);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
fragments[position] = createdFragment;
return createdFragment;
}
}
// Within your activity that hosts view pager:
onPageChangeListener = new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// Assuming you named your fragment FragmentTwo
Fragment frag = adapter.fragments[position];
if (frag != null && frag instanceof FragmentTwo) {
((FragmentTwo) frag).sendGetRequest();
}
}
};
Kotlin と同等 (Kotlin 拡張機能と ViewPager2 を使用)
viewPager.registerOnPageChangeCallback(
object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
val frag = mAdapter.fragments[position]
if (frag is FragmentTwo) {
frag.sendGetRequest()
}
}
}
)
結論
このアプローチを実装すると、ホスティング アクティビティのフラグメントと効果的に通信でき、モバイル アプリケーション内でのシームレスな統合と強化されたユーザー エクスペリエンスが可能になります。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3