Fragment组件
- Fragment的创建
- Fragment的添加在Activity中
- Fragment的之间的切换
- Fragment的生命周期
- Fragment的之间的通信
- 其他
01. Fragment的创建
1. 为Fragment 定义一个布局
2. 定义一个类继承Fragment
3. 重写类中的onCreateView 方法
02. Fragment的添加在Activity中
1. 在Activity 的布局文件中引入Fragment
2. 以代码的形式添加,注意,此时在XML文件中需要一个替Fragment占位的布局
//方式1,嵌套在XML文件中
//每个直接嵌套到Activity布局的Fragment必须有一个唯一的id
<fragment
android:id="@+id/fmt_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:name="com.itheima.fragment.TitleFragment"
/>
//方式2,代码的形式添加
public void addFragment(View view){
//1. 获取Fragment管理器
//注意:由于我们使用的是v4包下的Fragment,因此我们只能用v4包下的FragmentManager
FragmentManager fragmentManager = getSupportFragmentManager();
//2. 开启事务
FragmentTransaction transaction = fragmentManager.beginTransaction();
Log.d("tag", "new 之前");
FragmentB fragmentB = new FragmentB();
Log.d("tag", "new 之后 add 之前");
/*
* 3. 添加
* 参数1:Activity中用于添加Fragment的容器的id
* 参数2:Fragment
* 参数3:就是给添加上的FragmentB设置一个标签名称
*/
transaction.add(R.id.fl_content, fragmentB, "FragmentB");
//这样子也是可以的
//transaction.replace(R.id.btn_conversation, conversationFragment, "ConversationFragment");
Log.d("tag", "add 之后 提交之前");
//4. 提交
transaction.commit();
Log.d("tag", "提交之后");
}
03. Fragment的之间的切换
通过replace切换
-通过replace切换时每次都会将上一个Fragment销毁,然后重新创建,太浪费资源.通过add进行切换
- 通过先add,然后控制hide和show的方法,效率高,不走生命周期.
- 同一个Fragment对象不能在Activity中添加多次
- 通过回调方法监听Fragment的隐藏和显示public void onHiddenChanged(boolean hidden) {}
- 总结:在XML文件中使用一个帧布局占位,然后通过把三个Fragment添加到该布局中,只需要控制他们的显示与隐藏即可
public class MainActivity extends FragmentActivity implements OnClickListener {
private ConversationFragment conversationFragment;
private ContactsFragment contactsFragment;
private ZoneFragment zoneFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_contacts).setOnClickListener(this);
findViewById(R.id.btn_conversation).setOnClickListener(this);
findViewById(R.id.btn_zone).setOnClickListener(this);
conversationFragment = new ConversationFragment();
contactsFragment = new ContactsFragment();
zoneFragment = new ZoneFragment();
//默认显示第一个Fragment
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.add(R.id.fl_content, conversationFragment, "ConversationFragment");
transaction.commit();
}
/*
* 先判断这个Fragment是否已经被添加了,如果已经被添加了,就不要再添加了.多次添加会报异常
* 将其他的全部隐藏,将用户点击的Fragment给显示出来.
*/
@Override
public void onClick(View v) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
//全部隐藏(不管是否已经添加了,都可以用隐藏方法)
transaction.hide(conversationFragment);
transaction.hide(contactsFragment);
transaction.hide(zoneFragment);
switch (v.getId()) {
case R.id.btn_conversation:
/*
* 参数1:要将Fragment添加到Activity布局中的哪个帧布局中
* 参数2:Fragment
* 参数3:起一个tag
*/
//判断Fragment是否已经被添加了
if (!conversationFragment.isAdded()) {
transaction.add(R.id.fl_content, conversationFragment, "ConversationFragment");
}
//将在自己显示,将其他隐藏
transaction.show(conversationFragment);
break;
case R.id.btn_contacts:
//判断Fragment是否已经被添加了
if (!contactsFragment.isAdded()) {
transaction.add(R.id.fl_content, contactsFragment, "contactsFragment");
}
//将在自己显示,将其他隐藏
transaction.show(contactsFragment);
break;
case R.id.btn_zone:
//判断Fragment是否已经被添加了
if (!zoneFragment.isAdded()) {
transaction.add(R.id.fl_content, zoneFragment, "zoneFragment");
}
//将在自己显示,将其他隐藏
transaction.show(zoneFragment);
break;
default:
break;
}
transaction.commit();
}
}
04. Fragment的生命周期
- 当Fragment直接嵌入Activity布局时生命周期,Fragment与Activity的生命周期绑定
- 当通过代码动态添加Fragment时的生命周期
- new Fragment的时候是不走任何生命周期方法的
- 只有在事务提交之后,才开始走生命周期方法
05. Fragment之间的通信
- 获取Fragment管理器
- FragmentManager fragmentManager = getFragmentManager();
- 通过管理器获取你想要的跟这个Fragment 属于同一个Activity的其他Fragment
- RightFragment rightFragment = (RightFragment)
- fragmentManager.findFragmentByTag(“right”);
- 调用另一个Fragment的方法传递数据
06. 其他
- 在Fragment中可以通过 getActivity()获取上下文
- getActivity 如果当前Fragment还没有跟Activity绑定, 我们就用了getActivity(),返回的是null,所以要避免空指针异常
- 兼容低版本
- Fragment为了兼容低版本,选用V4包下的
- 继承Activity的子类FragmentActivity