Как объявить saveInstanceState при использовании метода onStart - PullRequest
0 голосов
/ 10 сентября 2018

Можно ли использовать if (savedInstanceState == null) {...} в методе onStart для моего фрагмента? Всякий раз, когда я использую его в методе onCreate, мой фрагмент выглядит пустым.

public class MyActivity extends AppCompatActivity {
    private static final String TAG = MyActivity.class.getSimpleName();

    private Boolean mCurrentValue;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "onCreate:::: retrieving preferences");
        SharedPreferences mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        mCurrentValue = mSharedPreferences.getBoolean("my_preference", false);
        Log.d(TAG, "onCreate:::: my_preference and mCurrentValue=" + mCurrentValue);
        if (mCurrentValue) {
            setTheme(R.style.MyDarkAppCompatTheme);
            Log.d(TAG, "onCreate:::: setTheme:MyDarkAppCompatNoActionBarTheme");
        } else {
            setTheme(R.style.MyLightTheme);
            Log.d(TAG, "onCreate:::: setTheme:MyLightAppCompatNoActionBarTheme");
        }

        super.onCreate(savedInstanceState);

        setContentView(R.layout.my_activity);

        if (savedInstanceState == null) {

        }
    }


    // in order to recreate Activity we must check value here because when we come back from another Activity onCreate doesn't called again
    @Override
    protected void onStart() {
        super.onStart();

        setContentView(R.layout.my_activity);

        SharedPreferences mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        Boolean mNewValue = mSharedPreferences.getBoolean("my_preference", false);
        // if value differs from previous Theme, we recreate Activity
        if(mCurrentValue != mNewValue){
            recreate();
        }

        MyFragment newFragment = new MyFragment();
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.detail_container, newFragment);
        transaction.commit();
    }
}

1 Ответ

0 голосов
/ 10 сентября 2018

Нет. Если вам нужно получить доступ к сохраненным фрагментам данных, вам нужно извлечь их из пакета saveInstanceState в onCreate и сохранить их как поля в своей деятельности. Если вам просто нужно определить, было ли воссоздано это действие (как это обычно бывает при проверке того, имеет ли значение selectedInstanceState значение NULL), вы можете объявить логическое поле в вашем действии и установить его в onCreate, когда в поле действия находится сохраненный элемент InstanceState, а затем получить к нему доступ в OnStart:

private boolean activityRecreated;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    activityRecreated = savedInstanceState != null;
}

@Override
public void onStart() {
    if (activityRecreated) {
       // code here
    }
}

РЕДАКТИРОВАТЬ: После получения дополнительной информации о том, в каком состоянии вы пытаетесь сохранить, попробуйте это: В вашей активности должно быть поле, которое отслеживает состояние ViewPager. Этот тег сохраняет вкладку, на которой находится пользователь. Это может быть тег String или Id (int). Вы должны сохранить это, переопределив onSaveInstanceState в своей деятельности:

private int tabIndex = 0 // NOTE: get this from your ViewPager's PagerAdapter
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("tabIndex", tabIndex)
}

затем в onCreate вы можете получить это значение:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
      tabIndex = savedInstanceState.getInt("tabIndex", 0);
      // here, make sure your ViewPager's PagerAdapter is created and set it to this tab
    }
    // rest of your onCreate goes here
}

Сохранение индекса вкладки таким способом позволит воссоздать действие с видимой вкладкой ViewPager.

...