Fragment的概述及作用
- Fragment包含在Activity中,Fragment只能存在于Activity的上下文(context)内,没有Activity就无法使用Fragment,因此Fragment只能在Activity的上下文(context)创建。Fragment可以作为Activity的一部分,Fragment和Activity非常相似,Fragment拥有一个与Activity相关的视图层次结构,拥有一个与Activity非常相似的生命周期。
- 为什么要使用Fragment
Activity的使用局限:不能将多个Activity界面放在屏幕上一并显示。因此创建了Fragment来弥补Activity的局限。Fragment可以像Activity一样响应Back键等类似Activity的功能。
Fragment的生命周期
onAttach()
当fragment和activity被关联时调用。onCreate()
当fragment创建时被调用,你应该初始化一些实用的组件,比如在fragment暂停或停止时需要恢复的onCreateView()
当系统调用fragment在首次绘制用户界面时,如果画一个UI在你的fragment你必须返回一个View当然了你可以返回null代表这个fragment没有UI.onActivityCreated()
当activity的onCreate()方法返回时调用。onResumed()
在running状态下的可见状态。onPaused()
另一个activity在前景运行,并且享有焦点,但是这个fragment所在的activity仍然可见(前景activity部分遮挡或者是半透明的)。onStop()
fragment不可见。可能是因为宿主activity处于stopped状态,或者fragment被remove掉,然后加在了back stack中。
一个处于stopped状态的activity还是存活状态的,所有的状态和成员信息会被系统保持。但是,它不再被用户可见,并且如果宿主activity被kill掉,它也会被kill掉。onDestroyView()
当fragment的UI被移除的时候调用。onDetach()
当fragment和activity去关联时调用。
代码中创建Fragment
FragmentManager fm = getSupportFragmentManager();
mContentFragment = (ContentFragment) fm.findFragmentById(R.id.id_fragment_container);
if(mContentFragment == null )
{
mContentFragment = new ContentFragment();
fm.beginTransaction().add(R.id.id_fragment_container,mContentFragment).commit();
}
add(R.id.id_fragment_container,mContentFragment)中的布局的id一方面,是告知FragmentManager,此fragment的位置;另一方面是此fragment的唯一标识;我们通过fm.findFragmentById(R.id.id_fragment_container)查找
Activity响应Fragment中的点击事件
场景:在一个Fragment里面按下一个按钮,然后Activity中根据Fragment中传递过来的参数执行相应的方法。在MyFragment中定义这样的接口
public interface OnButton2ClickListener {
public void OnButton2ClickListener(String showText);
}
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
try {
mListener = (OnButton2ClickListener) activity;
} catch (Exception e) {
// TODO: handle exception
throw new ClassCastException(activity.toString() + "must implement OnButton2ClickListener");
}
}
public void Click(View view){
String showText = "tempTest";
mListener.OnButton2ClickListener(showText);
break;
}
在MainActivity中实现接口OnButton2ClickListener
public class MainActivity extends Activity implements OnClickListener,
OnButton2ClickListener {
@Override
public void OnButton2ClickListener(String showText) {
// TODO Auto-generated method stub
TextView tv_activity = (TextView) findViewById(R.id.tv_activity);
tv_activity.setText(showText);
}
}
fragment和Activity之间的通信
fragment控制fragment:得到一个Activity,然后通过这个Activity的getFragmentManager()获得该Fragment的实例。
fragment控制Activity:这个很简单。每个Fragment都有getActivity()得到一个活动。MainActivity activity=getActivity();
Activity控制fragment:xxxFragment xxx=getFragmentManager().findFragmentById();
Activity控制Activity:这个显然是通过Intent活动之间的通信完成。别忘了在被打开的活动中创建Intent和得到Intent一起进行,写个静态的actionStart()。