2017-06-03 386 views
0

我遇到從詳細信息頁返回給其父母的問題。問題在於它有三個層次,問題是從第三層回到第二層。 想象一下發票列表。點擊它們中的一個,並將發票的細節與發票中的訂單項列表一起加載。點按訂單項,然後轉到與該訂單項的詳細信息相關的第三個活動。該生產線項目通過像這樣自來水響應啓動...Android主詳細信息詳細信息

[編輯補充清單信息]

<activity 
    android:name=".InvocieListActivity" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme.NoActionBar"> 
</activity> 

<activity 
    android:name=".InvoiceDetailActivity" 
    android:label="@string/title_activity_invoice_detail" 
    android:parentActivityName=".InvoiceListActivity" 
    android:theme="@style/AppTheme.NoActionBar"> 
    <meta-data 
     android:name="android.support.PARENT_ACTIVITY" 
     android:value="com.myweb.ree.InvocieListActivity"/> 
</activity> 

<activity 
    android:name=".InvoiceItemDetailActivity" 
    android:label="@string/title_activity_invoiceitem_detail" 
    android:parentActivityName=".InvoiceDetailActivity" 
    android:theme="@style/AppTheme.NoActionBar"> 
    <meta-data 
     android:name="android.support.PARENT_ACTIVITY" 
     android:value="com.myweb.ree.InvoiceDetailActivity"/> 
</activity> 

private BroadcastReceiver invoiceItemReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(ACTION_INVOICEITEM_TAPPED)) { 
      String invoiceItemId = intent.getStringExtra(Constants.MSG_DATA); 
      if (invoiceItemId != null && invoiceItemId.length() > 0) { 
       launchInvoiceItemActivity(invoiceItemId); 
      } 
     } 
    } 
}; 

private void launchInvoiceItemActivity(String invoiceItemId) { 
    Intent intent = new Intent(this, InvoiceItemDetailActivity.class); 
    intent.putExtra(ARG_InvoiceItem_ID, invoiceItemId); 
    this.startActivity(intent); 
} 

發票細節有getSupportActionBar().setDisplayHomeAsUpEnabled(true);,以便它可以返回到發票的列表。訂單項詳細信息頁面具有相同的行,以允許後退按鈕轉到發票。

當我點擊訂單項明細活動的後退按鈕時,它無法加載發票,因爲它沒有從原始列表中傳入的發票號。

我知道我可以重寫onBackPressed並創建一個啓動它的父項而不是讓框架執行它的意圖。我的問題是,這會混淆框架在父子導航的情況下保留的任何內部視圖堆棧嗎?有沒有其他方法可以跟蹤主視圖中的項目,以便在從詳細視圖返回時可以重新載入正確的內容?

TIA 邁克

回答

2

從代碼段和描述中,我可以理解,後面堆就會像

InvoiceListActivity - > InvoiceDetailsActivity - > InvoiceItemDetailActivity。

現在在每個子活動中重寫onOptionsItemSelected方法。

例如:在InvoiceItemDetailActivity類中,覆蓋如下所示的方法。

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
switch (item.getItemId()) { 
    // Respond to the action bar's Up/Home button 
    case android.R.id.home: 
    // this will finish the current activity. and as the activity behind this in the back stack is InvoiceDetailsActivity, the same will just be resumed. 
     finish(); 
     return true; 
} 
return super.onOptionsItemSelected(item); 

}

同樣可以InvoiceDetailsActivity進行爲好。希望這能解決你的問題。

+0

謝謝。奇蹟般有效 :) – Mikey

0

所有它首先看起來像你的第二個活動被破壞掉了。這就是爲什麼當你返回新實例沒有發票號碼。要解決此問題,您可以通過覆蓋onSaveInstanceStateonRestoreInstanceState來保存第二活動狀態(發票號碼等)。然後,您可以保存第二個活動狀態,並在從第三個狀態恢復時進行恢復。

您還可以將發票號碼保存到SharedPreferences。但是,每次使用不同的發票號碼啓動此活動時,您都需要更新其值,以保持一致性。您可以在onCreate()或/和onNewIntent()中執行此操作,具體取決於Activity配置。並在onResume()中讀取此值。

+0

j2ko在主細節導航中,顯示詳細信息頁面時主活動是否被破壞?我更熟悉iOS中的詳細信息頁面加載在母版頁的頂部。 手動導航返回到第2級並將第二級id傳遞回來沒有問題。我想如果2級被破壞,那麼我不能干擾導航堆棧。 – Mikey

+0

這取決於。 Android決定何時銷燬一個活動(內存問題或其他一些原因)。但它保持了堆棧的完整性,所以當你回去時它會重新創建它。如果你會嘗試手動控制導航,這將導致整個混亂。當然你可以用它,但可能的錯誤數量是巨大的。由於實現'onSaveInstanceState'的額外好處是支持旋轉和其他配置更改,以重新創建活動。 – j2ko

+0

我保存了invoiceId狀態,但是當它從它通過onCreate進入的細節返回時,savedInstanceState爲null,並且它不運行onRestoreInstanceState(不停止在我的斷點處)。我編輯了原始文件以包含用於啓動細節的代碼,以防萬一發生變化。 – Mikey