项目中用静态加载的时候不多,所以懒得写他了,直接写动态加载的内容。
1.是用App包下的Fragment还是v4包下的:
- 首先,Fragment、FragmentManager、FragmentTransaction必须统一,要用App包下的,都用App包下的,要用v4包下的都用v4包下的,否则会出错。
- Fragment是Android 3.0(API 11)后引入的,如果要求3.0以下手机也能正常运行,选择V4包下的比较合适,但是所在的Activity则必须继承FragmentActivity,而且获取FragmentManage的方式要用getSupportFragmentManager。
- 如果不要求Android 3.0(API 11)以下的手机能正常运行,还是选择App包下的吧。
2.Fragment家族常用的API
Fragment常用的三个类:
android.app.Fragment 主要用于定义Fragment
android.app.FragmentManager 主要用于在Activity中操作Fragment
android.app.FragmentTransaction 保证一些列Fragment操作的原子性
a、获取FragmentManage的方式:
app包中:getFragmentManager()
v4包中:getSupportFragmentManager
b、主要的操作都是FragmentTransaction的方法
FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务
transaction.add()
往Activity中添加一个Fragment
transaction.remove()
从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。
transaction.replace()
使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~
transaction.hide()
隐藏当前的Fragment,仅仅是设为不可见,并不会销毁
transaction.show()
显示之前隐藏的Fragment
detach()
会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。
attach()
重建view视图,附加到UI上并显示。
transatcion.commit()//提交一个事务
3.动态加载流程
- 获取FragmentManager对象: getFragmentManager()//getSupportFragmentManager()
- 获取beginTransaction对象: fManager.beginTransaction()
- 调用add()或replace()方法加载Fragment: fTransaction.add(要传入的对象,fragment对象) // fTransaction.replace(要传入的对象,fragment对象)
commit()提交
4.核心代码
public class MainActivity extends Activity implements OnClickListener
{
private LinearLayout mTabWeixin;
private LinearLayout mTabFriend;
private ContentFragment mWeixin;
private FriendFragment mFriend;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
// 初始化控件和声明事件
mTabWeixin = (LinearLayout) findViewById(R.id.tab_bottom_weixin);
mTabFriend = (LinearLayout) findViewById(R.id.tab_bottom_friend);
mTabWeixin.setOnClickListener(this);
mTabFriend.setOnClickListener(this);
// 设置默认的Fragment
setDefaultFragment();
}
private void setDefaultFragment()
{
FragmentManager fm = getFragmentManager(); //获取FragmentManager对象
FragmentTransaction transaction = fm.beginTransaction();//获取beginTransaction对象
mWeixin = new ContentFragment();
transaction.replace(R.id.id_content, mWeixin);//加载Fragment
transaction.commit(); //提交
}
@Override
public void onClick(View v)
{
FragmentManager fm = getFragmentManager();
// 开启Fragment事务
FragmentTransaction transaction = fm.beginTransaction();
switch (v.getId())
{
case R.id.tab_bottom_weixin:
if (mWeixin == null)
{
mWeixin = new ContentFragment();
}
// 使用当前Fragment的布局替代id_content的控件
transaction.replace(R.id.id_content, mWeixin);
break;
case R.id.tab_bottom_friend:
if (mFriend == null)
{
mFriend = new FriendFragment();
}
transaction.replace(R.id.id_content, mFriend);
break;
}
// transaction.addToBackStack();
// 事务提交
transaction.commit();
}
}