Fragment

Fragment组件

  1. Fragment的创建
  2. Fragment的添加在Activity中
  3. Fragment的之间的切换
  4. Fragment的生命周期
  5. Fragment的之间的通信
  6. 其他
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的之间的切换
  1. 通过replace切换
    -通过replace切换时每次都会将上一个Fragment销毁,然后重新创建,太浪费资源.

  2. 通过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的生命周期
  1. 当Fragment直接嵌入Activity布局时生命周期,Fragment与Activity的生命周期绑定
    activity_fragment_lifecycle
  2. 当通过代码动态添加Fragment时的生命周期
    • new Fragment的时候是不走任何生命周期方法的
    • 只有在事务提交之后,才开始走生命周期方法
05. Fragment之间的通信
  1. 获取Fragment管理器
    • FragmentManager fragmentManager = getFragmentManager();
  2. 通过管理器获取你想要的跟这个Fragment 属于同一个Activity的其他Fragment
    • RightFragment rightFragment = (RightFragment)
    • fragmentManager.findFragmentByTag(“right”);
  3. 调用另一个Fragment的方法传递数据
06. 其他
  1. 在Fragment中可以通过 getActivity()获取上下文
    • getActivity 如果当前Fragment还没有跟Activity绑定, 我们就用了getActivity(),返回的是null,所以要避免空指针异常
  2. 兼容低版本
    • Fragment为了兼容低版本,选用V4包下的
    • 继承Activity的子类FragmentActivity
  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值