Android Fragment不可见

时间:2012-03-10 05:11:48

标签: android android-intent android-3.0-honeycomb android-fragments android-4.0-ice-cream-sandwich

我已经为我的应用程序添加了一个后台服务,它会在我的应用程序中添加新项目时创建通知。当按下通知时,用户被带入应用程序,意图传递一个对象,允许应用程序选择新添加的项目。

该应用程序适用于手机和平板电脑。在手机上运行时,项目会显示在单独的活动中,当在平板电脑上使用双片段布局时,项目会显示在右侧片段上。

在主要活动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,因此它会在新活动中显示交易并按预期工作。 当它在平板电脑上时会进入其他状态,但如果片段不可见,它就永远不会进入决赛。

在平板电脑上运行该应用程序时,它会进入第二个,但之后片段仍然不可见。

在应用程序的其他位置使用相同的方法(当意图中没有传递交易时)并且按预期工作。

2 个答案:

答案 0 :(得分:3)

您可以使用setArguments(Bundle bundle)在连接之前(在提交操作之前)将数据传递给片段。这样,当Fragment初始化时,它可以调用getArguments并解析bundle。这样您就不必担心片段可见,它可以在准备好时创建其视图。 Fragment Docs

中有一个完整的例子

答案 1 :(得分:0)

尝试使用transaction.add()方法并隐藏上一个片段。我想你的片段现在可见了。

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