0

我已將一個後臺服務添加到我的應用程序,該應用程序會在將新項目添加到我的應用程序時創建通知。當按下通知時,用戶被帶入應用程序,意圖傳遞一個對象,允許應用程序選擇新添加的項目。Android片段不可見

該應用程序適用於手機和平板電腦。在手機上運行時,項目顯示在單獨的活動中,在平板電腦上使用雙片段佈局,並且該項目顯示在右側片段中。

在主要活動onCreate我檢查意圖,並檢查一個項目是否已通過並顯示它,如果有。這在手機上工作正常,但在平板電腦上,右側的片段不可見,因此該項目無法顯示。

這就是我所說的的onCreate結束(我曾試圖在在onStart和的onResume)

Bundle data = queryIntent.getExtras(); 
    if (data!=null){ 
     Deal deal = data.getParcelable("notificationDeal"); 
     if (deal!=null){ 
      onDealSelected(deal); 
     } 
    } 

的方法onDealSeletced執行以下操作

public void onDealSelected(Deal deal) { 
    if (!mDualFragments){ 
     Intent showDealDetails = new Intent(getApplicationContext(), DealDetailsActivity.class); 
     showDealDetails.putExtra("Deal", deal); 
     showDealDetails.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(showDealDetails); 
     Log.d("OnDealSelected", "1"); 
    } 
    else{ // must be tablet 
     if (dealDetailsFragment == null) 
      dealDetailsFragment = (DealDetailsFragment) getFragmentManager().findFragmentByTag("dealDetailsFragment"); 
     if (!dealDetailsFragment.isVisible()){ 
      FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
      transaction.replace(R.id.right_fragment_container, dealDetailsFragment); 
      transaction.setTransitionStyle(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
      transaction.commit(); 
      getFragmentManager().executePendingTransactions(); // ensure it is done before we call update deal! 
      Log.d("OnDealSelected", "2"); 
     } 
     if (dealDetailsFragment.isVisible()) { 
      dealDetailsFragment.updateDeal(deal); 
      Log.d("OnDealSelected", "3"); 
     } 
    } 
} 

在智能手機上mDualFragments是假的因此它在新活動中顯示交易並按預期工作。 在平板電腦上時,它會進入else,但如果片段不可見,它永遠不會進入最後。

當在平板電腦上運行該應用程序時,它會進入第二個,但在其之後該片段仍然不可見。

在應用程序中的其他位置使用相同的方法(交易未在意圖中傳遞時)並且按預期工作。

回答

3

您可以使用setArguments(Bundle bundle)將數據傳遞給片段(在提交操作之前)。這樣,當片段初始化自己時,它可以調用getArguments並解析該包。這樣你就不必擔心片段可見,它可以在準備就緒時創建它的視圖。在片段中有一個完整的示例Docs

+0

從文檔 - 這裏提供的參數將保留在片段銷燬和創建。這是否意味着在應用程序被殺之前這個包被保留了下來?舉例來說,很多通知都是由用戶點擊的,所有的包都會被保留下來? – bencallis 2012-03-13 16:58:30

+0

如果您通過remove或replace事務刪除片段,則片段會被破壞(所以包會丟失),但是如果您旋轉設備並重新連接片段,則會保留該片段。每個片段只能調用一次setArguments,因此爲了處理多個通知,您可以用新的片段替換舊的片段。 – smith324 2012-03-13 19:24:52

+0

謝謝。我已經設法按照你的建議來開展工作。 – bencallis 2012-03-13 21:56:58

0

嘗試使用transaction.add()方法並隱藏前一個片段。我想你的片段現在可以看到。

 transaction.add(R.id.right_fragment_container, dealDetailsFragment); 
+0

我已經嘗試過這種遺憾,同樣的問題仍然存在。 – bencallis 2012-03-13 16:59:19