2012-11-19 13 views
18

Ho un ListFragment che visualizza un elenco di elementi creati dall'utente. Ho un ListView con il suo ID impostato su "@android: id/list" e uno TextView con l'id "@android: id/empty".FragmentTransaction.replace() non funziona

Ho un pulsante della barra delle operazioni per visualizzare un frammento per consentire all'utente di creare più voci per l'elenco. Ecco il metodo onOptionsItemSelected():

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    Fragment frag = null; 

    // Right now I only have code for the addCourse() fragment, will add more soon 
    switch (item.getItemId()) { 
    case R.id.addCourse: 
     frag = new AddCourseFragment(); 
     break; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 

    // The support library is being dumb and replace isn't actually 
    getFragmentManager().beginTransaction() 
     .remove(this).add(getId(), frag).addToBackStack(null).commit(); 
    return true; 

} 

Il codice AddCourseFragment è il seguente:

public class AddCourseFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_addcourse, container, false); 
//  if (view.findViewById(R.id.timesFrame)!=null) { 
     Fragment timesFrag = new TimesFragment(); 
     getChildFragmentManager().beginTransaction() 
      .add(R.id.timesFrame, timesFrag).commit(); 
//  } 
    return view; 
    } 
} 

Come previsto, quando la lista è disabitata, Android mostra il testo nel TextView. Quindi premo il pulsante Aggiungi corso e questo succede: enter image description here
Mostra il testo vuoto e il nuovo frammento.

risposta

20

Ho avuto un problema simile.

Secondo this quando è necessario aggiungere Fragments a livello di codice, è necessario aggiungerli a uno esistente ViewGroup.

Così ho rimosso il Fragment dal xml e utilizzato il componente FrameLayout nel metodo replace().

Puoi anche dare un'occhiata here.

Spero che questo aiuti.

2

Un altro problema che ha risolto il problema nel mio caso riguardava le importazioni di API diffenti.

Assicurarsi di utilizzare "support.v4" o le implementazioni "originali" dell'API 11 e non mescolarli. (Questo può accadere, nel mio caso: TransactionManager era v4 e l'attività di una versione precedente, o viceversa)

0

Un'altra soluzione è quella di utilizzare LinearLayout Invece di frammento

<Fragment 
     android:name="path/to.package.MyClass" 
     android:id="@+id/fragmentContainer" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="100dp" 
     /> 

usare in questo modo

<LinearLayout 
     android:name="path/to.package.MyClass" 
     android:id="@+id/fragmentContainer" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="100dp" 
     /> 
3

Assegna un colore di sfondo al layout principale di childFragment.

come Android: background = "# FFFFFF"

Questo ha funzionato per me !!!!

0

Ho risolto la modifica del RelativeLayout per un LinearLayout ... Spero che sia d'aiuto!

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/windowBackground"> 


    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/fragment_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 


</LinearLayout>