2013-02-06 24 views
47

Moja klasa dziedziczy Fragment i dlatego nie może używać funkcji getSupportFragmentManager(). Używam getChildFragmentManager i pokazuje mi Error - IllegalArguementException: Nie znaleziono widoku dla id ... error.Jaka jest różnica między getSupportFragmentManager() i getChildFragmentManager()?

Wszelkie wskazówki będą mile widziane.

kod do wywoływania AttachmentsListFragment jest

Bundle b = new Bundle(); 
b.putSerializable("AttachmentsList", msg.attachments); 
     AttachmentListFragment listfrag = new AttachmentListFragment(msg.attachments); 
FragmentTransaction transaction = getFragmentManager().beginTransaction();  
transaction.add(R.id.attachmentslistcontainer, listfrag); 
transaction.addToBackStack(null); 
transaction.commit(); 

attachmentslayout.xml jest

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/attachmentslistcontainer" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/textViewAttachmentHeader" 
     style="@style/Normal.Header.Toolbar" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:background="@color/list_separator_background" 
     android:ellipsize="end" 
     android:gravity="center" 
     android:maxLines="2" 
     android:text="@string/attachments_header" 
     android:textColor="#FFFFFFFF" 
     android:textSize="22sp" 
     android:textStyle="bold" 
     android:visibility="visible" /> 

    <ListView 
     android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 
    </ListView> 

</FrameLayout> 

AttachmentsListFragment.java

public class AttachmentListFragment extends ListFragment implements IAttachmentsData { 

    ArrayList<Attachments> items = null; 
    Integer cellLayoutID; 
    Integer index; 

    public AttachmentListFragment() { 

    } 

    public AttachmentListFragment(ArrayList<Attachments> items) { 
     this.items = items; 
     Log.i("Logging", "Items size" + items.size()); //$NON-NLS-1$ 
    } 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Bundle bundle; 
     if (savedInstanceState != null) { 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     //super.onCreateView(inflater, container, savedInstanceState); 

     // setContentView(R.layout.attachmentslayout); 
     View view = inflater.inflate(R.layout.attachmentslayout, container, false); 
     return view; 
    } 


    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     setListAdapter(new AttachmentAdapter(
       getActivity().getApplicationContext(), 
       R.layout.attachmentslistcellcontent, 
       items)); 
    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     // TODO Auto-generated method stub 
     super.onListItemClick(l, v, position, id); 
     index = position; 
     Intent intent = new Intent(); 
     Bundle b = new Bundle(); 
     b.putByteArray("Data", items.get(position).getImageData()); 
     intent.putExtras(b); 
    } 


    public byte[] getData() { 
     // TODO Auto-generated method stub 
     if (items != null && index < items.size()) { 

      return items.get(index).getImageData(); 
     } 
      return null; 
    } 

} 
+1

Proszę zaksięgować całą metodę i/lub klasę, do której dzwonisz "getChildFragmentManager". – WindyB

Odpowiedz

96

Definicja getChildFragmentManager() jest:

Zwróć prywatny FragmentManager w celu umieszczenia i zarządzania Fragmentami wewnątrz tego Fragmentu.

Natomiast określenie getFragmentManager() (lub w tym przypadku getSupportFragmentManager()) wynosi:

Umieścić ponownie FragmentManager interakcji z fragmentów związanych z aktywnością ten fragment ma.

Zasadniczo różnica polega na tym, że Fragment ma teraz swój własny wewnętrzny FragmentManager, który może obsługiwać Fragmenty. Podrzędny FragmentManager to ten, który obsługuje Fragmenty zawarte tylko w Fragmencie, do którego został dodany. Inny FragmentManager jest zawarty w całym Activity.

W tym przypadku zgaduję, że dodałeś Fragmenty do FragmentManager Activity. Otrzymasz dziecko FragmentManager, które nie zawiera tego, czego szukasz. W ten sposób otrzymujesz wyjątek, ponieważ nie możesz znaleźć Fragmentu o podanym ID, ponieważ jest on w innym Menedżerze Fragmentów.

+3

Próbowałem użyć getChildFragmentManager. Ale pokazuje również ten sam wyjątek – NinjaCoder

+1

Myślałem, że powiedziałeś, że już używasz getChildFragmentManager. – DeeV

+0

jeśli używam getSupportFragmentManager do utworzenia fragmentu potomnego, tak aby rodzic posiadał dziecko i oba były widoczne/na pierwszym planie, co robi przycisk Wstecz? czy wyskakuje z rodzica? lub dziecko? itp.? – BrettG

3

getFragmentManager należą do Activity
getChildFragmentManager należą do Fragment

Przykład mamy aplikację, które mają MainActivity, Fragment1, Fragment2, container_view_on_main jest układ w activty_main.xml

do wyświetleniaFragment1 na MainActivity my musi użyć getSupportFragmentManager()

getSupportFragmentManager().beginTransaction().replace(R.id.container_view_on_main, Fragment1.newInstance()); 

do wyświetleniaFragment2 z Fragment1 mamy 2 sposób

USE getFragmentManager()

getFragmentManager().beginTransaction().replace(R.id.container_view_on_main, Fragment1.newInstance()); 

USE getChildFragmentManager()

Po pierwsze, musimy stworzyć układ z id container_view_on_fragment1 wewnątrz , następnie

getChildFragmentManager().beginTransaction().replace(R.id.container_view_on_fragment1, Fragment2.newInstance()).commit(); 

WNIOSEK

W tym demo, myślę, że powinniśmy używać getFragmentManager() kiedy iść z Fragment1 do Fragment2 ponieważ jest prosty i dobry do wykonania (Fragment1 zatrzyma gdy Fragment2 otwarty)

Kiedy używamy getChildFragmentManager()? Przykład: MainActivity mają ViewPager, które mają 3 strony, wewnątrz każdej strony trzeba wymienić fragment.

WIĘCEJ
- getParentFragment()
getFragmentManager() => zwróci null
getChildFragmentManager() => zawsze zwraca fragment korzenia (Fragment1 w demo nawet idziemy do Fragment3 ,, ...)

Ta odpowiedź jest podstawą mojego zrozumienia, więc proszę mnie poprawić, jeśli się mylę. Mam nadzieję, że pomogę

Powiązane problemy