我已经为我的应用程序添加了一个后台服务,它会在我的应用程序中添加新项目时创建通知。当按下通知时,用户被带入应用程序,意图传递一个对象,允许应用程序选择新添加的项目。
该应用程序适用于手机和平板电脑。在手机上运行时,项目会显示在单独的活动中,当在平板电脑上使用双片段布局时,项目会显示在右侧片段上。
在主要活动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为false,因此它会在新活动中显示交易并按预期工作。 当它在平板电脑上时会进入其他状态,但如果片段不可见,它就永远不会进入决赛。
在平板电脑上运行该应用程序时,它会进入第二个,但之后片段仍然不可见。
在应用程序的其他位置使用相同的方法(当意图中没有传递交易时)并且按预期工作。
答案 0 :(得分:3)
您可以使用setArguments(Bundle bundle)在连接之前(在提交操作之前)将数据传递给片段。这样,当Fragment初始化时,它可以调用getArguments并解析bundle。这样您就不必担心片段可见,它可以在准备好时创建其视图。 Fragment Docs
中有一个完整的例子答案 1 :(得分:0)
尝试使用transaction.add()方法并隐藏上一个片段。我想你的片段现在可见了。
transaction.add(R.id.right_fragment_container, dealDetailsFragment);