2016-04-18 10 views
0

私は、そのフラグメントに対してFrameLayoutを持つActivityを持っています。 私は標準的な方法でフラグメントを追加します。フラグメント内のFragamentを置換する際の例外

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    ProfileFragmentFirst profileFragmentFirst = new ProfileFragmentFirst(); 
    Bundle args = new Bundle(); 
    args.putSerializable(ExtrasTags.ARG_PROFILE_OBJECT, profileObject); 
    profileFragmentFirst.setArguments(args); 
    transaction.replace(R.id.fragment_container, profileFragmentFirst); 
    transaction.commit(); 

は、これは問題なく完璧に動作します。

フラグメント内には、クリックすると現在アクティブなフラグメントを別のものに置き換える必要があるボタンがあります。 これを行うために活動のメソッドを呼び出します。

@Override 
public void startFragment(Fragment fragment) { 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.replace(R.id.fragment_container, fragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
} 

私はアプリは、次のエラーので

java.lang.IllegalArgumentException: No view found for id 0x7f0d00cb (com.digle.android:id/fragment_container) for fragment ProfileBadgesFragment{2239633d #1 id=0x7f0d00cb} 

で失敗したことを行うと、それは主張し、それがためでframeLayoutを見つけることができません私はそれを以前使っていましたが、断片化しました! もう少し調べて、アクティビティの代わりにレイアウトのフラグメントレイアウトを見ていることが分かりました(私はフラグメントレイアウトにFrameLayoutを追加し、そこに現れた2番目のフラグメントを見ています)。

しかし、このコードは私のアプリのどこかで完全に動作します。

この2つのケースの主な違いは、この場合、最初のフラグメントはデータバインディングを使用しますが、動作する場合はデータバインディングが使用されないことです。 私がクリックしたボタンは、イベントオブジェクトにバインドされています。例えば

<Button 
.. 
.. 
android:onClick="@{clicksListener.onBadgesClick}" 
/> 

付:

 public class ClicksListener { 
     public void onBadgesClick(View view) { 
      Log.d(TAG, "onBadgesClick"); 
      ProfileBadgesFragment profileBadgesFragment = new ProfileBadgesFragment(); 
      Bundle args = new Bundle(); 
      args.putSerializable(ExtrasTags.ARG_PROFILE_BADGES, profileObject.userBadgesEntity); 
      profileBadgesFragment.setArguments(args); 
      startFragment(profileBadgesFragment); 
     } 
    } 

そして、もちろん、結合。クリックは完全に機能しますが、前述のように、アクティビティレイアウトの代わりにフラグメントレイアウトが表示されます。

ビルドツール23.0.3を使用していて、それ以外のものはすべて最新です。

+0

あなたを助けることを願っています 'NOビューは、ID 0x7f0d00cb(com.digle.android:id/fragment_container)'あなたは、そのインスタンスでは使用できない容器の中にあなたの断片を入れしようとしているが見つかりません。フラグメント内のフラグメントを置き換えますか? – Kathi

+0

それは問題です。それをやろうとしていますが、私はしたくないし、最初のフラグメントがデータバインディングを使って構築されている場合にのみ起こります。 – theblitz

答えて

0

R.id.fragment_containerはあなたの片の一部ではありません。代わりに、コンテナのアクティビティの一部です。

フラグメントのフラグメントを追加/置換する場合は、リスナーインターフェイスを使用してコンテナアクティビティにコールバックを送信し、次にコンテナアクティビティでコールバックを送信する必要があります。startFragment()を実行してください。

+0

これは効果的に私がボタンでやっていることです。クリックリスナーは、フラグメント内ではなくアクティビティ内で定義されます。 – theblitz

+0

onBadgesClick(ビュー表示)はどこに定義されていますか? –

+0

アクティビティの中。 – theblitz

0

getSupportFragmentManager()ではなくstartFragmentにgetParentFragment()を使用します。getFragmentManager();

はそれが

+0

コードはアクティビティ内で実行されるため、「getParentFragment()」は存在しません。 – theblitz

+0

ボタンがどこにあるかだけ、フラグメント内のメソッドを作成し、アクティビティから削除します。 – Dharmaraj

+0

私はフラグメントから最初に実行しようとしましたが、同じ結果を得ました。親フラグメントがないので、getParentFragmentは使用できません。 – theblitz

関連する問題