getArguments() возвращает ноль

getArguments() возвращает правильную строку JSON при первом вызове OnCreateView() для Frag1, но не при повторном вызове OnCreateView() для Frag1. Вместо этого аргумент «JSON» имеет значение null.

Деятельность:

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() равны нулю. Вы вызываете put 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