Instance variable becomes empty in saved fragment

As an alternative, IntentI save the data in a saved headless Fragmentwhen re-creating Activity(my saved object may be quite large and won't fit in size Intent, and I think this is a faster approach than serializing-deserializing in JSON, for example).

I have an idea from this Google documentation , although my implementation is slightly different.

Fragment:

public class DataFragment extends Fragment {

    private Data data;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    public void setData(Data data) {
        this.data = data;
    }

    public Data getData() {
        return data;
    }
}

I save my data in this Fragmentin onSaveInstanceState()my method Activity:

@Override
protected void onSaveInstanceState(Bundle outState) {
    FragmentManager fm = getSupportFragmentManager();
    dataFragment = (DataFragment) fm.findFragmentByTag(TAG_DATA);
    if (dataFragment == null) {
        dataFragment = new DataFragment();
        fm.beginTransaction().add(dataFragment, TAG_DATA).commitNow();
    }
    dataFragment.setData(myData);
    super.onSaveInstanceState(outState);
}

And the corresponding part onCreate():

Data data;
FragmentManager fm = getSupportFragmentManager();
dataFragment = (DataFragment) fm.findFragmentByTag(TAG_DATA);
if (dataFragment == null) {
    // the Fragment is not attached, fetching data from DB
    DatabaseManager dbm = DatabaseManager.getInstance(this);
    data = dbm.getData();
} else {
    // the Fragment is attached, fetching the data from it
    data = dataFragment.getData();
    fm.beginTransaction().remove(dataFragment).commitNow();
}

This works flawlessly on orientation changes.

, , , dataFragment.getData() null.

, onCreate() data null:

data = dataFragment.getData();

?

NullPointerException, dataFragment null.

null?

+4
2

, , - .

" ".

, FragmentActivity super.onCreate(), , .

, X Android Studio, . .

+8

, , , . onCreate() onRestoreInstanceState() Bundle, .

, onCreate() , , , State Bundle , . , , . oncreate():

Data data;
FragmentManager fm = getSupportFragmentManager();
dataFragment = (DataFragment) fm.findFragmentByTag(TAG_DATA);
**if (dataFragment.getData()== null) {**
    // the Fragment is not attached, fetching data from DB
    DatabaseManager dbm = DatabaseManager.getInstance(this);
    data = dbm.getData();
} else {
    // the Fragment is attached, fetching the data from it
    data = dataFragment.getData();
    fm.beginTransaction().remove(dataFragment).commitNow();
}
-2

Source: https://habr.com/ru/post/1656314/


All Articles