android, dynamically change a fragment inside a tab

走远了吗. 提交于 2019-12-06 15:58:17

Create a class acts like an fragment container.

for example:

public class FragmentContainer extends SherlockFragment implements OnBackStackChangedListener {
public static final String PARAM_CONTENT_FRAGMENT = "param_content_fragment";

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    return inflater.inflate(R.layout.frag_container, null);
}

public void replaceContent(Class<? extends Fragment> clz, Bundle args) {
    FragmentTransaction tx = getChildFragmentManager().beginTransaction();

    tx.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);

    // save
    Fragment curFrag = getChildFragmentManager().findFragmentById(R.id.fragment_content);
    tx.addToBackStack(curFrag.getClass().getSimpleName());

    // change
    try {
        Fragment newFragment = clz.newInstance();
        newFragment.setArguments(args);
        tx.replace(R.id.fragment_content, newFragment, clz.getClass().getSimpleName());
        tx.commit();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

}

@Override
public void onResume() {
    super.onResume();
    Fragment f = getChildFragmentManager().findFragmentById(R.id.fragment_content);
    if (f == null) {
        Class<? extends Fragment> claz = (Class<? extends Fragment>) getArguments().getSerializable(
                PARAM_CONTENT_FRAGMENT);
        FragmentTransaction tx = getChildFragmentManager().beginTransaction();
        try {
            f = claz.newInstance();
            f.setTargetFragment(this, 0);
            tx.add(R.id.fragment_content, f);
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

    }
}

Several key point here:

  1. Init the third tab with FragmentContainer.class and provide C.class as an fragment arguments. (argument key is PARAM_CONTENT_FRAGMENT)

  2. onCreateView() Just create a FrameLayout with id @+id/fragment_content, this is where we place child fragment.

  3. onResume() Place child fragment into FrameLayout if not exists.

  4. replaceContent() Call this method When Fragment-C wants to change it-self to Fragment-D.

In Frament-C, for example:

((FragmentContainer)getParentFragment() ).replaceContent( D.class, null );
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!