Fragment

前言:
Fragment的设计哲学
Android在3.0中引入了Fragment的概念,主要目的是用在大屏幕设备上,例如平板电脑,支持更加动态和灵活的UI设计;平板电脑的屏幕要比手机的大得多,有更多的UI组件,并且这些组件会产生更多的交互.
Fragment在你的应用中应当是一个模块化和可重用的组件,因为Fragment定义了它自己的布局,以及通过使用它自己的生命周期回调函数定义了它自己的行为,你可以将Fragment添加到多个Activity中.

知识概要:
1> Fragment乐意作为Activity界面的一部分组成出现;
2> 一个Activity钟可以同时出现多个Fragment,并且一个Fragment也可以添加到多个Activity中去使用;
3> 在Activity运行的过程中,可以添加,移除或者替换Fragment;
4> Fragment可以响应自己的输入事件,并且有自己的生命周期,他们的生命周期会受到宿主Activity生命周期的影响.

Fragment的使用
1> fragment本身和activity很相似
2> fragment 本身存在生命周期 创建一个fragment继承自系统的Fragment
然后在OnCreateView方法中从布局文件中加载View
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//在资源文件中加载视图 返回一个视图给我们
View view = inflater.inflate(R.layout.hello,container,false);
return view;
}
3> 最后将fragment加到 activity中,就能显示出来 fragment的加载方式通常会有两种:

< 一 > 静态加载
在Activity的layout文件中声明Fragment,需要特别注意的是中的android:name属性指定了在layout中实例化的Fragment类;静态加载Fragment 在Activity中必须要为fragment设置一个id唯一标识,否则会报错。
Activity的XML文件中静态加载Fragment:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#FFED1E07">

    <fragment
        android:id="@+id/fragment"  <指明唯一标识>
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:name="com.example.zxjk.fragment_01.MyFragment"/>
</LinearLayout>

< 二 > 动态加载
通过撰写代码将Fragment添加到一个Activity的Layout中.
动态加载Fragment在Android中称为处理Fragment事务;根据用户的交互情况对fragment进行添加,移除,替换以及执行其他动作,提交给Activity的每一套动作变化被称作一个事务;提交时,必须调用commit()方法.

public class Main2Activity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        MyFragment myFragment = new MyFragment();
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.add(R.id.linear,myFragment);  < 添加fragment >
        transaction.commit();
    }
}

4> 通过使用FragmentManager向activity中添加fragment FragmentManger不能使用V4的包 否则会报错.

注释:
**在activity中首先从layout中加载view设置成activity的内容视图
setContentView(R.layout.activity_main);
设置完activity的内容视图之后,可以通过事先指定的id拿到指定的控件
button = (Button)findViewById(R.id.button);**

< Fragment的生命周期 >
onAttach(Activity activity)
onCreate()

这里写图片描述
这里写图片描述

< Fragment 与 Activity的通信 >
1> Fragment可调用getActivity()方法获取它所在的Activity;
2> Activity可调用FragmentManager的findFragmentByID() 或者findFragmentByTag()方法 获取Fragment;
3> Activity—>>Fragment 在Activity中创建Bundle数据包,并调用Fragment的setArguments(Bundle bundle)方法;

 /** activity 传递数据给 fragment  */
        Bundle bundle = new Bundle();
        bundle.putString("name","决定到手");
        myFragment.setArguments(bundle);

        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.add(R.id.linear,myFragment);
        transaction.commit();
String string = getArguments().get("name")+"";  // 接收到 activity传递过来的数据

4> Fragment –>>Activity 需要在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity实现该回调接口,这样Fragment可调用该回调方法将数据传递给Activity.

5> 当一个Activity中需要加载多个Fragment时,其中涉及到方法的执行顺序:
现在activity需要加载显示4个不同的fragment
08-16 10:26:32.761 19913-19913/com.example.zxjk.lydemo_android_02 I/activity>>: onStart
08-16 10:26:32.761 19913-19913/com.example.zxjk.lydemo_android_02 I/activity>>: onResume
08-16 10:26:32.791 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_01>>: onAttach
08-16 10:26:32.791 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_01>>: onCreate
08-16 10:26:32.791 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_01>>: onCreateView
08-16 10:26:32.811 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_01>>: onStart
08-16 10:26:32.811 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_01>>: onResume
08-16 10:26:32.811 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_02>>: onAttach
08-16 10:26:32.811 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_02>>: onCreate
08-16 10:26:32.811 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_02>>: onCreateView
08-16 10:26:32.811 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_03>>: onAttach
08-16 10:26:32.811 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_03>>: onCreate
08-16 10:26:32.811 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_03>>: onCreateView
08-16 10:26:32.811 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_04>>: onAttach
08-16 10:26:32.811 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_04>>: onCreate
08-16 10:26:32.811 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_04>>: onCreateView
08-16 10:26:32.821 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_02>>: onStart
08-16 10:26:32.821 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_02>>: onResume
08-16 10:26:32.821 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_03>>: onStart
08-16 10:26:32.821 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_03>>: onResume
08-16 10:26:32.821 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_04>>: onStart
08-16 10:26:32.821 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_04>>: onResume

我们可以看到 第一个fragment的所有方法一次性全部执行了,而后面的三个fragment依次创建,到最后才显示在activity上面。
setUserVisibleHint 网易新闻客户端 实现页面可见可加载,不可见不加载,节省用户流量.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值