FragmentPagerAdapterを使用するときに既存のフラグメントを取得する方法


99

私は、問題私の破片が介して互いに通信すること持ってActivity使用しているが、FragmentPagerAdapterヘルパークラスとして、その実装のタブの管理と接続のすべての詳細ViewPagerに関連するとTabHost。私はFragmentPagerAdapter、AndroidサンプルプロジェクトSupport4Demosによって提供されるのと同じように実装しました

主な質問はFragmentManager、IDもタグもない場合に特定のフラグメントを取得するにはどうすればよいですか?FragmentPagerAdapterフラグメントを作成し、IDとタグを自動生成しています。



@ jk2Kこれは、1年後に尋ねられた質問の複製です
Davi

@Dawitはラベルと同じように複製されますが、時間とは関係ありません。後の質問はより高いビューを持っています
jk2K

ここでの回答のほとんどは本番
環境

回答:


194

問題の要約

注:この回答ではFragmentPagerAdapter、そのソースコードと参照します。ただし、一般的な解決策はにも適用されFragmentStatePagerAdapterます。

あなたがこれを読んでいる場合、あなたはおそらく既にそれは知っているFragmentPagerAdapter/ FragmentStatePagerAdapter作成するためのものですFragments、あなたのためにViewPager、これらは(デバイスの回転やシステムからメモリを取り戻すにアプリを殺すかどうか)が、活動レクリエーション時にFragments再び作成され、代わりに自分のことはありませんから取得したインスタンスFragmentManager。ここで、それらに取り組むActivityためにこれらFragmentsへの参照を取得する必要があると言います。内部で設定されているため、これらのforidまたはtagforは作成されていません。したがって、問題はその情報なしでそれらへの参照を取得する方法です...FragmentsFragmentPagerAdapter

現在のソリューションの問題:内部コードに依存

これと同様の質問で私が見たソリューションの多くは、内部で作成されたタグをFragment呼び出しFragmentManager.findFragmentByTag()て模倣することにより、既存のものへの参照を取得することに依存しています。これの問題は、内部ソースコードに依存していることです。これは、ご存じのとおり、永久に同じままであることが保証されているわけではありません。GoogleのAndroidエンジニアは、既存のへの参照を見つけることができずにコードが壊れる構造を変更することを簡単に決定できます。"android:switcher:" + viewId + ":" + idtagFragments

内部に依存しない代替ソリューション tag

これは、の内部セットに依存しないFragments、によって返されるへの参照を取得する方法の簡単な例です。キーはオーバーライドすることですFragmentPagerAdaptertagsFragmentsinstantiateItem()代わりに参照して保存することgetItem()です。

public class SomeActivity extends Activity {
    private FragmentA m1stFragment;
    private FragmentB m2ndFragment;

    // other code in your Activity...

    private class CustomPagerAdapter extends FragmentPagerAdapter {
        // other code in your custom FragmentPagerAdapter...

        public CustomPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            // Do NOT try to save references to the Fragments in getItem(),
            // because getItem() is not always called. If the Fragment
            // was already created then it will be retrieved from the FragmentManger
            // and not here (i.e. getItem() won't be called again).
            switch (position) {
                case 0:
                    return new FragmentA();
                case 1:
                    return new FragmentB();
                default:
                    // This should never happen. Always account for each position above
                    return null;
            }
        }

        // Here we can finally safely save a reference to the created
        // Fragment, no matter where it came from (either getItem() or
        // FragmentManger). Simply save the returned Fragment from
        // super.instantiateItem() into an appropriate reference depending
        // on the ViewPager position.
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
            // save the appropriate reference depending on position
            switch (position) {
                case 0:
                    m1stFragment = (FragmentA) createdFragment;
                    break;
                case 1:
                    m2ndFragment = (FragmentB) createdFragment;
                    break;
            }
            return createdFragment;
        }
    }

    public void someMethod() {
        // do work on the referenced Fragments, but first check if they
        // even exist yet, otherwise you'll get an NPE.

        if (m1stFragment != null) {
            // m1stFragment.doWork();
        }

        if (m2ndFragment != null) {
            // m2ndFragment.doSomeWorkToo();
        }
    }
}

またはあなたが作業する場合はtags代わりに、クラスのメンバ変数の/への参照は、FragmentsあなたもつかむことができますtagsことでセットをFragmentPagerAdapter同じように:注:これはには適用されませんFragmentStatePagerAdapter、それが設定されていませんので、tagsそのを作成するときFragments

@Override
public Object instantiateItem(ViewGroup container, int position) {
    Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
    // get the tags set by FragmentPagerAdapter
    switch (position) {
        case 0:
            String firstTag = createdFragment.getTag();
            break;
        case 1:
            String secondTag = createdFragment.getTag();
            break;
    }
    // ... save the tags somewhere so you can reference them later
    return createdFragment;
}

このメソッドは内部の模倣に依存しないことに注意してください tagセットのFragmentPagerAdapter適切なAPIを使用してそれらを取得することに注意してください。このようにしてもtag、将来のバージョンでの変更はSupportLibrary安全です。


忘れないで、あなたのデザインに応じていることをActivityFragmentsあなたは日に仕事にしようとしているか、あなたが持っているそうで、そのためにアカウントに、まだ存在しないかもしれないnull、あなたの参照を使用する前にチェックを。

また、代わりにを使用している場合はFragmentStatePagerAdapter、ハード参照をFragments多く保持している可能性があり、ハード参照がメモリに不必要に保持するため、ハード参照を保持したくない場合があります。代わりに、Fragment参照WeakReferenceを標準の変数ではなく変数に保存します。このような:

WeakReference<Fragment> m1stFragment = new WeakReference<Fragment>(createdFragment);
// ...and access them like so
Fragment firstFragment = m1stFragment.get();
if (firstFragment != null) {
    // reference hasn't been cleared yet; do work...
}

3
これは本当に良い解決策ですが、中に渡されますどのように多くの断片がわからない場合、その有効性を失っているようだ。
暴動はウーフゴーズ

3
@Zorpixでは、作成フラグメントをHashMapに保存できます。map.put(position、createdFragment);
Tom Bevelander、2015年

12
これはチェックマークに値します!これを達成するための非常に賢明で包括的な方法。あなたは私にたくさん助けてくれてありがとう!
young_souvlaki 2016年

2
最初、このソリューションは複雑すぎるように見えたので、スキップしました。しかし、他の答えが満足のいくものではなかったので、ようやく私はそれに戻りました。そして、それは思ったほど難しくはありませんでした。
Suragch 16

1
何もオーバーライドする必要はありませんし、実際にオーバーライドすべきではありませinstantiateItem。これを行うための適切な方法ですることです呼ん instantiateItemonCreate囲まあなたの活動の方法startUpdatefinishUpdate。詳細については私の回答を参照してください
morgwai

82

私は次の投稿に基づいて私の質問に対する回答を見つけました:fragmentpageradapterでフラグメントを再利用する

私が学んだこと:

  1. getItem(int position)で、FragmentPagerAdapterこのメソッドが実際に行うことのかなり誤解を招く名前です。既存のフラグメントを返すのではなく、新しいフラグメントを作成します。その意味で、メソッドは次のような名前に変更する必要がありますcreateItem(int position) Android SDKのます。したがって、このメソッドはフラグメントの取得に役立ちません。
  2. ポストサポートFragmentPagerAdapterholdsでの古いフラグメントへの参照の説明に基づいて、フラグメントの作成はに任せるFragmentPagerAdapter必要があります。つまり、フラグメントやそのタグへの参照はありません。ただし、フラグメントタグがある場合は、FragmentManagerを呼び出すことで、への参照を簡単に取得できますfindFragmentByTag()。特定のページ位置にあるフラグメントのタグを見つける方法が必要です。

解決

クラスに次のヘルパーメソッドを追加して、フラグメントタグを取得し、findFragmentByTag()メソッドに送信します。

private String getFragmentTag(int viewPagerId, int fragmentPosition)
{
     return "android:switcher:" + viewPagerId + ":" + fragmentPosition;
}

注意!これはFragmentPagerAdapter、新しいフラグメントを作成するときに使用する方法と同じです。このリンクhttp://code.google.com/p/openintents/source/browse/trunk/compatibility/AndroidSupportV2/src/android/support/v2/app/FragmentPagerAdapter.java#104を参照してください。


ところで、このQ&Aにおけるトピックの詳細があります:stackoverflow.com/questions/6976027/...
トーマス

1
viewId入力パラメーターとは何ですか?どちらの見方?
Nilzor 2014

@Nilzor viewIdはViewPagerのIDです。
Dr.jacky 2014

おそらく、タグを推測する代わりに、フラグメントはタグにそのアクティビティを示すことができますonAttach()か?
盆地

4
これは正しい方法ではありません。@Tony Chanの答えは最良かつ正しい方法です。
Morteza Rastgoo

16

フラグメントタグを手動で作成instantiateItemして、内部makeFragmentNameメソッドとの互換性をオーバーライドしたり、互換性に依存したりする必要はありません。
instantiateItemパブリックメソッドであるため、javadocで説明されているように、メソッドの呼び出しとメソッドで囲まれたアクティビティのメソッドで呼び出すことができ、実際に呼び出す必要onCreateあります。startUpdatefinishUpdatePagerAdapter

PagerAdapterメソッドstartUpdate(ViewGroup)の呼び出しは、ViewPagerのコンテンツが変更されようとしていることを示しています。instantiateItem(ViewGroup、int)および/またはdestroyItem(ViewGroup、int、Object)への1回以上の呼び出しが続き、更新の終了は、finishUpdate(ViewGroup)の呼び出しによって通知されます。

その後、上記の方法で、必要に応じてフラグメントのインスタンスへの参照をローカル変数に格納できます。例を参照してください:

public class MyActivity extends AppCompatActivity {

    Fragment0 tab0; Fragment1 tab1;

    @Override protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.myLayout);
        ViewPager viewPager = (ViewPager) findViewById(R.id.myViewPager);
        MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(adapter);
        ((TabLayout) findViewById(R.id.tabs)).setupWithViewPager(viewPager);

        adapter.startUpdate(viewPager);
        tab0 = (Fragment0) adapter.instantiateItem(viewPager, 0);
        tab1 = (Fragment1) adapter.instantiateItem(viewPager, 1);
        adapter.finishUpdate(viewPager);
    }

    class MyPagerAdapter extends FragmentPagerAdapter {

        public MyPagerAdapter(FragmentManager manager) {super(manager);}

        @Override public int getCount() {return 2;}

        @Override public Fragment getItem(int position) {
            if (position == 0) return new Fragment0();
            if (position == 1) return new Fragment1();
            return null;  // or throw some exception
        }

        @Override public CharSequence getPageTitle(int position) {
            if (position == 0) return getString(R.string.tab0);
            if (position == 1) return getString(R.string.tab1);
            return null;  // or throw some exception
        }
    }
}

instantiateItemは、最初にから既存のフラグメントインスタンスへの参照を取得しようとしますFragmentManager。それらがまだ存在しない場合にのみgetItem、アダプタからのメソッドを使用して新しいものを作成し、それらをFragmentManagerし、将来の使用のためにます。

フラグメントへの参照を取得する必要がない場合でも、次のようにメソッドで/ でinstantiateItem囲まれたすべてのタブを呼び出す必要があることに注意してください。startUpdatefinishUpdateonCreate

    adapter.startUpdate(viewPager);
    // ignoring return values of the below 2 calls, just side effects matter:
    adapter.instantiateItem(viewPager, 0);
    adapter.instantiateItem(viewPager, 1);
    adapter.finishUpdate(viewPager);

そうしないと、フラグメントインスタンスがコミットされない危険性がありますFragmentManager。アクティビティがフォアグラウンドinstantiateItemになると、フラグメントを取得するために自動的に呼び出されますが、startUpdate/ 実装しないfinishUpdate 場合もあり ますが、基本的にはを開始/コミットします。 これは、ことがあり非常に迅速に失われて作成されたフラグメントのインスタンスへの参照になる(たとえば、あなたの画面を回転させたとき)とはるかに頻繁に必要以上に再作成しました。フラグメントの「重さ」によっては、パフォーマンスに無視できない結果が生じる可能性があります。 また、このような場合にはフラグメントのインスタンスがローカルVARSに格納されているかもしれませんFragmentTransaction

古くなります:androidプラットフォームそれらを取得しようFragmentManager 何らかの理由で失敗し、新しい変数が作成されて使用されますが、varはまだ古い変数を参照しています。


1
場合によっては、それが最善の解決策になるかもしれません。しかし、FragmentMangerがフラグメントを削除して再生成するとどうなりますか?
woltran

1
@woltran FragmentManagerはランダムに殺すことはできません(ここではdestroyが正しい言葉です)。あなたがFragmentFragment現在表示されているを殺すことにした場合はどうなるかを考えてください;))。通常、aのライフサイクルFragmentはそれにバインドされますActivity(詳細はgithub.com/xxv/android-lifecycleを参照してください)-> a Fragmentは、破棄された場合にのみ破棄できActivityます。ユーザーのナビゲートが与えられたに戻り、このような場合にはActivity、そのがonCreate再び呼び出されるとの新しいインスタンスFragmentが作成されます。
morgwai 2017年

これは本当の答えです
MJ Studio

たとえば、ユーザーがViewPagerをスクロールするときに作成されるフラグメントに依存するのではなく、実際にフラグメントを作成する必要がありますか?
Yar

@はいはい、あなたは本当にすべきです。私が提供したドキュメントの抜粋はそれを明確に述べており、「いくつかの追加情報」セクションはその理由を説明しています。
モーグワイ

11

私がした方法は、次のようにWeakReferencesのHashtableを定義することです。

protected Hashtable<Integer, WeakReference<Fragment>> fragmentReferences;

次に、次のようにgetItem()メソッドを記述しました。

@Override
public Fragment getItem(int position) {

    Fragment fragment;
    switch(position) {
    case 0:
        fragment = new MyFirstFragmentClass();
        break;

    default:
        fragment = new MyOtherFragmentClass();
        break;
    }

    fragmentReferences.put(position, new WeakReference<Fragment>(fragment));

    return fragment;
}

次に、メソッドを記述できます。

public Fragment getFragment(int fragmentId) {
    WeakReference<Fragment> ref = fragmentReferences.get(fragmentId);
    return ref == null ? null : ref.get();
}

これはうまくいくようで、私はそれが

"android:switcher:" + viewId + ":" + position

これは、FragmentPagerAdapterの実装方法に依存しないためです。もちろん、フラグメントがFragmentPagerAdapterによって解放されている場合、またはまだ作成されていない場合、getFragmentはnullを返します。

誰かがこのアプローチに問題を見つけた場合は、コメントを歓迎します。


int fragmentId名前を変更する必要がありますint position
lmaooooo 2015年

7
私は非常に似たアプローチを使用していました。ただし、ページャーがsavedStateバンドルから作成されると、これは失敗します。例:アクティビティはバックグラウンドになり、onSavedStateInstance()が呼び出された後にフォアグラウンドに戻ります。その場合、getItem()メソッドは呼び出されません。
Anoop 2015年

FragmentManagerには常にup2dateのマップが既にあるため、独自のマップを作成する理由は何ですか?詳細については、私の回答を参照してください。
morgwai 16

また、フラグメントが破棄されたという事実は、そのフラグメントへの強い参照がないことを保証するものではありません(その可能性は高いですが保証されていません)。この場合、マップには古いフラグメントが含まれています。
morgwai 2017

1
システムがフラグメントを再作成した後、これは正しく機能しません。
EpicPandaForce

10

現在のフラグメントへの参照を取得するために機能するこのメソッドを作成しました。

public static Fragment getCurrentFragment(ViewPager pager, FragmentPagerAdapter adapter) {
    try {
        Method m = adapter.getClass().getSuperclass().getDeclaredMethod("makeFragmentName", int.class, long.class);
        Field f = adapter.getClass().getSuperclass().getDeclaredField("mFragmentManager");
        f.setAccessible(true);
        FragmentManager fm = (FragmentManager) f.get(adapter);
        m.setAccessible(true);
        String tag = null;
        tag = (String) m.invoke(null, pager.getId(), (long) pager.getCurrentItem());
        return fm.findFragmentByTag(tag);
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } 
    return null;
}

パフォーマンスを向上させるためにメソッドの外でメソッドとフィールドを作成したことを覚えておくのはいいことです
Marcos Vasconcelos 2017年

2

@ personne3000によって提案された解決策は素晴らしいですが、問題が1つあります。アクティビティがバックグラウンドに移動し、システムによって(空きメモリを取得するために)強制終了され、その後復元されると、fragmentReferencesは空になります。getItemなります呼ばれた。

以下のクラスはそのような状況を扱います:

public abstract class AbstractHolderFragmentPagerAdapter<F extends Fragment> extends FragmentPagerAdapter {

    public static final String FRAGMENT_SAVE_PREFIX = "holder";
    private final FragmentManager fragmentManager; // we need to store fragment manager ourselves, because parent's field is private and has no getters.

    public AbstractHolderFragmentPagerAdapter(FragmentManager fm) {
        super(fm);
        fragmentManager = fm;
    }

    private SparseArray<WeakReference<F>> holder = new SparseArray<WeakReference<F>>();

    protected void holdFragment(F fragment) {
        holdFragment(holder.size(), fragment);
    }

    protected void holdFragment(int position, F fragment) {
        if (fragment != null)
            holder.put(position, new WeakReference<F>(fragment));
    }

    public F getHoldedItem(int position) {
        WeakReference<F> ref = holder.get(position);
        return ref == null ? null : ref.get();
    }

    public int getHolderCount() {
        return holder.size();
    }

    @Override
    public void restoreState(Parcelable state, ClassLoader loader) { // code inspired by Google's FragmentStatePagerAdapter implementation
        super.restoreState(state, loader);
        Bundle bundle = (Bundle) state;
        for (String key : bundle.keySet()) {
            if (key.startsWith(FRAGMENT_SAVE_PREFIX)) {
                int index = Integer.parseInt(key.substring(FRAGMENT_SAVE_PREFIX.length()));
                Fragment f = fragmentManager.getFragment(bundle, key);
                holdFragment(index, (F) f);
            }
        }
    }

    @Override
    public Parcelable saveState() {
        Bundle state = (Bundle) super.saveState();
        if (state == null)
            state = new Bundle();

        for (int i = 0; i < holder.size(); i++) {
            int id = holder.keyAt(i);
            final F f = getHoldedItem(i);
            String key = FRAGMENT_SAVE_PREFIX + id;
            fragmentManager.putFragment(state, key, f);
        }
        return state;
    }
}

1

フラグメントへのハンドルを取得する際の主な障害は、getItem()に依存できないことです。方向が変更された後、フラグメントへの参照はnullになり、getItem()は再び呼び出されません。

タグを取得するためにFragmentPagerAdapterの実装に依存しないアプローチを次に示します。getItem()から作成された、またはフラグメントマネージャーから見つかったフラグメントを返すinstantiateItem()をオーバーライドします。

@Override
public Object instantiateItem(ViewGroup container, int position) {
    Object value =  super.instantiateItem(container, position);

    if (position == 0) {
        someFragment = (SomeFragment) value;
    } else if (position == 1) {
        anotherFragment = (AnotherFragment) value;
    }

    return value;
}

0

FragmentPagerAdapterからフラグメントを返す方法については、この投稿を参照してください。フラグメントのインデックスを知っているかどうかに依存しますが、これはgetItem()で設定されます(インスタンス化時のみ)


0

タグの代わりにIDを使用してこの問題を解決することができました。(私はonAttachメソッドをオーバーライドしたカスタムFragmentsを使用して定義したFragmentStatePagerAdapterを使用しています。ここで、IDをどこかに保存します。

@Override
public void onAttach(Context context){
    super.onAttach(context);
    MainActivity.fragId = getId();
}

次に、アクティビティ内でフラグメントに簡単にアクセスします。

Fragment f = getSupportFragmentManager.findFragmentById(fragId);

0

これが最善の方法かどうかはわかりませんが、他に何もうまくいきませんでした。getActiveFragmentを含む他のすべてのオプションがnullを返すか、アプリをクラッシュさせました。

画面の回転でフラグメントが添付されていることに気付いたので、それを使用してフラグメントをアクティビティに送り返しました。

フラグメントでは:

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        mListener = (OnListInteractionListener) activity;
        mListener.setListFrag(this);
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

次に、アクティビティで:

@Override
public void setListFrag(MyListFragment lf) {
    if (mListFragment == null) {
        mListFragment = lf;
    }
}

そして最後にアクティビティonCreate()で:

if (savedInstanceState != null) {
    if (mListFragment != null)
        mListFragment.setListItems(items);
}

このアプローチは、新しいフラグメントを作成せずに、実際の可視フラグメントをアクティビティに添付します。


0

私はJava / Androidの比較的初心者なので、私の方法がこれを行うための正しい方法または最良の方法であるかどうかはわかりませんが、それはうまくいきました(オブジェクト指向の原則に違反していると確信していますが、私のユースケースでは他の解決策は機能していません)。

私はFragmentStatePagerAdapterでViewPagerを使用していたホスティングアクティビティがありました。FragmentStatePagerAdapterによって作成されたフラグメントへの参照を取得するために、フラグメントクラス内にコールバックインターフェイスを作成しました。

public interface Callbacks {
    public void addFragment (Fragment fragment);
    public void removeFragment (Fragment fragment);
}

ホスティングアクティビティでインターフェイスを実装し、フラグメントを追跡するためのLinkedHasSetを作成しました。

public class HostingActivity extends AppCompatActivity implements ViewPagerFragment.Callbacks {

    private LinkedHashSet<Fragment> mFragments = new LinkedHashSet<>();

    @Override
    public void addFragment (Fragment fragment) {
        mFragments.add(fragment);
    }

    @Override
    public void removeFragment (Fragment fragment) {
        mFragments.remove(fragment);
    }
}

ViewPagerFragmentクラス内で、フラグメントをonAttach内のリストに追加し、onDetach内で削除しました。

public class ViewPagerFragment extends Fragment {

    private Callbacks mCallbacks;

    public interface Callbacks {
        public void addFragment (Fragment fragment);
        public void removeFragment (Fragment fragment);
    } 

    @Override
    public void onAttach (Context context) {
        super.onAttach(context);
        mCallbacks = (Callbacks) context;
        // Add this fragment to the HashSet in the hosting activity
        mCallbacks.addFragment(this);
    }

    @Override
    public void onDetach() {
        super.onDetach();
        // Remove this fragment from the HashSet in the hosting activity
        mCallbacks.removeFragment(this);
        mCallbacks = null;
    }
}

ホスティングアクティビティ内で、mFragmentsを使用して、現在FragmentStatePagerAdapterに存在するフラグメントを反復処理できるようになります。


0

このクラスは、内部タグに依存せずにトリックを実行します。警告:フラグメントには、getFragmentメソッドを使用してアクセスし、getItemを使用しないでください。

public class ViewPagerAdapter extends FragmentPagerAdapter {

    private final Map<Integer, Reference<Fragment>> fragments = new HashMap<>();
    private final List<Callable0<Fragment>> initializers = new ArrayList<>();
    private final List<String> titles = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    void addFragment(Callable0<Fragment> initializer, String title) {
        initializers.add(initializer);
        titles.add(title);
    }

    public Optional<Fragment> getFragment(int position) {
        return Optional.ofNullable(fragments.get(position).get());
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment =  initializers.get(position).execute();
        return fragment;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Fragment fragment = (Fragment) super.instantiateItem(container, position);
        fragments.put(position, new WeakReference<>(fragment));
        return fragment;
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        return titles.get(position);
    }
}

-5

このコードを試してみてください

public class MYFragmentPAdp extends FragmentPagerAdapter {

    public MYFragmentPAdp(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return 2;
    }

     @Override
     public Fragment getItem(int position) {
         if (position == 0)
             Fragment fragment = new Fragment1();
         else (position == 1)
             Fragment fragment = new Fragment2();
         return fragment;
     }
}

ナジブは、私が以下の私の回答で説明したように、指定された名前がgetであり、createではないと予想できるため、既存のフラグメントを返す代わりに、新しいフラグメントを作成しています。同じ投稿で私のソリューションを参照してください。
Ismar Slomic

フラグメントフラグメント= new YourCustomFragmentClass(); ここに書いて、これを確認してください。
Najib Ahmed Puthawala

私はまだどのように、この変更は、既存の1つを得るの代わりに新しいフラグメントを作成しているという事実..理解しない
Ismar Slomic

Fragment fragment = new YourFragment();のように、引き続きカスタムフラグメントのみを初期化して返します。フラグメントを返す。
Najib Ahmed Puthawala
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.