android Fragment碎片

Fragment的概念与使用


1. Fragment概述

1.1 介绍

Fragment是一种可以嵌入在活动中的UI片段,能够让程序更加合理和充分地利用大屏幕的空间,出现的初衷是为了适应大屏幕的平板电脑,可以将其看成一个小型的Activity,又称作Activity片段。


从官方的定义可以得到:

  • Fragment依赖于Activity,不能独立存在。
  • 一个Activity可以拥有多个Fragment
  • 一个Fragment可以被多个Activity重用
  • 有自己的生命周期,能接收输入事件
  • 可以在Activity运行时动态添加删除Fragment

Fragment的优势

  • 模块化:不必将所有代码写进Activity中,写在各自Fragment中就可。
  • 可重用:多个Activity可以使用一个Fragment
  • 可适配不同屏幕大小、方向等。

1.2 生命周期


2.Fragment使用

有静态调用动态调用两种

静态调用是用name指定一个.class文件的路径,在这个.class文件中使用onCreateView方法,创建并返回一个View显示出来。而创建部分,则通过inflater的inflate方法,传入一个要显示的XML文件。

<!--  静态调用  -->

    <fragment
        android:id="@+id/image_fragment"
        android:name="com.example.fragmentdemo.ImageViewFragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="3"></fragment>

动态调用是在MainActivity.java文件的onCreate方法中这样操作一下

        FragmentManager fm = getSupportFragmentManager();
        // 片段管理器
        fm.beginTransaction().add(R.id.listFragment , new ListViewFragment()).commit();
        // 开始一个事物   添加(容器 , 片段)  提交当前操作

传入的ID则是主XML文件中的动态调用部分的ID名
传入的对象是👉创建要显示View的.java文件的对象,这个对象onCreateView一个View并返回

👇XML文件是这样的

<!--  动态调用  -->

    <HorizontalScrollView  这个名LinearLayout也行 都行
        android:id="@+id/listFragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"></HorizontalScrollView>


3.Fragment的动态添加和移除

  1. 先获取一个片段
FragmentManager fm = getSupportFragmentManager();
Fragment frag = fm.findFragmentById(R.id.listFragment);  // 获取片段  传的是Fragment的ID
  1. 移除一个片段
fm.beginTransaction().remove(frag).commit(); // 移除片段
//                          要删除的片段
  1. 添加一个片段
fm.beginTransaction().add(R.id.listFragment , new ListViewFragment()).commit();
//                       添加到这个ID            从这创建和返回          最后提交

👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆



Fragment之间的通信

1. MainActivity和Fragment的
在MainActivity.java中添加onStart(){}方法,这个方法会在页面创建之后开始执行

使用Avtivity中的方法findViewById,通过ID找到你要操作的地方,更改就可以。

---------------------------------------------

这是一个例子👇:

@Override
    protected void onStart() {
        super.onStart();
        final ImageView img_fra = findViewById(R.id.image_view); // 先获取上面的显示的ImageView

        for(int i = 0; i < img.length; i ++ ){
            ImageView iv = (ImageView) findViewById(img[i]);
            if(iv!=null) {
                // 存在 则设置点击监听
                iv.setOnClickListener(new View.OnClickListener(){
                    @Override
                    public void onClick(View view) {  // 这个view是被点击的东西
                        ImageView view1 = (ImageView) view;
                        img_fra.setImageDrawable(view1.getDrawable());
                    }
                });
            }
        }
    }

2. Fragment和自己
在用来创建片段的java文件中(就是onCreate那个),新建onActivityCreated方法

还是使用Avtivity中的方法findViewById,通过ID找到你要操作的地方。
但不可以直接用,因为这是在别的java文件中,不是MainActivity.java中,不可以直接使用这个方法。
需要this.getActivity().findViewById();

--------------------------------------------------

这是一个例子👇:

@Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        final ImageView img_fra = this.getActivity().findViewById(R.id.image_view); // 先获取上面的显示的ImageView

        for(int i = 0; i < img.length; i ++ ){
            ImageView iv = (ImageView) this.getActivity().findViewById(img[i]);
            if(iv!=null) {
                // 存在 则设置点击监听
                iv.setOnClickListener(new View.OnClickListener(){
                    @Override
                    public void onClick(View view) {  // 这个view是被点击的东西
                        ImageView view1 = (ImageView) view;
                        img_fra.setImageDrawable(view1.getDrawable());
                    }
                });
            }
        }
    }

更建议使用第二种

  • 因为第一种需要记住很多很多Fragment的信息,而第二种可以在各自内部处理
  • Fragment1并不知道Fragment2的存在,只有在Activity中创建好才能知道,即当activity的onCreate方法执行完,Fragment才能彼此看见对方
  • 此时是Fragment的回调方法OnActivityCreated()执行的时刻,所以把空间获取操作和事件处理代码放在这。

fragment之间不能操作 activity才能操作所有fragment



3. 通过接口实现Fragment和Activity的通信

这种方法是安卓的官方文档中的

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值