Fragment

本文详细介绍了Fragment的基本概念,包括创建、添加、切换等操作,并探讨了Fragment间的通信方式及生命周期特点,帮助开发者更好地理解和运用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
### 定义 Fragment 意思是“碎片、片段”,表示 Activity 中的行为或用户界面部分,是 Activity 的模块化组成部分,可将多个片段组合在一个 Activity 中来构建多窗格 UI,也能在多个 Activity 中重复使用某个片段。它具有自己的生命周期,能接收自己的输入事件,可在 Activity 运行时添加或移除,可当作“子 Activity”在不同 Activity 中复用。Fragment 作为 Activity 界面的一部分必须依附于 Activity,与 Activity 一样拥有自己的生命周期,还能处理用户的交互动作。同一个 Activity 可以有一个或多个 Fragment 作为界面内容,可动态添加、删除 Fragment,灵活控制 UI 内容,也可用于解决部分屏幕适配问题 [^2][^4][^5]。 ### 使用方法 #### 静态使用 将 Fragment 当成普通的 View 一样声明在 Activity 的布局中,事件处理交给 Fragment。步骤如下: 1. 在 Activity 布局中添加 fragment 控件,用于加载想要显现的视图。 2. 创建 Fragment 类继承 Fragment,重写其中的 onCreateView(),使用 inflate 加载 Fragment 布局并返回视图 [^2]。 #### 动态使用 动态加载时,因有许多完成特定功能的 Fragment,所以需要对其进行管理,这时用到 FragmentManage 类。对 Fragment 进行添加、移除、替换等操作需通过 Fragment 事务处理,用到 FragmentTransaction 类。步骤如下: 通过 FragmentManager.beginTransaction() 开始一个事务,可在事务中对 Fragment 进行操作,如添加 add()、移除 remove()、替换 replace() 等,最后提交事务 commit(),还有 addToBackStack()、attach() 等操作。注意,Fragment 通过 ID 或者 Tag 作为标识,对 Fragment 操作后一定要提交,即调用 commit() [^2]。 ### 应用场景 Fragment 的目的是为了解决在不同的显示屏上动态和灵活的 UI 设计。可用于构建多窗格 UI,在同一个 Activity 中组合多个片段;可动态添加、删除 Fragment,灵活控制 UI 内容;还能用来解决部分屏幕适配问题 [^2][^4]。 ### 代码示例 以下是自定义 MyFragmentPagerAdapter 继承自 FragmentPagerAdapter 的示例代码: ```java import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; public class MyFragmentPagerAdapter extends FragmentPagerAdapter { public MyFragmentPagerAdapter(FragmentManager fm) { super(fm); } // 滑动的过程中呈现的Fragment的确定 @Override public Fragment getItem(int arg0) { Fragment fragment = null; switch (arg0) { case 0: fragment = new FragmnetFirst(); break; case 1: fragment = new FragmentSecond(); break; case 2: fragment = new FragmentThird(); break; } return fragment; } // 滑动的过程中可以呈现Fragment的个数 @Override public int getCount() { return 3; } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值