说起Activity和Fragment大家肯定都耳熟能详的,Fragment作为碎片可以重复使用,通常一个Activity里面可以添加多个Fragment,这是Fragment最基本的用法,今天我要说的是一些不常用的纠葛,比如:Fragment里嵌套Fragment;Fragment里嵌套Activity等。从此以后你不用再纠结Fragment里面到底能不能添加Fragment,Fragment里能不能添加Activity,我在此负责的说是可以的。
不熟悉Fragment的同学请参考:
Android Fragment 真正的完全解析(上)
Android Fragment 真正的完全解析(下)
1、Fragment中添加Fragment:
这里我的需求是这样的,在Fragment中添加了一个Viewpager,Viewpager里面包含两个Fragment,实现方法和Viewpager中添加Fragment一模一样,但是有一点需要注意!!!
ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getChildFragmentManager());
创建PagerAdapter时传入的FragmentManager必须是getChildFragmentManager(),而不是getSupportFragmentManager().
2、Fragment中添加Activity:
我这里的需求是添加一个外部的游戏sdk加载到当前app中,并且在app的某个Fragment中显示sdk里面的首页。我的实现方法是把sdk中的Activity当做一个view加载到当前的Fragment中。
这里涉及一个知识如何获取Activity的view??熟悉的同学应该明白该怎么做了,不熟悉的也莫着急,听偶慢慢道来。
获取Activity的view用到了一个类LocalActivityManager。如何使用请具体参考代码:
public class GameYunFragment extends BaseFragment {
@BindView(R.id.yunGameLayout)
RelativeLayout yunGameLayout;
private boolean isAttach = false;
private LocalActivityManager localActivityManager;
@Override
public void onAttach(Context context) {
super.onAttach(context);
isAttach = true;
localActivityManager = new LocalActivityManager(getActivity(), true);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
localActivityManager.dispatchCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_game_yun_layout, container, false);
ButterKnife.bind(this, view);
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Intent intent = new Intent(getActivity().getApplicationContext(), MainActivity.class);
View gameView = localActivityManager.startActivity("YunGame",intent).getDecorView();
yunGameLayout.removeAllViews();
yunGameLayout.addView(gameView);
}
@Override
public void onResume() {
super.onResume();
localActivityManager.dispatchResume();
}
@Override
public void onPause() {
super.onPause();
localActivityManager.dispatchPause(true);
}
}