0

我知道這個問題是非常普遍的,我已經閱讀了很多不同的答案,但沒有一個適合我的問題。在我的應用程序中,我有一個活動,並在rhye活動中加載一個片段。我還將一些數據(以Bundle的形式)發送到片段。所以我的問題是當屏幕旋轉時,我保存片段在onSaveInstanceState活動方法和簽入onCreate方法天氣savedInstance爲null或不,並在此基礎上加載片段。 活動代碼:保存自定義對象在屏幕上旋轉在片段或活動

@Override 
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { 
    super.onSaveInstanceState(outState, outPersistentState); 
    outState.putParcelable(Const.TAG_REQ_CUSTOM,DetailsItems); 
    outState.putString(Const.TAG_FLOW, Const.TAG_MAIN_FLOW); 
    getSupportFragmentManager().putFragment(outState,"current_fragment",fragment); 
} 

onCreate方法:

if (findViewById(R.id.fragment_frame) != null) { 
     if (savedInstanceState != null) { 
// this invoke when screen rotate but the app crash 

      DetailsItems = savedInstanceState.getParcelable(Const.TAG_REQ_CUSTOM); 
      String flow = savedInstanceState.getString(Const.TAG_FLOW); 
      ft = getSupportFragmentManager().getFragment(savedInstanceState,"current_fragment"); 
      mFragmentManager=getSupportFragmentManager(); 
      mFragmentTransaction = mFragmentManager.beginTransaction(); 
      bundle= new Bundle(); 
      bundle.putString(Const.TAG_FLOW, flow); 
      bundle.putParcelable(Const.TAG_REQ_BOOKING_DETAILS, bookingDetailsItems); 
      ft.setArguments(bundle); 
      mFragmentTransaction.replace(R.id.fragment_frame, ft).commit(); 
     }else{ 
      // load fragment on first time 
     } 
    } 

所以我的問題是:我在哪裏有保存自定義對象(父活動或片段)? 當我保存的實例並不比應用crashesh和日誌null是:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference 

回答

0

使用此代碼在活動時間:

if (findViewById(R.id.fragment_frame) != null) { 
     if (savedInstanceState != null) { 
fragment =getSupportFragmentManager().getFragment(savedInstanceState,"current_fragment"); 

     }else{ 
      // load fragment on first time 
     } 
    } 

和片段:

//save custom object 

@Override 
    public void onSaveInstanceState(Bundle outState){ 
     super.onSaveInstanceState(outState); 
     outState.putParcelable("key",customObject); 
    } 

//now retrieve here 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    if (savedInstanceState != null) 
    customObject= savedInstanceState.getParcelable("key"); 
} 
+0

假定對象實現'Parcelable'接口,而OP則詢問如何保存/恢復任意對象。 – azizbekian

0

看看onRetainNonConfigurationInstance()getLastNonConfigurationInstance()

從文檔:

被系統調用,爲的一部分摧毀由於配置更改而導致的活動,,當知道將立即爲新配置創建新實例時。您可以返回您在此處喜歡的任何對象,包括活動實例本身,稍後可以通過在新活動實例中調用getLastNonConfigurationInstance()來檢索它。

+0

所以在這裏我救了我的自定義對象....在活動或碎片 – techDigi

+0

你可以從文檔的鏈接看到,這些方法在'Activity'定義。 – azizbekian

0

您應該使用ViewModelViewModel是專門爲此目的而製作的。

從文檔:

視圖模型是一類負責爲一個活動或一個片段製備和管理數據。它還處理Activity/Fragment與其他應用程序的通信(例如調用業務邏輯類)。

相關問題