ここでは実際に動作する私の解決策です。フラグメントに通知するためのブロードキャストが含まれます。
@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()
を上書きできます。
いいえ、私はそれを動作させる方法が表示されません。現在のフラグメントへの参照を 'FragmentPagerAdapter.getItem'に保存しておきましょうが、' OnPageChangeListener.onPageSelected'が呼び出されるまでには既にそれは遅すぎます。私はどのフラグメントを**から**に切り替えるのか知っていますが、**からは**ありません。 –
そして、私は 'getItem'は必ず遷移が起こるたびに呼び出されるとは思わない。それは内部的にキャッシュすることができます。 –
私はあなたの意見を見ます。 getItem()から取得する必要はありません。あなたの現在のビューページのページを追跡するのはどうでしょうか?あなたは何でも、インデックス、文字列を使うことができます。次に、onPageSelectedでは、最後のページ参照を格納しているオブジェクトに基づいて参照を取得し、最終的にメソッドを呼び出します。 – Matteo