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