Android之再谈Fragment

上一次我写了一个Fragment的简单使用,这次我来实现这个:

首先想想上次写的东西 crime类 crimeFragmnet类 crimeActivity类

如上图的的前三个类。和上次一样这次我们来建CrimeLab类 crimeListFragement类和crimeListActivity类。

上次,我们为fragment加入xml布局文件,我们在重写onCreateView的方法中使用inflater把xml文件填充到我们的fragment;

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {    View v=inflater.inflate(R.layout.fragment,container,false);

现在来看看这次我们的fragmnet类的代码

 1 package com.example.leiyunjie.crime;
 2
 3 import android.os.Bundle;
 4 import android.support.v4.app.ListFragment;
 5 import android.util.Log;
 6 import android.view.View;
 7 import android.widget.ArrayAdapter;
 8 import android.widget.ListView;
 9
10 import java.util.ArrayList;
11
12 /**
13  * Created by leiyunjie on 2016/4/21.
14  */
15 public class CrimeListFragment extends ListFragment {
16
17     private ArrayList<crime> mCrimes;
18     private static final String TGA="CrimeListFragment";
19     @Override
20     public void onCreate(Bundle savedInstanceState){
21         super.onCreate(savedInstanceState);
22         getActivity().setTitle("Crimes");
23         mCrimes=CrimeLab.get(getActivity()).getmCrimes();
24
25         ArrayAdapter<crime> adapter=
26                 new ArrayAdapter<crime>(getActivity(),
27                         android.R.layout.simple_expandable_list_item_1,
28                         mCrimes);
29         setListAdapter(adapter);
30
31     }
32     @Override
33     public void onListItemClick(ListView l, View v, int position, long id){
34         crime c=(crime)(getListAdapter()).getItem(position);
35         Log.d(TGA,c.getmTitle()+"was clicked");
36     }
37 }

crimelistFragment

这次我们的public class CrimeListFragment extends ListFragment  也就是这个crimelistfragment继承ListFragment,而ListFragment 类默认实现方法已生成了一个全屏 ListView 布局,我们也就可以不用自己布局了。现在我们要做的就是把要显示的crimelab对象放进这个listview布局。

现在来看看crimelab的代码

 1 package com.example.leiyunjie.crime;
 2
 3 import android.content.Context;
 4
 5 import java.util.ArrayList;
 6 import java.util.UUID;
 7
 8 /**
 9  * Created by leiyunjie on 2016/4/21.
10  */
11
12 //单例
13 public class CrimeLab {
14     private ArrayList<crime> mCrimes;
15
16     private static CrimeLab sCrimeLaab;
17     private Context mAppContext;
18
19    //随机产生100个实例
20     private CrimeLab(Context appContext){
21         mAppContext=appContext;
22         mCrimes=new ArrayList<crime>();
23         for(int i=0;i<100;i++){
24           crime c=new crime();
25             c.setmTitle("crime #"+i);
26             c.setmSolved(i%2==00);
27             mCrimes.add(c);
28         }
29
30
31     }
32     public static  CrimeLab get(Context c){
33         if(sCrimeLaab==null){
34             sCrimeLaab=new CrimeLab(c.getApplicationContext());
35         }
36         return sCrimeLaab;
37     }
38
39     public  ArrayList<crime> getmCrimes(){
40
41         return  mCrimes;
42     }
43
44     public crime getCrime(UUID id){
45         for(crime c:mCrimes){
46             if(c.getmID().equals(id))
47                 return c;
48         }
49         return null;
50     }
51
52
53
54 }

crimelab

我们将crime数组对象存储在一个单例里。单例是特殊的java类,在创建实例时,一个类仅允许创建一个实例。应用能够在内存里存在多久, 单例就能存在多久, 因此将对象列表保存在单例里可保持crime数据的一直存在,不管activity、fragment及它们的生命周期发生什么变化。要创建单例,需创建一个带有私有构造方法及 get() 方法的类,其中 get() 方法返回实例。如实例已存在, get() 方法则直接返回它;如实例还未存在, get() 方法会调用构造方法来创建它。
public static  CrimeLab get(Context c){    if(sCrimeLaab==null){        sCrimeLaab=new CrimeLab(c.getApplicationContext());    }    return sCrimeLaab;}
为了看看效果我产生100个随机对象来填充arraylist:
private CrimeLab(Context appContext){    mAppContext=appContext;    mCrimes=new ArrayList<crime>();    for(int i=0;i<100;i++){      crime c=new crime();        c.setmTitle("crime #"+i);        c.setmSolved(i%2==00);        mCrimes.add(c);    }
现在我们有了一个有着100个随机产生的crime对象的arraylist,接下来把他放到fragment中先获得该arrylist
private ArrayList<crime> mCrimes;
 mCrimes=CrimeLab.get(getActivity()).getmCrimes();
然后该使用adapter来工作了:    ArrayAdapter<crime> adapter=            new ArrayAdapter<crime>(getActivity(),                    android.R.layout.simple_expandable_list_item_1,                    mCrimes);    setListAdapter(adapter);

}顺便说说adapter:         adapter的继承关系:

adapter和listview的对话


创建ArryAdapter时必须指定三个参数:Context,textViewResourceId,数组或list。对应上面的getActivity(), android.R.layout.simple_expandable_list_item_1, mCrimes。

就是把数组或list中的东西放到android.R.layout.simple_expandable_list_item_1代表的一个textview中,该textview将作为ArryAdapter的列表组件。

放好后我们就把Adapter反到ListView中就ok了,setListAdapter(adapter); 前面省略了默认的全屏 ListView 。

fragment算是写好了,现在要写一个activity来托管这个fragmnet了

看看代码

 1 package com.example.leiyunjie.crime;
 2
 3 import android.support.v4.app.Fragment;
 4
 5 /**
 6  * Created by leiyunjie on 2016/4/21.
 7  */
 8 public class CrimeListActivity extends SingleFragmentActivity {
 9     @Override
10     protected Fragment createFragment(){
11         return new CrimeListFragment();
12     }
13 }

crimelistactivity

是的,我们完全可以和上次写的activity代码一样,只不过要在一下代码段

if(fragment==null){
    fragment=XXXXXX;
    fm.beginTransaction()
   .add(R.id.fragment,fragment)
    .commit();
}
}

对就是 fragment=XXXXXX;这里不一样,如果我们要写很多不同的activity去托管fragment时,大部分代码就是在重复,这时我们可以考虑建立一个抽象类去减少吃饭代码

我们建立一个singlefragmentactivity类

 1 package com.example.leiyunjie.crime;
 2
 3 import android.os.Bundle;
 4 import android.support.v4.app.Fragment;
 5 import android.support.v4.app.FragmentActivity;
 6 import android.support.v4.app.FragmentManager;
 7
 8 /**
 9  * Created by leiyunjie on 2016/4/21.
10  */
11 public abstract class SingleFragmentActivity extends FragmentActivity {
12      protected abstract Fragment createFragment();
13     @Override
14     public void onCreate(Bundle saveInstanceState){
15         super.onCreate(saveInstanceState);
16         setContentView(R.layout.activity_fragment);
17         FragmentManager fm=getSupportFragmentManager();
18         Fragment fragment=fm.findFragmentById(R.id.fragment);
19         if(fragment==null){
20             fragment=createFragment();
21             fm.beginTransaction()
22                     .add(R.id.fragment,fragment)
23                     .commit();
24         }
25     }
26 }

SingleFragmentActivity

是的,在里面我使用了fragment=createFragment();

然后我们再新建activity时只要继承该抽象类,然后去实现该方法就ok了;

比如我们回到上一篇的文章,把其中的activity.java文件进行修改

package com.example.leiyunjie.crime;

import android.support.v4.app.Fragment;

public class crimeActivity extends SingleFragmentActivity {

    @Override
    protected Fragment createFragment(){
        return new crimeFragmnet();
    }
}

现在的代码清爽多了不是。

总结一下,这部分还是很简单的,就比上一篇文章多了arrayliat和arryadapter,以及建了个抽象类。注意这次我们继承的是listfragment类,所以不需要为fragment指定布局文件,其次activity的布局文我们还是使用的上次的布局文件,也就是在SingleFragmentActivity中的

public void onCreate(Bundle saveInstanceState){    super.onCreate(saveInstanceState);    setContentView(R.layout.activity_fragment);......这也大大将少了代码量,以后的学习中要尽量养成这种简约的习惯,养成良好的代码习惯

 
时间: 2024-07-29 14:54:44

Android之再谈Fragment的相关文章

Android 再谈handler

今天在做http网络事件的响应网络接收处理一般不能放在主线程中使用,目前也只会使用AsyncTask进行处理!之前虽然写过handler处理的一些文章但是发现全不会了!无奈~ 关于handler某位兄弟已经整理的很透彻了!现在引用下原话如下: Handler监听者框架:子线程是事件源,主线程是监听者.Handler作为子线程的监听器出现:主线程中生成Handler的子类,并重写handleMessage(Message msg) 方法,用来对子线程响应.子线程调用Hanlder的sendMess

OpenglES2.0 for Android:再谈纹理映射

OpenglES2.0 for Android:再谈纹理映射 前言 上一节我们实现了一个简单的纹理映射的例子--一个简单的贴图,这节我们来做一些稍微复杂一点的例子,最后再给我们前面的立方体做一个纹理. 纹理拉伸 重复拉伸方式 这种是经常使用的一张纹理拉伸方式,常用于绘制一些重复的元素,比如我们在游戏绘制一幅方格式的地图时.使用重复拉伸方式使得纹理能够根据目标平 面的大小自动重复,这样既不会失去纹理图的效果,也可以节省内存.如下图所示: 实现起来很简单,我们回到上节的项目,找到我们纹理的工具类Te

再谈Unity调用Android的Activity

这段时间在研究Unity4.3开发环境下,如何调用由Android SDK4.4.2写的Activity.参考了很多网上的博客,百度出了几十篇大部分都是转载雨松MOMO的,这里必须向雨松MOMO表示敬意!但雨松MOMO写的博客太旧了,不少内容已经过时,我严格按他说的步骤进行,还是出了问题,所以本博客就是告诉大家在Unity4.3+Android SDK4.4.2环境,起动Activity的细节. 我这篇博客不会从零讲起,所以首先给出两个重要的链接,大家应该看一下: 第一个是雨松MOMO的  ht

Android开发-浅谈架构(二)

写在前面的话 我记得有一期罗胖的<罗辑思维>中他提到 我们在这个碎片化 充满焦虑的时代该怎么学习--用30%的时间 了解70%该领域的知识然后迅速转移芳草鲜美的地方 像游牧民族那样.原话应该不是这样,但是我想说的是 自从我想写一些笔记记录知识的时候 为了不误导其他人 我不得不参考github 一些比较知名大牛的代码.在这个过程中 我下载过很多demo.一点一点的啃 汲取精华的部分 当然也充满疑惑.后来觉得标题取得有点大了 我应该取"学习"类的标题才对.但是另一方面我也只能就

Android UI开发——使用Fragment构建灵活的桌面

当我们设计应用程序时,希望能够尽最大限度的适配各种设备,包括4寸屏.7寸屏.10寸屏等等,Android开发文档给了我们参考,而且Google  IO的app(如图二)也实现了这种思想,他们都是使用layout.layout-large里面不同的布局文件实现的.当设计应用程序,你可以在不同的布局结构中重复使用Fragment,以支持众多的屏幕尺寸,,在可用的屏幕空间上优化用户体验.例如在手持设备(如Nexus 4)上,一个屏显示一个Fragment,在更大屏(如Nexus 7)上可以使用多个Fr

【Android开发】之Fragment与Acitvity通信

上一篇我们讲到与Fragment有关的经常使用函数,既然Fragment被称为是"小Activity".如今我们来讲一下Fragment怎样与Acitivity通信.假设上一篇还有不懂得.能够再看一下. 传送门. Fragment与Activity通信的方式例如以下: 一.通过初始化函数提供 1.在动态加入Fragment的过程中,我们在Activity中通过Fragment.setArguments()的方法为Fragment提供数据. 2.在Fragment中,在onAttach(

Android开发-API指南-Fragment

Fragments 英文原文:http://developer.android.com/guide/components/fragments.html 采集日期:2014-12-31 在本文中 设计理念 创建 Fragment 添加用户界面组件 把 Fragment 加入 Activity 管理 Fragment 执行 Fragment 事务 与 Activity 通讯 创建 Activity 的事件回调方法 在 Action Bar 中添加菜单项 处理 Fragment 的生命周期 与 Act

Android实习札记(4)---Fragment(碎片)基本概念解析

Android实习札记(4)---Fragment(碎片)基本概念解析 转载请注明出处:coder-pig Fragment相信大家都不会陌生吧,侧滑啦,抽屉效果啦,DialogFragment啊等等,一堆地方都会 用到Fragment,对于Fragment的基本概念在前面的文章中其实已经给出的了,这里回顾一遍, 温故而知新嘛,同时结合Google官方的api进行复习! 1)什么是Fragment以及它的生命周期: 核心要点: 1)3.0版本后引入,即minSdk要大于11 2)Fragment

再谈 Go 语言在前端的应用前景

12 月 23 日,七牛云 CEO & ECUG 社区发起人许式伟先生在 ECUG Con 2018 现场为大家带来了主题为<再谈 Go 语言在前端的应用前景>的内容分享. 本文是对演讲内容的实录整理. 今年是举办 ECUG Con 的第 11 年,之前我谈的基本都是服务端的开发实践.从去年起我开始不谈后端而是谈前端.当然,去年我没有说为什么我会关注前端.今天再谈 Go 语言在前端的应用之前,我先简单聊一下思路脉络,为什么我今天会关注前端. 前端的演进 最早的 PC 时期,常见的设备主