代码之家  ›  专栏  ›  技术社区  ›  wbk727

使用“onStart”方法时如何声明savedinstanceState

  •  0
  • wbk727  · 技术社区  · 6 年前

    可以用吗 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 回复  |  直到 6 年前
        1
  •  1
  •   prfarlow    6 年前

    不需要。如果需要访问已保存的数据块,则需要从OnCreate中的SavedInstanceState包中提取它们,并将它们保存为活动中的字段。如果只需要检测是否重新创建了此活动(与检查savedinstancestate是否为空时一样),可以在活动中声明一个布尔字段,并在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状态的字段。此标记保存用户所在的选项卡。它可以是字符串标记或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选项卡可见。