FragmentTransaction.replace() not working

来源:互联网 发布:用友网络未来价值2017 编辑:程序博客网 时间:2024/06/06 15:38

FragmentTransaction.replace() not working

up vote5down votefavorite
1

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:

@Overridepublic 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.

shareimprove this question
 

2 Answers

activeoldestvotes
up vote10down voteaccepted

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.

shareimprove this answer
 
up vote0down vote

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)

shareimprove this answer
0 0