2017-06-07 96 views
0

我正在使用自然包含片段的Viewpager。 裏面我有一個子片段(子片段)的片段之一 每個孩子片段包含一個按鈕,調用以下替換子片段本身從兒童片段本身動態替換子片段

FragmentManager manager = getChildFragmentManager(); 
FragmentTransaction transaction = manager.beginTransaction(); 
transaction.replace(R.id.containerProfileDetails, new ProfileDetailsAddressFragment()); 
transaction.commit(); 

只是爲了讓更多的視覺:

1)是父片段

2)是子片段。 我需要按子片段本身內部的按鈕替換子片段

┌--------┐ 
| 1 | 
| ┌-----┐| 
| | 2 || 
| |  || 
| └-----┘| 
└--------┘ 

注:我知道這是可能取代使用這種方法的片段,但是,它似乎是不可能做這與隨着錯誤拋出的子片段一起。

java.lang.IllegalArgumentException: No view found for id 0x7f0f0104 (com.example.app:id/containerProfileDetails) for fragment ProfileDetailsAddressFragment

更新

父片段XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:gravity="center" 
tools:context="com.example.app.fragments.ProfileDetailsFragment"> 

<TextView 
    android:id="@+id/lbl_page" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:gravity="center" 
    android:textSize="42sp" 
    tools:text="2" 
    android:visibility="gone"/> 

<FrameLayout 
    android:id="@+id/containerProfileDetails" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    ></FrameLayout> 
</LinearLayout> 

兒童片段XML:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="com.example.app.fragments.ProfileDetailsUserFragment"> 

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:text="Fragment Profile User Details" /> 

<Button 
    android:id="@+id/btnProfileDetailsUserNext" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="bottom|center"/> 

</FrameLayout> 

父片段的Java:

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_profile_details, container, false); 
    lblPage = (TextView) view.findViewById(R.id.lbl_page); 

    FragmentManager manager = getChildFragmentManager(); 
    FragmentTransaction transaction = manager.beginTransaction(); 
    transaction.add(R.id.containerProfileDetails, new ProfileDetailsUserFragment()); 
    transaction.commit(); 
    return view; 
} 

兒童片段的Java:

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View v = inflater.inflate(R.layout.fragment_profile_details_user, container, false); 

    Button _btnProfileDetailsUserNext = (Button) v.findViewById(R.id.btnProfileDetailsUserNext); 
    _btnProfileDetailsUserNext.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      FragmentManager manager = getChildFragmentManager(); 
      FragmentTransaction transaction = manager.beginTransaction(); 
      transaction.replace(R.id.containerProfileDetails, new ProfileDetailsAddressFragment()); 
      transaction.commit(); 
     } 
    }); 
    return v; 
} 
+0

通常視圖尋呼機沒有容器,你傳遞的id是R.id.containerProfileDetails? –

+0

@AniruddhParihar我使用'transaction.add(R.id。containerProfileDetails,new firstchildfragment());'添加父片段中的第一個子片段 – Poorya

+0

你能分享你的xml佈局代碼嗎? –

回答

2

更換你的父母片段和子片段代碼下面

Parent_Fragment.Java

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_profile_details, container, false); 
    lblPage = (TextView) view.findViewById(R.id.lbl_page); 

    FragmentManager manager = getChildFragmentManager(); 
    FragmentTransaction transaction = manager.beginTransaction(); 
    transaction.add(R.id.containerProfileDetails, new ProfileDetailsUserFragment()); 
    transaction.commit(); 
    return view; 
} 

Child_Fragment.Java

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View v = inflater.inflate(R.layout.fragment_profile_details_user, container, false); 

    Button _btnProfileDetailsUserNext = (Button) v.findViewById(R.id.btnProfileDetailsUserNext); 
    _btnProfileDetailsUserNext.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      FragmentManager manager = getFragmentManager(); 
      FragmentTransaction transaction = manager.beginTransaction(); 
      transaction.replace(R.id.containerProfileDetails, new ProfileDetailsAddressFragment()); 
      transaction.commit(); 
     } 
    }); 
    return v; 
} 

我沒有測試過代碼,它可能會產生一些編譯錯誤,但方法是正確的實現。

+0

,但是創建一個'public static FragmentManager manager'是個好主意嗎?創建回調並從父代片段中替換子片段不是更好嗎? – Poorya

+0

我認爲getFragmentManager()也將代替getChildFragmentManager()在Child_Fragment.java 嘗試它,如果它的作品,那麼我也更新我的答案。 –

+0

@ Aniruddh Parihar你其實是對的!我不明白爲什麼,但它的工作。你有這方面的任何參考?我希望更多的細節。我會將它標記爲答案,如果你更新帖子 – Poorya

1

這會不會在孩子碎片,因爲工作,片段交易尋找與ID R.id.containerProfileDetails的容器。此容器不在子片段中,但它在父片段中。

你需要做的是創建一個從Child Fragment到Parent Fragment的回調。在您的子片段中的Onclick中,將回調調用到Parent Fragment,然後在Parent Fragment中,將Child Fragment替換爲所需的片段。

+0

我不知道你在說什麼。但我正在跳躍尋找更好的方式。所以你說沒有辦法從內部替換一個孩子的片段。因爲在子片段本身內部沒有辦法獲得對父級childefragmentmanager()的引用? – Poorya

+0

沒有,除非你要保持父母FragmentManager在一個靜態變量,如下面的答案,但我個人更喜歡回調方法。 – JaapM

+0

他在評論中的第二個建議實際上是有效的。你覺得有什麼缺點嗎?或可能的問題?他還更新了答案。 基本上使用普通片段管理器可以替換片段。 – Poorya