最新Androidx Fragment的前世今生系列(一)之Fragment的简单使用

背景

Fragment(碎片)是Android3.0提出来的概念,当时的主要目的是为了适配平板,准备将Activity碎片化,每个部分单独处理。fragment相较于Activity更加轻量,但是展示的效果与Actvity差不多,这给页面布局带来了更多的灵活性。由于Androidx的强制推行,以前的文章过于老旧,所以写下这一系列文章总结一下。

Fragment的优势

  • 模块化 可以不用将所有代码写在Activity中,而是写在Fragment中,降低耦合。
  • 可复用 fragment可以被多个Activity重用。
  • 可适配 可以对不同大小的屏幕进行适配。

Fragment的简单使用

方法一:静态添加

静态添加就是将fragment当作一个控件内嵌在Activity的布局文件之中,这种方法并不提倡,这牺牲了Fragment的灵活性,没有发挥出Fragment应有的作用。使用如下
两个Fragment FragmentOne和FragmentTwo的布局文件如下

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:background="@color/colorAccent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是FragmentOne"
        android:layout_centerInParent="true">
    </TextView>
</RelativeLayout>


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是FragmentTwo"
        android:layout_centerInParent="true">
    </TextView>
</RelativeLayout>

两个Fragment的类文件,注意继承Androidx包下的Fragment,通过重写onCreateView方法返回Fragment视图,关于Fragment的生命周期将会下一篇文章重点介绍。

public class FragmentOne extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_one, container, false);
        return view;
    }
}

public class FragmentTwo extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_two, container, false);
    }
}

接下来将Fragment当作控件加入MainActivity布局文件,注意这里的id和name必填,否则会报错

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <fragment
           android:id="@+id/fragment_one"
           android:layout_width="match_parent"
           android:layout_weight="1"
           android:name="com.snow.fragmentdemo.FragmentOne"
           android:layout_height="match_parent">
       </fragment>
       <fragment
           android:id="@+id/fragment_two"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:name="com.snow.fragmentdemo.FragmentTwo">
       </fragment>
   </LinearLayout>
</FrameLayout>

效果如下

方法二:动态添加



动态加载是使用FragmentManager和FragmentTransaction提供的API完成的,在Androidx中通过getSupportFragmentManager()获取FragmentManager。

  FragmentManager fm = getSupportFragmentManager();
  FragmentTransaction transaction = fm.beginTransaction();

下表列出了常用的API.

FragmentMananger
返回值函数描述
FragmentfindFragmentById通过ID来获取Fragment
FragmentfindFragmentByTag通过Tag来获取Fragment
List< Fragment>getFragments获取所有被添加到FragmentManager中的Fragment
FragmentTransactionbeginTransaction获取FragmentTransaction
FragmentTransaction
返回值函数描述
FragmentTransactionadd向container中加入一个Fragment
FragmentTransactionremove移除一个Fragemnt
FragmentTransactionreplace替换Fragment
FragmentTransactioncommit提交事务
FragmentTransactionshow展示Fragment
FragmentTransactionhide隐藏Fragment
FragmentTransactionaddToBackStack将事物加入回退栈
事项注意
  • replace是将FragmentManager中所有的Fragment先移除再加入Fragment
  • 每一个事物只能提交一次,否则回报错重复提交
  • 调用addToBackStack后,按物理回退建会回滚,fragment页面内容也不会变,如TextView里的内容,没有调用,按物理回退建,直接退出Activity。
  • 一个commit可以包含多个操作,如add,remove等
关键代码
public class MainActivity extends AppCompatActivity implements  View.OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        findViewById(R.id.button1).setOnClickListener(this);
        findViewById(R.id.button2).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        FragmentManager fm = getSupportFragmentManager();
        switch (v.getId()) {
            case R.id.button1:
                FragmentTransaction transaction = fm.beginTransaction();
                transaction.replace(R.id.content, new FragmentOne());
                transaction.commit();
                break;
            case R.id.button2:
                FragmentTransaction transaction2 = fm.beginTransaction();
                transaction2.replace(R.id.content, new FragmentTwo()).commit();
                break;
        }
    }
}

相关文章

最新Androidx Fragment的前世今生系列(一)之Fragment的简单使用
最新Androidx Fragment的前世今生系列(二)之Fragment的生命周期
最新Androidx Fragment的前世今生系列(三)之Fragment与Acivity的通信

最后

点赞就是最大的支持,更多学习资料可以关注公众号QStack,追寻最纯粹的技术,享受编程的快乐。
在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用和提到了androidx中实现Fragment懒加载的方案。在androidx中,可以使用setMaxLifecycle()方法来设置Fragment的状态,取代了setUserVisibleHint()方法。通过在构造FragmentPagerAdapter时传入BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT参数,并将加载数据的逻辑放到Fragment的onResume()方法中,就可以实现Fragment的懒加载。这种方案可以有效地减少不必要的数据加载和提高性能。同时,androidx还引入了一些新的内容,为开发者提供了很多便利。你可以参考相关的文章和代码来深入了解和实践该方案。 引用提到了网上已经有很多关于androidxFragment懒加载的文章,但大多数只是点到了setMaxLifecycle()和修改FragmentPagerAdapter这两个方面,很少有实践的文章。因此,该文章详细记录了作者实践后的结果,可以作为更加详尽的参考。 总结起来,androidx中的Fragment懒加载可以通过setMaxLifecycle()方法和修改FragmentPagerAdapter来实现,并且androidx还引入了一些新的内容,为开发者提供了更多便利。你可以参考相关的文章和代码来了解和实践该方案。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [androidx中的Fragment懒加载方案](https://blog.csdn.net/qq_36486247/article/details/102531304)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [androidx中的Fragment懒加载](https://blog.csdn.net/tongsiw/article/details/107991830)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [androidx下的fragment的lazy懒加载问题详解](https://download.csdn.net/download/weixin_38606656/14916018)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值