getArguments() ส่งคืนค่าว่าง

getArguments() ส่งคืนสตริง JSON ที่ถูกต้องในครั้งแรกที่เรียกใช้ OnCreateView() สำหรับ Frag1 แต่ไม่ใช่เมื่อฉันปัดไปที่ Frag2 และ OnCreateView() สำหรับ Frag1 จะถูกเรียกอีกครั้ง อาร์กิวเมนต์ "JSON" จะเป็นโมฆะแทน

กิจกรรม:

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);
            }
        }
    });

ส่วน:

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;
            }
        }
    }
}

บันทึกข้อขัดข้อง:

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 แหล่งที่มา
comment
โพสต์รหัสสำหรับ Frag1 (เนื่องจากนี่คือรหัสที่ล้มเหลว)   -  person petey    schedule 28.01.2016
comment
คุณไม่สามารถส่งคืนอินสแตนซ์ของ Frag2 ได้หากวิธี newInstance ควรส่งคืน Frag1   -  person David Rauca    schedule 28.01.2016
comment
แก้ไขอีกครั้ง. ขออภัยที่ไม่ระมัดระวังในการแก้ไขครั้งแรก!   -  person Jonfor    schedule 28.01.2016
comment
เอ็นพี ตอนนี้ชิ้นส่วนดูเหมือนจะโอเคแล้ว คุณแน่ใจหรือว่า json1 ไม่เป็นโมฆะเมื่อคุณเพิ่มลงใน args   -  person David Rauca    schedule 28.01.2016
comment
ใช่. json อยู่ที่นั่นได้อย่างสมบูรณ์แบบในครั้งแรกและเป็นโมฆะเมื่อฉันปัดออกไป   -  person Jonfor    schedule 28.01.2016
comment
ฉันหมายถึงที่บรรทัดนี้: return Frag1.newInstance(json1); ... คุณตรวจสอบว่า json1 ไม่เป็นโมฆะหรือไม่?   -  person David Rauca    schedule 28.01.2016
comment
เพิ่งตรวจสอบสองครั้ง JSON อยู่ที่นั่นอย่างแน่นอน   -  person Jonfor    schedule 28.01.2016


คำตอบ (2)


ท้ายที่สุดฉันก็ไม่ระมัดระวังมากนักเมื่อทำการคัดลอกและวาง ฉันคิดว่ามันแปลกที่ onCreateView() ถูกเรียกสำหรับ Frag1 ตอนที่ฉันปัดไปที่ Frag2 และฉันรู้ว่าฉันกำลังสร้าง Frag1 ใหม่ใน Frag2 แทนที่จะเป็น Frag2...เสียเวลาไปหลายชั่วโมงกับสิ่งที่ไม่ควรเกิดขึ้น!

person Jonfor    schedule 28.01.2016
comment
ว้าว ฉันดีใจที่คุณเข้าใจ :) - person h2nghia; 29.01.2016

เพจเจอร์มุมมองเก็บแฟรกเมนต์ของคุณไว้ในหน่วยความจำ อาจเป็นไปได้ว่าเมธอด newInstance เพิ่งรันเป็นครั้งแรกที่มีการสร้างแฟรกเมนต์ เมื่อไม่สามารถมองเห็นได้บนหน้าจอ onDestroyView() อาจถูกเรียก จากนั้นเมื่อมองเห็นได้อีกครั้ง และการเรียกกลับ onCreateView() จะถูกเรียก (newInstance จะไม่ถูกทริกเกอร์) นั่นอธิบายว่าทำไมข้อโต้แย้งใน onCreateView() จึงเป็นโมฆะ คุณโทรใส่ log ในการเรียกกลับแฟรกเมนต์ทั้งหมดเพื่อดูสถานะของแฟรกเมนต์ของคุณ ตรวจสอบ Android เพื่อดูรายละเอียดเพิ่มเติมเกี่ยวกับวงจรชีวิตของแฟรกเมนต์

person h2nghia    schedule 28.01.2016
comment
onCreateView() บน Frag1 กำลังถูกเรียกเมื่อฉันปัดไปที่ Frag2 ฉันไม่สามารถปัดมันกลับเข้าไปได้เพราะแอปขัดข้องในขณะที่ฉันปัดไปที่ Frag2 นอกจากนี้ อาร์กิวเมนต์ int ของพื้นหลังยังคงอยู่ที่นั่น เฉพาะ JSON เท่านั้นที่จะเป็นโมฆะ - person Jonfor; 28.01.2016
comment
@Jonfor json ของคุณเริ่มต้นอย่างไร คุณสามารถใส่ log เพื่อดูว่ามีการดำเนินการเมธอด newInstance ที่ตำแหน่ง 1 กี่ครั้ง - person h2nghia; 28.01.2016
comment
newInstance ถูกเรียกหนึ่งครั้ง json ถูกส่งเข้ามาจากกิจกรรมอื่นและถูกวางไว้ใน onCreate(): final String json1 = getIntent().getStringExtra("JSON"); ของกิจกรรมใหม่ - person Jonfor; 28.01.2016
comment
โอเค นั่นก็ดี เราจำเป็นต้องรู้ว่าเหตุใด onCreateView จึงถูกเรียกเป็นครั้งที่สอง คุณช่วยโพสต์โพสต์ crash log เมื่อคุณปัดไปที่ Frag2 ได้ไหม - person h2nghia; 28.01.2016
comment
เพิ่มบันทึกข้อขัดข้อง - person Jonfor; 28.01.2016