Fragment使用详解(基础易懂)

fragment主要是用在类似平板中的浏览新闻时(左侧是列表,右侧是具体内容),点击左侧的列表不同项,右边会有相应的变化,有点类似点击按钮实现activity页面的跳转,但实质是不一样的,采用fragment切换速度明显快(详解见下),而且会始终在主界面。

fragment是一种控制器对象,activity可以委派它来管理用户界面,这个界面可以是整屏或者整屏的一部分,在activity视图中可以插入fragment视图。在使用fragment时,会有android.app.Fragment和android.support.v4.app.Fragment,一般选择后者,因为涉及到android版本的问题,根据google官方文档,后者是适用于android3.0以前的平台,但是对于3.0之后的也还是可以使用。两者的用法上也存在一定区别,在获取FragmentManager的对象时,后者需要使用getSupportFragmentManager(),而前者则使用getFragmentManager

依旧采用一个简易APP贯穿全文的方式,来解释相关知识点,APP效果如下


fragment.gif

使用fragment:
1.需要写一个类继承自Frament,并重写onCreateView方法(加载视图,初始化控件,返回一个View对象或者null),重写onCreateActivity方法(对控件进行操作,如设置适配器)
2.在主界面中使用一个Fragment布局,当做容器,由于该布局的特性是所有的控件会以叠罗汉的方式摆放,所以每次切换不过是新的内容覆盖了之前的内容,这个速度当然要比activity的跳转来的快
3.切换时需要用到
FragmentManager manager = getSupportFragmentManager(); //得到Fragment管理者对象
ManagerTransaction transaction = manager.beginTransaction(); //通过管理者开启新事务
transaction.add(R.id.container, fragment); //第一个参数是之前提到的Fragment容器,这个id即为在Fragment布局中定义的id,第二个参数是Fragment对象
最后使用 transaction.commit(); // 提交这个事务,然后就切换啦

在本例中只是一个简单的学校列表和具体内容展示,所以用到了两个类(标题类和内容类)分别继承Fragment,列表类中只是负责简单的使用ListView展示学校名称即可,在内容类中进行具体的改变内容的操作。那么问题来了,内容类需要根据用户的选择来对应改变内容,所以必须知晓用户点击的是列表中的哪一项,下面详解

主要是在标题类中暴露一个接口,在接口中设置一个方法,给定参数为int型,同时在标题类中声明一个全局变量为该接口的引用最后在ListView的OnItemClickListenenr中调用接口中的方法,并把点击的子项对应的序号当做参数传进去。接下来呢,在主Activity中实现这个接口,并实现接口中的方法,获得点击的序号,并把这个参数传递给内容类。此处的传值使用到Bundle, 这个有点类似Intent的值传递(便于理解,当然还是不一样,实现见代码)。
传值时 Bundle args = new Bundle(); args.putInt("index", index); //传递序列号给内容类 fragment.setArguments(args);
取值时 Bundle args = getArguments(); index = args.getInt("index", 0); //获取由标题类传递过来的用户点击的序列号

如果按照上诉方法完成代码后,测试APP会发现,点击左侧列表后,右侧内容信息没有变化,原因在于这里面还有一个问题没解决。见下

在主Activity中实现的接口,该接口的引用和标题类中操作序列号的接口的引用并不是同一个,也就是在主Activity中根本没有获取到序列号的值,所以还需要处理,方法见下

在标题类中设置一个方法,给定参数为该接口的引用(然后写明这个参数中的引用和全局变量中的引用相等),然后在主Activity中通过标题类的对象调用这个方法,通过这种方式把操作序列号的引用与接口传递的引用等同。此处需要注意获取标题类的对象的方法,
TitleFragment titleFragment = (TitleFragment) getSupportFragmentManager().findFragmentById(R.id.title_fragment);

代码中有详细的注释,FragmentTest
上诉主要是自己的理解,水平有限,有错误希望一起探讨哈

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,069评论 25 709
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,805评论 18 399
  • 人常用“上得厅堂,下得厨房”来形容秀外慧中的女子,这句话放在我身上好像不大恰当,首先像我这样萌萌哒的人是镇不住场的...
    林馨逸阅读 213评论 0 0
  • 今天带着大家来给自己的Mac上安装Git自动提示。以后在写代码的时候,就可以使用Tab键愉快地输入各种命令了。 第...
    地球是猿的阅读 1,744评论 0 0