getArguments() mengembalikan nol

getArguments() mengembalikan string JSON yang benar saat pertama kali OnCreateView() dipanggil untuk Frag1 tetapi tidak ketika saya menggeser ke Frag2 dan OnCreateView() untuk Frag1 dipanggil lagi. Sebaliknya, argumen "JSON" adalah nol.

Aktivitas:

SparkleViewPagerLayout sparkleViewPagerLayout = (SparkleViewPagerLayout) 
findViewById(R.id.view_pager_layout);
FragmentManager fm = getSupportFragmentManager();
sparkleViewPagerLayout.getViewPager().setAdapter(new FragmentPagerAdapter(fm) {
        @Override
        public int getCount() {
            return 4;
        }

        @Override
        public Fragment getItem(int pos) {
            switch (pos) {
                case 0:
                    return Frag0.newInstance(json0);
                case 1:
                    return Frag1.newInstance(json1); // <--THE FAILING FRAGMENT
                case 2:
                    return Frag2.newInstance(json2);
                case 3:
                    return Frag3.newInstance(json3);
                default:
                    return Frag0.newInstance(json0);
            }
        }
    });

Pecahan:

public class Frag1 extends Fragment {
private ArrayList<Thing> things;
private Gson gson = new Gson();

public static Frag1 newInstance(String json) {
    Bundle args = new Bundle();
    args.putString("JSON", json);
    args.putInt("background", R.drawable.img_thing_bg_blurred);
    Frag1 fragment = new Frag1();
    fragment.setArguments(args);

    return fragment;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.thing_detailed, parent, false);
    int background = getArguments().getInt("background");
    Util.setBackground(v, background, getContext());

    String json = getArguments().getString("JSON");
    things = gson.fromJson(json, new TypeToken<ArrayList<Thing>>() {
    }.getType());

    setUpThingOne(v);

    FragmentManager fm = getChildFragmentManager();
    Fragment listFragment = fm.findFragmentById(R.id.thingFragmentListContainer);
    // We removed the thing in position one, need to update the JSON to reflect this change.
    String jsonNew = gson.toJson(things);
    if (listFragment == null) {
        Bundle bundle = new Bundle();
        bundle.putString("THINGLIST", jsonNew);
        listFragment = new ThingListFragment();
        listFragment.setArguments(bundle);
        fm.beginTransaction()
                .add(R.id.ThingFragmentListContainer, listFragment)
                .commit();
    }

    return v;
}

    private void setUpThingOne(View v) {
        TextView name = (TextView) v.findViewById(R.id.thingName);
        TextView type = (TextView) v.findViewById(R.id.thingField);
        ImageView dollarImg = (ImageView) v.findViewById(R.id.thingPrice);
        ImageView bgImg = (ImageView) v.findViewById(R.id.thingBg);

        for (Thing thing : things) {
            if (thing.getPosition() == 1) {
                name.setText(thing.getName());
                type.setText(thing.getField());
                Util.setDollarImage(getContext(), dollarImg, thingSpot.getPrice());
                RequestUtil.getImage2(getContext(), thing.getImage_url(), bgImg);

                //Remove the #1 thing so that we can make a fragment list from the others.
                //things.remove(thing);
                break;
            }
        }
    }
}

Catatan kerusakan:

01-28 13:43:08.117 31378-31378/com.test.test E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.test.test, PID: 31378
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.Iterator java.util.ArrayList.iterator()' on a null object reference
       at com.test.test.fragments.Frag1.setUpThingOne(Frag1.java:78)
       at com.test.test.fragments.Frag1.onCreateView(Frag1.java:48)
       at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)
       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)
       at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
       at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)
       at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570)
       at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
       at android.support.v4.view.ViewPager.populate(ViewPager.java:1106)
       at android.support.v4.view.ViewPager.populate(ViewPager.java:952)
       at android.support.v4.view.ViewPager$3.run(ViewPager.java:251)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
       at android.view.Choreographer.doCallbacks(Choreographer.java:670)
       at android.view.Choreographer.doFrame(Choreographer.java:603)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
       at android.os.Handler.handleCallback(Handler.java:739)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:148)
       at android.app.ActivityThread.main(ActivityThread.java:5417)
       at java.lang.reflect.Method.invoke(Native Method)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

person Jonfor    schedule 28.01.2016    source sumber
comment
posting kode untuk Frag1 (karena ini yang gagal)   -  person petey    schedule 28.01.2016
comment
Anda tidak dapat mengembalikan instance Frag2 jika metode newInstance harus mengembalikan Frag1   -  person David Rauca    schedule 28.01.2016
comment
Diedit lagi. Maaf karena tidak berhati-hati saat mengedit pertama kali!   -  person Jonfor    schedule 28.01.2016
comment
Np. Fragmen itu tampaknya baik-baik saja sekarang. Apakah Anda yakin json1 bukan null saat Anda menambahkannya ke args?   -  person David Rauca    schedule 28.01.2016
comment
Ya. Json ada di sana dengan baik untuk pertama kalinya dan kemudian nol ketika saya menggesernya.   -  person Jonfor    schedule 28.01.2016
comment
Maksud saya di baris ini: return Frag1.newInstance(json1); ... Apakah Anda memeriksa apakah json1 bukan null?   -  person David Rauca    schedule 28.01.2016
comment
Baru saja diperiksa ulang. JSON pasti ada di baris itu.   -  person Jonfor    schedule 28.01.2016


Jawaban (2)


Ya, akhirnya saya tidak terlalu berhati-hati saat melakukan copy paste. Saya pikir itu aneh bahwa onCreateView() dipanggil untuk Frag1 ketika saya menggeser ke Frag2 dan saya menyadari bahwa saya membuat Frag1 baru di Frag2 alih-alih Frag2...Banyak waktu terbuang untuk sesuatu yang seharusnya tidak pernah terjadi!

person Jonfor    schedule 28.01.2016
comment
Wow, saya senang Anda mengetahuinya :). - person h2nghia; 29.01.2016

Tampilan pager menyimpan fragmen Anda di memori. Bisa jadi metode newInstance baru dijalankan saat pertama kali fragmen dibuat. Jika tidak terlihat di layar, onDestroyView()-nya dapat dipanggil, kemudian jika terlihat lagi dan panggilan balik onCreateView() dipanggil (newInstance tidak akan pernah terpicu). Itu menjelaskan mengapa argumen pada onCreateView() adalah nol. Anda memanggil put log di semua callback fragmen untuk melihat status fragmen Anda. Periksa Android untuk detail selengkapnya tentang siklus hidup fragmen.

person h2nghia    schedule 28.01.2016
comment
onCreateView() di Frag1 dipanggil saat saya menggeser ke Frag2. Saya bahkan tidak dapat menggesernya kembali karena aplikasi mogok saat saya menggeser ke Frag2. Selain itu, argumen latar belakang int masih ada. Hanya JSON yang menjadi nol. - person Jonfor; 28.01.2016
comment
@Jonfor, bagaimana json Anda diinisialisasi? Anda dapat meletakkan log untuk melihat berapa kali metode newInstance dijalankan di pos 1? - person h2nghia; 28.01.2016
comment
newInstance dipanggil satu kali. Json dikirim dari aktivitas lain dan ditempatkan di onCreate() aktivitas baru: final String json1 = getIntent().getStringExtra("JSON"); - person Jonfor; 28.01.2016
comment
Oke, tidak apa-apa. Kita perlu mengetahui mengapa onCreateView dipanggil untuk kedua kalinya. Bisakah Anda memposting postingan crash log saat Anda menggeser ke Frag2. - person h2nghia; 28.01.2016
comment
Menambahkan log kerusakan. - person Jonfor; 28.01.2016