如何在使用'onStart'方法时声明savedInstanceState

问题描述 投票:0回答:1

是否可以在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();
    }
}
java android android-activity android-preferences
1个回答
1
投票

否。如果您需要访问已保存的数据,则需要从onCreate中的savedInstanceState Bundle中提取它们,并将它们保存为Activity中的字段。如果您只需要检测是否重新创建了此Activity(通常检查savedInstanceState是否为null),您可以在Activity中声明一个布尔字段,并在savedInstanceState在范围内时将其设置在onCreate中,然后在在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)标记。您应该通过覆盖Activity中的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选项卡重新创建活动。

© www.soinside.com 2019 - 2024. All rights reserved.