0

私のアプリケーションに新しいアイテムが追加されたときに通知を作成する、自分のアプリケーションにバックグラウンドサービスを追加しました。通知を押すと、ユーザーはアプリケーションに入り、インテントはオブジェクトに渡され、アプリケーションは新しく追加されたアイテムを選択できます。Androidのフラグメントが表示されない

携帯電話とタブレットの両方のアプリケーションです。電話機で実行すると、アイテムは別のアクティビティで表示されます。タブレット上では、デュアルフラグメントレイアウトが使用され、アイテムは右側のフラグメントに表示されます。

主なアクティビティonCreate私はインテントをチェックし、アイテムが通過しているかどうかをチェックし、アイテムがあればそれを表示します。これは電話機で正常に動作していますが、タブレットでは右の断片が見えないので項目を表示できません。

これは私が(私はONSTARTとonResumeでそれをしようとした)のonCreateの最後で呼んで

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

スマートフォンmDualFragments上で次の

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"); 
     } 
    } 
} 

を行いonDealSeletced方法が偽でありますそれは新しい活動の中で取引を示し、期待どおりに働く。 タブレット上では、それはelseに入りますが、フラグメントが表示されていない場合は決して最終には入りません。

タブレット上でアプリケーションを実行すると、それでもフラグメントが表示されていない場合でも、タブレット上でアプリケーションが実行されます。

同じ方法がアプリケーションの他のポイントで使用されます(取引が意図内で実行されない場合)。期待どおりに機能しています。

答えて

3

を使用して、データが添付される前に(コミットアクションの前に)フラグメントに渡すことができます。このようにして、Fragment自体が初期化されると、getArgumentsを呼び出してバンドルを解析できます。この方法でフラグメントがまだ目に見えることを心配する必要はなく、準備ができたらビューを作成することができます。フラグメント内に完全な例がありますDocs

+0

ここから提供された引数はフラグメント破棄と作成の間に保持されます。これは、アプリケーションが終了するまでバンドルが保持されることを意味しますか?たとえば、ユーザーがクリックするとたくさんの通知が行われ、すべてのバンドルが保持されるとします。 – bencallis

+0

削除または置換トランザクションを介してフラグメントを削除すると、フラグメントが破棄されるため(バンドルは失われます)、デバイスをローテーションしてフラグメントを再接続するとバンドルが保持されます。 setArgumentsはフラグメントごとに1回だけ呼び出すことができます。したがって、複数の通知を処理するには、古いフラグメントを新しいものに置き換えることができます。 – smith324

+0

ありがとうございます。私はあなたのアドバイスに従ってそれを働かせることができました。 – bencallis

0

transaction.add()メソッドを試して、前のフラグメントを非表示にしてください。私はあなたの断片が今見えると思う。

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

私はこれを残念ながら試みましたが、同じ問題がまだ発生します。 – bencallis

関連する問題