Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

FragmentTransaction.replace() not working

Tags:

I have a ListFragment displaying a list of items that created by the user. I have a ListView with it's id set to "@android:id/list" and a TextView with the id "@android:id/empty".

I have an action bar button to display a fragment to allow the user to create more entries for the list. Here is the onOptionsItemSelected() method:

@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;

}

The AddCourseFragment code is as follows:

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

As expected, when the list is unpopulated, android shows the text in the TextView. I then hit the add course button and this happens: enter image description here
It shows the empty text as well as the new fragment.

like image 614
scottbot95 Avatar asked Nov 19 '12 02:11

scottbot95


2 Answers

I had a similar problem.

According to this when you need to add Fragments programmatically, you should add them to an existing ViewGroup.

So I removed the Fragment from the xml and used FrameLayout component in the replace() method.

You can also have a look here.

Hope this helps.

like image 169
Zlatko Avatar answered Oct 09 '22 07:10

Zlatko


An other problem that solved the issue in my case were diffentent API imports.

Make sure, that you use "support.v4" or the "original" implementations from API 11 and do not mix them. (this can happen, in my case: TransactionManager was v4 and the Activity an older version, or the other way around)

like image 43
zonky Avatar answered Oct 09 '22 07:10

zonky