我已將一個後臺服務添加到我的應用程序,該應用程序會在將新項目添加到我的應用程序時創建通知。當按下通知時,用戶被帶入應用程序,意圖傳遞一個對象,允許應用程序選擇新添加的項目。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,但如果片段不可見,它永遠不會進入最後。
當在平板電腦上運行該應用程序時,它會進入第二個,但在其之後該片段仍然不可見。
在應用程序中的其他位置使用相同的方法(交易未在意圖中傳遞時)並且按預期工作。
從文檔 - 這裏提供的參數將保留在片段銷燬和創建。這是否意味着在應用程序被殺之前這個包被保留了下來?舉例來說,很多通知都是由用戶點擊的,所有的包都會被保留下來? – bencallis 2012-03-13 16:58:30
如果您通過remove或replace事務刪除片段,則片段會被破壞(所以包會丟失),但是如果您旋轉設備並重新連接片段,則會保留該片段。每個片段只能調用一次setArguments,因此爲了處理多個通知,您可以用新的片段替換舊的片段。 – smith324 2012-03-13 19:24:52
謝謝。我已經設法按照你的建議來開展工作。 – bencallis 2012-03-13 21:56:58