簡體   English   中英

Android saveInstanceState返回始終為null

[英]Android savedInstanceState return always null

我有FragmentA和FragmentB,當我返回FragmentA時我在FragmentB中,我需要加載最后一個值,但我的savedInstanceState返回始終為null:

public static class PlaceholderFragment extends Fragment {

        private boolean active=false;



        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putBoolean("active",active);

        }

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);



        }

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);

            if(savedInstanceState!=null)
            {

                active=savedInstanceState.getBoolean("active");
                if(attivo==true)
                {
                    Toast.makeText(getActivity(),"True",Toast.LENGTH_SHORT).show();
                }
                else
                {
                   Toast.makeText(getActivity(),"False",Toast.LENGTH_SHORT).show();

                }
            }

        }

通過FragmentB我使用:

getFragmentManager().beginTransaction().replace(R.id.container,new PrefFragment()).addToBackStack("back").commit();

在這種特殊情況下,Bundle savedInstanceState將始終返回null,因為只有在您的片段被android系統銷毀並重新創建時(例如,當屏幕旋轉或由於系統資源不足而銷毀您的應用時),該束才會被傳入。 savedInstanceState不用於在應用程序中持久存儲數據,如果要這樣做,建議您使用SharedPreferences:

private void saveBooleanToPreferences(String key, boolean bool){
     SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
     SharedPreferences.Editor editor = preferences.edit();
     editor.putBoolean(key, bool);
     editor.apply();
}

private boolean getBooleanFromPreferences(String key){
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    boolean bool = preferences.getBoolean(key, false);
    return bool;
}

因此,您的代碼將類似於:

 public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean("active",active);
        saveBooleanToPreferences("active",active);
    }

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

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);

            if(savedInstanceState!=null)
            {

                active=getBooleanFromPreferences("active")
                if(attivo==true)
                {
                    Toast.makeText(getActivity(),"True",Toast.LENGTH_SHORT).show();
                }
                else
                {
                   Toast.makeText(getActivity(),"False",Toast.LENGTH_SHORT).show();

                }
            }

確保包含“片段”的活動未覆蓋onSaveInstanceState(或至少調用super方法)。

使用sharedPreferences將數據從片段B傳遞到片段A。

錯誤的是,如果不進行onBackPressed()處理就回退,則您的應用程序將關閉而不保存任何實例,但是如果按home,則將進行保存。 記得在處理backPressed時將其移除

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM