如果使用Android3.0以下的版本,需要引入android.support.v4的JAR包,然后Activity继承FragmentActivity,通过getSupportFragmentManager获得FragmentManager。
Android在3.0以上版本,可直接使用Activity,通过getFragmentManager获得FragmentManager。
一. 生命周期:
onAttach(Activity):Fragment和Activity建立关联时调用。
onCreate(Bundle)
onCreateView(LayoutInflater, ViewGroup, Bundle):为Fragment加载布局时调用。
onActivityCreated(Bundle)
onStart()
onResume()
onPause()
onStop()
onDestroyView():Fragment中的布局被移除时调用。
onDestory()
onDetach():Fragment和Activity解除关联的时候调用。
二. 两种加载方法:
静态加载Fragment:在布局文件中直接布局<fragment>
<fragment android:id="@+id/id_fragment_title"
android:name="com.test.fragment.TitleBarFragment"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
每一个fragment都需要一个唯一的标识,如果activity重启,系统可以用来恢复fragment(并且你也可以用来捕获fragment来处理事务,例如移除它.) 有3种方法来为一个fragment提供一个标识:
为 android:id 属性提供一个唯一ID.
为 android:tag 属性提供一个唯一字符串.
如果以上2个都没有提供, 系统使用容器view的ID.
动态添加Fragment主要分为4步:
1.获取到FragmentManager,在Activity中可以直接通过getFragmentManager得到。
2.开启一个事务,通过调用beginTransaction方法开启。
3.向容器内加入Fragment,一般使用replace方法实现,需要传入容器的id和Fragment的实例。
4.提交事务,调用commit方法提交。
FragmentTransaction方法:
add(int containerViewId, Fragment fragment, String tag) 往containerView中添加一个Fragment
remove() 从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈,这个Fragment实例将会被销毁。
replace(int containerViewId, Fragment fragment, String tag) 使用Fragment替换当前的containerView,实际上就是remove()然后add()的合体
hide() 隐藏当前的Fragment,仅仅是设为不可见,并不会销毁
show() 显示之前隐藏的Fragment
detach() 会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。
attach() 重建view视图,附加到UI上并显示。
addToBackStack(String) 添加一个Fragment事务到回退栈。用户点击Back,就是Fragment回退栈不断的弹栈。
注:
将fragment从后台堆栈中弹出, 使用FragmentManager.popBackStack() (模拟用户按下BACK 命令).
使用FragmentManager.addOnBackStackChangeListener()注册一个监听后台堆栈变化的listener.
三. Fragment之间进行通信:
1. 在Fragment,使用getActivity()可以获取到关联的Activity,然后再调用Activity的findViewById方法,就可以获取到和这个Activity关联的其它Fragment的视图了。
2. 在Activity,使用getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例。
但是以上两种方法都不提倡,因为Fragment和Activity之间耦合太紧,应采用观察者模式,设置Listener接口,在Activity中实现接口,在Fragment中调用接口函数,从而Fragment得事件就可以通知到Activity了。
3. 通过Hander来实现消息传送,但这也是紧耦合。
public void onAttach(Activity activity) {
super.onAttach(activity);
mActivity = (MainActivity) activity;
mActivity.setHandler(mHandler);
}
4. 使用Bundle,也是紧耦合。
在Activity中动态添加Fragment时,用Bundle封装我们需要传递的数据。setArguments方法必须在fragment创建以后,添加给Activity前完成。
public void button(View view) {
ArgFragment arg = new ArgFragment();
Bundle bundle = new Bundle();
bundle.putString("arg", "XXX");
arg.setArguments(bundle);
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.layout_fragment, arg);
ft.commit();
}
然后在ArgFragment取出Bundle对象:
Bundle bundle = getArguments();
if (bundle != null){
String str = bundle.getString("arg");
}
四. 集成ActionBar的标签,可以替代TabHost+ActivityGrounp
1. 在android3.0或者以上版本中,ActionBar已经默认的包含在Activity中,getActionBar()直接获取。
去掉ActionBar的两种方案:
<activity android:theme="@android :style/Theme.Holo.NoActionBar">
getActionBar().hide() 此时显示的界面将会重新绘制
如果使用Android3.0以下的版本,需要引入android.support.v4的JAR包。
让Activity继承ActionBarActivity,并在activity标签里面添加主题<activity android:theme="@style/Theme.AppCompat.Light">,通过getSupportActionBar()方法来获取ActionBar。
2. ActionBar加载的两种方案:
<1>. 静态加载:
在menu文件夹下新建menu.xml文件:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/action_add"
android:orderInCategory="1"
android:showAsAction="ifRoom|withText"
android:title="add"/>
<item
android:id="@+id/action_delete"
android:orderInCategory="2"
android:showAsAction="ifRoom|withText"
android:title="delete"/>
</menu>
重写Activity的onCreateOptionsMenu,加载菜单:
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
return true;
}
<2>. 动态加载:
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
//添加菜单项
MenuItem add=menu.add(0,0,0,"add");
MenuItem del=menu.add(0,0,0,"delete");
//绑定到ActionBar
add.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
del.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
return true;
}
详细介绍参见:http://blog.csdn.net/yuzhiboyi/article/details/32709833