第 5 章 Android 控件进阶操作实战 ArrayAdapter 适配器 ListView 的数据渲染都需要借助适配器来完成, 首先看一下结合最简单的 ArrayAdapter 来实现 ListView 主布局文件 (activity_main.xml) 代码如下 : <?

Size: px
Start display at page:

Download "第 5 章 Android 控件进阶操作实战 ArrayAdapter 适配器 ListView 的数据渲染都需要借助适配器来完成, 首先看一下结合最简单的 ArrayAdapter 来实现 ListView 主布局文件 (activity_main.xml) 代码如下 : <?"

Transcription

1 108 Android 开发入门百战经典 第 5 章 Android 控件进阶操作实战 5.1 控之经典 ListView ListView 是最经典的控件之一, 虽然现在其江山地位不稳, 将要被 RecylerView 取 代, 但设计理念是很经典的, 而且很多程序员还是习惯了 ListView, 因此我们还需要对 ListView 进行深入学习 ListView 内容非常多, 读者要有足够的耐心进行学习, 每一个功 能点都有可能应用到项目中 ListView 经常被用在列表显示上, 每一个列表项都具有相同的布局, 一个 ListView 通 常都有三个要素组成 : ListView 控件 适配器类, 用到了设计模式中的适配器模式, 它是视图和数据之间的桥梁, 负责提供对数据的访问, 生成每一个列表项对应的 View 常用的适配器类有 ArrayAdapter SimpleAdapter 和 SimpleCursorAdapter 数据源 当然最重要 最复杂的部分就是适配器类的编写和设计, 在一些复杂的界面, 常常需要对适配器类进行相关逻辑处理 ListView 的常用属性如表 5.1 所示 表 5.1 ListView 的常用属性 属性说明 android:divider android:dividerheight android:listselector android:scrollbars 子项分割线分割线高度子项单击效果滑动条 ListView 的常用方法如表 5.2 所示 表 5.2 ListView 的常用方法 方法说明 addfooterview(view v) addheaderview(view v) setadapter(listadapter adapter) setdivider(drawable divider) setdividerheight(int height) 在列表尾部加入一个 View 在列表头部加入一个 View 设置适配器设置子项分隔栏设置分隔栏高度

2 第 5 章 Android 控件进阶操作实战 ArrayAdapter 适配器 ListView 的数据渲染都需要借助适配器来完成, 首先看一下结合最简单的 ArrayAdapter 来实现 ListView 主布局文件 (activity_main.xml) 代码如下 : <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=" android:layout_height="match_parent"> <ListView android:id="@+id/lv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:divider="@android:color/holo_red_dark" android:dividerheight="3dp" android:scrollbars="none"/> </RelativeLayout> 上述代码设置了 divider 属性, 在 ListView 的子项之间添加分隔栏 ; 设置了 dividerheight 属性, 决定了分隔栏的高度 ; 将 scrollbars 属性的值设置为 none 表示上下拖动时在右侧没有滑动条 MainActivity.java 代码如下 : public class MainActivity extends Activity { private ListView mlistview; private String mdatas[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday";// 准备数据源 private ArrayAdapter<String> madapter; protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); requestwindowfeature(window.feature_no_title);// 隐藏标题栏 setcontentview(r.layout.activity_main); mlistview = (ListView) findviewbyid(r.id.lv); // 实例化 ArrayAdapter madapter = new ArrayAdapter<String>(this, android.r.layout.simple_list_item_1, mdatas); // 设置适配器 mlistview.setadapter(madapter); 创建一个 ArrayAdapter 对象需要传入三个参数 : 上下文对象 子项布局 id( 用到了 Android 内置的 list 布局 ) 数据源 上述代码中 ArrayAdapter 的数据源传入的是字符数组, 最后调用 ListView 的 setadapter 方法为 ListView 设置适配器 运行实例, 如图 5.1 所示 可以看出, 每个子项之间存在分隔栏, 上下拖动 ListView 时最右边也不会有滑动条出现

3 110 Android 开发入门百战经典 SimpleAdapter 适配器 图 5.1 ListView 之 ArrayAdapter ArrayAdapter 适用于信息显示比较单一的场景, 若显示项中包含多种形式的数据, 就 不太适用了 下面介绍可以适配多种数据类型的适配器类 SimpleAdapter 的使用方法 当存在多种数据类型时首先要考虑布局问题, 因此首先要设置子项目布局 (item_ layout.xml) 文件, 代码如下 : <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:layout_height="match_parent" android:orientation="horizontal"> <ImageView android:id="@+id/img" android:layout_width="50dp" android:layout_height="50dp" android:src="@mipmap/ic_launcher" /> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="50dp" android:layout_marginleft="50dp" android:gravity="center" android:text="hello" android:textsize="28sp" /> </LinearLayout> 上述代码采用线性布局, 设置其 orientation 属性为 horizontal( 水平布局 ), 添加了一个 ImageView 控件用于显示图片, 添加了一个 TextView 用于显示文本 主布局文件 (activity_main.xml) 代码如下 :

4 第 5 章 Android 控件进阶操作实战 111 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=" android:layout_height="match_parent"> <ListView android:id="@+id/listview" android:layout_height="match_parent" /> </RelativeLayout> 上述代码在主布局中添加了一个 ListView 控件并设置了 id 属性, 设置宽 高属性的属性值都是 match_parent MainActivity.java 代码如下 : public class MainActivity extends Activity { private ListView mlistview; private SimpleAdapter msimpleadapter; private List<Map<String, Object>> mdatas = new ArrayList<Map<String, Object>>(); protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mlistview = (ListView) findviewbyid(r.id.listview); // 初始化数据集 initdatas(); // 实例化 SimpleAdapter msimpleadapter = new SimpleAdapter( this, mdatas, R.layout.item_layout, new String[]{"img", "name", new int[]{r.id.img, R.id.tv); // 设置配置器 mlistview.setadapter(msimpleadapter); private void initdatas() { Map map1 = new HashMap(); map1.put("img", R.drawable.fish); map1.put("name", " 小金鱼 "); Map map2 = new HashMap(); map2.put("img", R.drawable.horse); map2.put("name", " 千里马 "); Map map3 = new HashMap(); map3.put("img", R.drawable.mouse); map3.put("name", " 米老鼠 "); mdatas.add(map1); mdatas.add(map2); mdatas.add(map3);

5 112 Android 开发入门百战经典 SimpleAdapter 的构造函数如下 : SimpleAdapter(Context context, List<? extends Map<String,?>> data, int resource, String[] from, int[] to) 实例化 SimpleAdapter 时要传入如下参数 : context: 即上下文对象 ; data : 一个包裹 Map 集合的 List 数据集, 这里传入 datas, 即 initdatas 方法初始化的数据集 ; resource : 子项布局文件, 这里是自定义的 item_ layout.xml 文件, 传入 R.layout.animal_layout; from : 一个字符串数组, 字符串指的是 Map 中的键值, 这里有两个键, 即 img 和 name; to : 一个 int 型数组, 表示子项布局中对应控件的 id, 这里传入 ImageView 的 id(r.id.img) 和 TextView 的 id(r.id.tv) 即可 运行实例, 如图 5.2 所示 图 5.2 ListView 之 SimpleAdapter BaseAdapter 适配器 上面讲解了 SimpleAdapter 作为 ListView 的适配器, 通过源码可以看出 SimpleAdapter 继承自 BaseAdapter, 也就是说这个 SimpleAdapter 可以看作是 Android 帮我们实现的适配器, 下面研究如何通过继承 BaseAdapter 实现自定义的适配器 主布局文件 (activity_main.xml) 代码如下 : <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=" android:layout_height="match_parent"> <ListView android:id="@+id/lv" android:layout_height="match_parent" /> </RelativeLayout> 上述代码在相对布局中添加了一个 ListView 控件, 设置了 id 属性为 lv, 并添加了宽 高属性为 match_parent 子项布局代码如下 : <LinearLayout xmlns:android=" android:layout_height="match_parent" android:orientation="horizontal"> <ImageView

6 第 5 章 Android 控件进阶操作实战 113 android:id="@+id/img" android:layout_width="50dp" android:layout_height="50dp" android:layout_marginleft="20dp" android:src="@mipmap/ic_launcher" /> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="50dp" android:layout_marginleft="50dp" android:gravity="center" android:text="hello" android:textsize="28sp" /> </LinearLayout> 子布局和 SimpleAdapter 的布局一致 BaseAdapter 的数据源可能比较复杂, 因此这里创建一个 JavaBean 类对数据进行封装 : public class Animal { public Animal(String animal, int imgid) { this.animal = animal; this.imgid = imgid; private String animal; private int imgid; public String getanimal() { return animal; public void setanimal(string animal) { this.animal = animal; public int getimgid() { return imgid; public void setimgid(int imgid) { this.imgid = imgid; 这个类中封装了两个属性 :String 型的动物名和 int 型的图片 id, 添加了一个包含这两个属性的构造方法并设置了相应的 Setter 和 Getter 方法 下面看一下自定义的适配器类, 它继承自 BaseAdapter, 代码如下 : public class AnimalAdapter extends BaseAdapter { private Context context; private List<Animal> datas;

7 114 Android 开发入门百战经典 // 构造函数需要传入两个必要的参数 : 上下文对象和数据源 public AnimalAdapter(Context context, List<Animal> datas) { this.context = context; this.datas = datas; // 返回子项的个数 public int getcount() { return datas.size(); // 返回子项对应的对象 public Object getitem(int position) { return datas.get(position); // 返回子项的下标 public long getitemid(int position) { return position; // 返回子项视图 public View getview(int position, View convertview, ViewGroup parent) { Animal animal = (Animal) getitem(position); View view; ViewHolder viewholder; if (convertview == null) { view = LayoutInflater.from(context).inflate(R.layout.item_ layout, null); viewholder = new ViewHolder(); viewholder.animalimage = (ImageView) view.findviewbyid(r. id.img); viewholder.animalname = (TextView) view.findviewbyid(r. id.tv); view.settag(viewholder); else { view = convertview; viewholder = (ViewHolder) view.gettag(); viewholder.animalname.settext(animal.getanimal()); viewholder.animalimage.setimageresource(animal.getimgid()); return view; // 创建 ViewHolder 类 class ViewHolder { ImageView animalimage; TextView animalname;

8 第 5 章 Android 控件进阶操作实战 115 自定义的 AnimalAdapter 类继承自 BaseAdapter 类, 必须要覆写 a 四个方法, 每个 方法的具体含义已经在代码中做了注释 此外, 为了提高加载效率, 这里创建了内部类 ViewHolder, 可以避免每次调用 getview 方法时都要通过 findviewbyid 方法去实例化控件, 可以提高运行效率 MainActivity.java 代码如下 : public class MainActivity extends Activity { private ListView mlistview; private List<Animal> datas = new ArrayList<Animal>(); private AnimalAdapter manimaladapter; protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); // 隐藏标题栏 requestwindowfeature(window.feature_no_title); setcontentview(r.layout.activity_main); // 初始化数据源 initdatas(); mlistview = (ListView) findviewbyid(r.id.lv); manimaladapter = new AnimalAdapter(this, datas); mlistview.setadapter(manimaladapter); mlistview.setonitemclicklistener(new AdapterView. OnItemClickListener() { public void onitemclick(adapterview<?> parent, View view, int position, long id) { Toast.makeText(MainActivity.this, " 您单击了 " + datas.get(position).getanimal(), Toast.LENGTH_SHORT).show(); ); private void initdatas() { Animal animal0 = new Animal(" 兔八哥 ", R.drawable.rabbit); Animal animal1 = new Animal(" 眼镜蛇 ", R.drawable.snack); Animal animal2 = new Animal(" 小金鱼 ", R.drawable.fish); Animal animal3 = new Animal(" 千里马 ", R.drawable.horse); Animal animal4 = new Animal(" 米老鼠 ", R.drawable.mouse); Animal animal5 = new Animal(" 大国宝 ", R.drawable.panda); datas.add(animal0); datas.add(animal1); datas.add(animal2); datas.add(animal3); datas.add(animal4); datas.add(animal5); a 覆写 为 Java 里的术语

9 116 Android 开发入门百战经典 上述代码为 ListView 设置了 setonitemclicklistener 方法监听单项单击事件, 采用匿名内部类的方式实现了 AdapterView.OnItemClickListener 接口并覆写了其 onitemclick 方法, 由参数 positon 通过 List 的 get 方法并传入 Position 来获取 Animal 对象, 再通过对象封装的 getanimal 方法获得对应的动物名, 通过 Toast 显示出来 运行实例, 如图 5.3 所示 查看动态图, 请扫描图 5.4 中的二维码 图 5.3 ListView 之 BaseAdapter 图 5.4 ListView 之 BaseAdapter 二维码 5.2 控之经典 ListView 进阶 如何在 ListView 的上添加滑动监听 实现上拉加载功能, 是面试中和实际工作中经 常会遇到的问题 能否很从容地处理这部分问题, 也反映了程序员的基础能力 因此, 有必要要对这部分知识点进行研究和学习 首先看一下 API 文档中滑动监听的定义, 其继承结构如下 : public static interface AbsListView.OnScrollListener android.widget.abslistview.onscrolllistener 由继承结构可以看出,OnScrollListener 是一个静态接口, 接口中都是未实现需要覆写的方法 OnScrollListener 中有两个需要覆写的方法 : onscroll(abslistview view, int firstvisibleitem, int visibleitemcount, int totalitemcount) : 正在滑动时不断触发, 主要有四个参数, 分别是 ListView 对象 当前可以看见的第一个子项 ( 也就是当前屏幕最上方的子项 ) 可以看到子项的个数 总的子项个数 onscrollstatechanged(abslistview view, int scrollstate) : 顾名思义, 这个是在滑动状态变化的情况下触发, 里面有两个参数, 分别是 ListView 对象和滑动状态 那么滑动状态又分为哪些呢? API 文档中也进行了说明, 共有三个状态 : SCROLL_STATE_FLING: 手指正在拖着滑动 ( 手指没离开屏幕 ) SCROLL_STATE_IDLE: 滑动停止 SCROLL_STATE_TOUCH_SCROLL : 手指使劲在屏幕上滑了一下, 由于惯性屏幕继续滚动 ( 手指离开屏幕 ) 下面通过一个小实例来介绍, 如何通过监听滑动变化实现上拉加载的功能

10 第 5 章 Android 控件进阶操作实战 117 首先要定义一个底部布局, 用于加载时的提示, 代码如下 : <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:id="@+id/ll_footer" android:layout_height="wrap_content" android:orientation="vertical"> <ProgressBar android:id="@+id/progress" style="?android:attr/progressbarstylesmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> <TextView android:id="@+id/tv_wait" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text=" 正在加载..." android:textsize="10sp" /> </LinearLayout> 上述代码中布局采用线性布局, 添加了一个 ProgressBar 在 TextView 的上方, 设置了 ProgressBar 的 style 属性, 其值为?android:attr/progressBarStyleSmall, 也就是小圆形的进度条形式, 设置了 layout_gravity 属性, 其值为 center, 居中显示 添加了一个 TextView 显示提示信息, 同样也设置其 layout_gravity 属性为 center 为了实现上拉加载的功能, 这里自定义了一个控件继承自 ListView, 并实现了 OnScrollListener 接口 : public class UpAddListView extends ListView implements AbsListView. OnScrollListener { private View footer; // 标志位是否正在加载 private Boolean isadding = false; private int totalitems, totalitemcount; private IUpAddListener iupaddlistener; public UpAddListView(Context context) { super(context); initview(context); public UpAddListView(Context context, AttributeSet attrs) { super(context, attrs); initview(context);

11 118 Android 开发入门百战经典 public UpAddListView(Context context, AttributeSet attrs, int defstyleattr) { super(context, attrs, defstyleattr); initview(context); public void onscrollstatechanged(abslistview view, int scrollstate) { // 当前可见第一项和当前屏幕可见性个数之和等于总的子项个数 && 滑动停止状态 if ((totalitemcount == totalitems) && scrollstate == SCROLL_ STATE_IDLE) { if (!isadding) { footer.findviewbyid(r.id.ll_footer).setvisibility(view. VISIBLE); // 回调方法 iupaddlistener.onadd(); isadding = true; public void onscroll(abslistview view, int firstvisibleitem, int visibleitemcount, int totalitemcount) { // 当前看到第一个子项 + 可以看到的子项个数 totalitems = firstvisibleitem + visibleitemcount; // 总的子项个数 this.totalitemcount = totalitemcount; private void initview(context context) { footer = LayoutInflater.from(context).inflate(R.layout.footer_ layout, null); // 初始状态底部布局不显示 footer.findviewbyid(r.id.ll_footer).setvisibility(view.gone); // 添加底部布局 this.addfooterview(footer); // 设置滑动监听 this.setonscrolllistener(this); public interface IUpAddListener { void onadd(); public void setinterface(iupaddlistener iupaddlistener) { this.iupaddlistener = iupaddlistener;

12 第 5 章 Android 控件进阶操作实战 119 // 加载完毕 public void addcompleted() { isadding = false; footer.findviewbyid(r.id.ll_footer).setvisibility(view.gone); 实现 OnScrollListener 接口要覆写其两个方法 : onscroll : 滚动时会触发 为了在 onscrollstatechanged 中使用这个方法中的参数, 我们定义了两个 int 型的全局变量, 将这个方法中的参数传递给全局变量以便在 onscrollstatechanged 中使用 onscrollstatechanged : 滚动状态改变时会触发 这里思考一下, 怎么才能判断滚动到最底部了呢? 首先滚动到底部, 不能再继续滑动了, 滑动状态 scrollstate 必须是停止状态了, 即 scrollstate==scroll_state_idle 滑动停止了就滑动到底了吗? 显然不是, 还必须要满足一个条件, 这个条件就要借助 onscroll 中传递的三个参数了, 当满足当前屏幕中第一个可见项 + 当前屏幕可以看到的子项个数 = 总体子项个数时, 就说明滚动到底了 这里使用了回调方法用于数据传递, 定义了一个内部接口, 里面有一个 onadd 的抽象方法 此外, 设置了 setinterface 方法, 进行接口注册 addcompleted 方法, 在加载完成后调用, 将加载标志位设置成 false 并将底部栏隐藏 下面将自定义控件引入到主布局 (activity_main.xml) 文件 : <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=" android:layout_height="match_parent"> <ad.listviewonscrolllistenerdemo.upaddlistview android:id="@+id/lv" android:layout_height="match_parent" /> </RelativeLayout> 引入自定义控件需要在标签中加入完整的包. 类名, 这里是 ad.listviewonscrolllistenerd emo. UpAddListView, 设置了宽 高属性为 match_parent, 占据整个界面 MainActivity.java 代码如下 : public class MainActivity extends Activity implements UpAddListView. IUpAddListener { private UpAddListView mupaddlistview; private List datas = new ArrayList<String>(); private ArrayAdapter marrayadapter; protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); initviews();

13 120 Android 开发入门百战经典 initdatas(); private void initviews() { mupaddlistview = (UpAddListView) findviewbyid(r.id.lv); mupaddlistview.setinterface(this); marrayadapter = new ArrayAdapter(this, android.r.layout.simple_list_item_1, datas); mupaddlistview.setadapter(marrayadapter); private void initdatas() { for (int i = 0; i < 10; i++) { datas.add(" 测试数据 " + i); private void addmoredatas() { for (int i = 0; i < 2; i++) { datas.add(" 新数据 " + i); public void onadd() { // 为了便于观察, 并模仿请求操作时间, 这里采用延迟执行的方法 Handler handler = new Handler(); handler.postdelayed(new Runnable() { public void run() { // 添加更多数据 addmoredatas(); // 通知刷新 marrayadapter.notifydatasetchanged(); // 完成加载 mupaddlistview.addcompleted();, 2000); 为了方便, 这里采用了 ArrayAdapter 作为适配器类, 初始时添加了 10 条测试数据, 每次上拉加载时调用 addmoredatas 方法添加两条新数据 Activity 实现了在 UpAddListView 中定义的 IUpAddListener 接口, 覆写了其 onadd 方法, 此处为了模拟数据加载的时间, 采用了延迟 Handler 类的 postdelayed 方法, 延迟 2000ms 再进行加载和加载完成的操作 加载完成后记得调用 notifydatasetchanged 方法, 刷新 ListView 显示 运行实例, 如图 5.5 所示 滑动到底部然后上拉, 如图 5.6 所示 查看动态图, 请扫描图 5.7 中的二维码

14 第 5 章 Android 控件进阶操作实战 121 图 5.5 ListView 上拉加载一图 5.6 ListView 上拉加载二图 5.7 ListView 上拉加载二维码 5.3 控之经典 GridView 上面的章节中, 介绍了 ListView 的方法, 本节将对 GridView( 网格视图 ) 的属性和 方法进行讲解, 与 ListView 一般用于列表项的展示相比,GridView 是按照行列的方式来 显示内容的, 一般用于显示图片 图文等内容, 例如实现九宫格图, 用 GridView 是首选, 也是最简单的 首先我们来看一下 GridView 有哪些常用属性和相关方法, 如表 5.3 所示 表 5.3 ListView 的常用属性和相关方法 属性相关方法说明 android:columnwidth setcolumnwidth(int) 设置列的宽度 android:horizontalspacing sethorizontalspacing(int) 定义列之间水平间距 android:numcolumns setnumcolumns(int) 设置列数 android:stretchmode setstretchmode(int) 缩放模式 android:verticalspacing setverticalspacing(int) 定义行之间默认垂直间距 下面通过一个简单实例看一下如何使用 GridView 控件 主布局文件代码如下 : <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=" android:layout_height="match_parent"> <GridView android:id="@+id/gv" android:layout_height="match_parent" android:horizontalspacing="5dp" android:numcolumns="3" android:stretchmode="columnwidth"

15 122 Android 开发入门百战经典 android:verticalspacing="5dp" /> </RelativeLayout> 在 RelativeLayout 布局中引入了一个 GridView 控件, 设置了宽 高属性为 match_ parent, 控件占据整个界面 ; 设置了 numcolumns 属性, 显示 3 列 ; 设置了 stretchmode 属性为 columnwidth, 表示图片的缩放与列宽的大小一致 子项布局文件代码如下 : <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:id="@+id/iv" android:layout_width="100dp" android:layout_height="100dp" /> <TextView android:id="@+id/tv" android:layout_width="100dp" android:layout_height="wrap_content" android:gravity="center" android:textsize="20sp" /> </LinearLayout> 子项布局文件中包括一个 ImageView 控件和一个 TextView 控件, 采用线性布局并设置 orientation 属性为 vertical 为了数据操作方便, 同样这里也设置了一个 JavaBean 类对数据进行封装, 代码如下 : public class Animal { // 和上一节 JavaBean 类一样 其中主要包含 animal( 即动物名 ) 和 imgid( 即图片 ID) 这两个属性, 并设置了相应的 setter 和 getter 方法 这里自定义了 GridView 的适配器类, 这个类继承自 BaseAdapter, 代码如下 : public class GridAdapter extends BaseAdapter { private Context context; private List<Animal> datas; public GridAdapter(Context context, List<Animal> datas) { this.context = context; this.datas = datas; // 返回子项的个数 public int getcount() {

16 第 5 章 Android 控件进阶操作实战 123 return datas.size(); // 返回子项对应的对象 public Object getitem(int position) { return datas.get(position); // 返回子项的下标 public long getitemid(int position) { return position; // 返回子项视图 public View getview(int position, View convertview, ViewGroup parent) { Animal animal = (Animal) getitem(position); View view; ViewHolder viewholder; if (convertview == null) { view = LayoutInflater.from(context).inflate(R.layout.item_ layout, null); viewholder = new ViewHolder(); viewholder.animalimage = (ImageView) view.findviewbyid(r. id.iv); viewholder.animalname = (TextView) view.findviewbyid(r. id.tv); view.settag(viewholder); else { view = convertview; viewholder = (ViewHolder) view.gettag(); viewholder.animalname.settext(animal.getanimal()); viewholder.animalimage.setimageresource(animal.getimgid()); return view; // 创建 ViewHolder 类 class ViewHolder { ImageView animalimage; TextView animalname; 细心的读者可以看到, 这里的适配器类除了名字和 ListView 的适配器类不同之外, 其余都相同,GridView 和 ListView 都是继承自 AbsListView, 用法也有很多相似之处 学习要有举一反三的能力, 找出控件使用时的共性, 可以提高学习速度并能加深理解 这里就不再重复解释上面的代码, 不清楚的同学可以翻看前面的 ListView 部分 MainActivity.java 代码如下 :

17 124 Android 开发入门百战经典 public class MainActivity extends AppCompatActivity { private GridView mgridview; private GridAdapter mgridadapter; private List<Animal> mdatas = new ArrayList<Animal>(); protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mgridview = (GridView) findviewbyid(r.id.gv); // 初始化数据 initdatas(); // 实例化适配器 mgridadapter = new GridAdapter(this, mdatas); // 设置适配器 mgridview.setadapter(mgridadapter); mgridview.setonitemclicklistener(new AdapterView. OnItemClickListener() {// 设置子项单击监听 public void onitemclick(adapterview<?> parent, View view, int position, long id) { String name = mdatas.get(position).getanimal(); ImageView imageview = new ImageView(MainActivity.this); imageview.setscaletype(imageview.scaletype.center); imageview.setlayoutparams(new LinearLayout. LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); imageview.setimageresource(mdatas.get(position). getimgid()); Dialog dialog = new AlertDialog.Builder(MainActivity. this).seticon(android.r.drawable.ic_btn_speak_now).settitle(" 您选择的动物是 :" + name).setview(imageview).setnegativebutton(" 取消 ", new DialogInterface. OnClickListener() { public void onclick(dialoginterface dialog, int which) { ).create(); dialog.show(); ); private void initdatas() { Animal animal0 = new Animal(" 兔八哥 ", R.drawable.rabbit);

18 第 5 章 Android 控件进阶操作实战 125 Animal animal1 = new Animal(" 眼镜蛇 ", R.drawable.snack); Animal animal2 = new Animal(" 小金鱼 ", R.drawable.fish); Animal animal3 = new Animal(" 千里马 ", R.drawable.horse); Animal animal4 = new Animal(" 米老鼠 ", R.drawable.mouse); Animal animal5 = new Animal(" 大国宝 ", R.drawable.panda); Animal animal6 = new Animal(" 千里马 ", R.drawable.horse); Animal animal7 = new Animal(" 米老鼠 ", R.drawable.mouse); Animal animal8 = new Animal(" 大国宝 ", R.drawable.panda); mdatas.add(animal0); mdatas.add(animal1); mdatas.add(animal2); mdatas.add(animal3); mdatas.add(animal4); mdatas.add(animal5); mdatas.add(animal6); mdatas.add(animal7); mdatas.add(animal8); 总的来讲, 实现 GridView 需要三个步骤 : 准备数据源 (initdatas()); 新建适配器 (GridAdapter extends BaseAdapter); 加载适配器 (setadapter()) 这里我们还实现了 GridView 的子项单击监听 (setonitemclicklistener), 单击某个子项时, 弹出 Dialog 对话框, 通过 List 的 get 方法获取单击子项对应的 Animal 对象, 然后再通过 Animal 类的 getanimal 方法获取对应的动物名 同理, 根据上面的方法获得图片资源对象, 调用 Dialog 的 setview 方法, 将资源图片对象传入, 可以把对应子项的图片显示在 Dialog 对话框中 运行实例, 结果如图 5.8 所示, 单击任意子项 ( 这里单击眼镜蛇 ), 结果如图 5.9 所示 查看动态图, 请扫描图 5.10 中的二维码 图 5.8 GridView 实例图 5.9 GridView 单击效果图 5.10 GridView 单击效果二维码

19 126 Android 开发入门百战经典 5.4 控之经典 GridView 进阶 GridView 动态图删除子项 用过 UC 浏览器的人相信都不会对图 5.11 所示的功能陌生 长按图标时会在左上角显示出一个删除的图片, 单击这个图片就可以删除与之对应的子项, 下面介绍如何借助 GridView 来实现这个功能 主布局文件代码如下 : 图 5.11 UC 浏览器单击删除 Tab <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=" android:layout_height="match_parent"> <GridView android:id="@+id/gv" android:layout_height="match_parent" android:horizontalspacing="5dp" android:numcolumns="3" android:stretchmode="columnwidth" android:verticalspacing="5dp" /> </RelativeLayout> 其功能和上一小节的布局文件一致, 这里就不再介绍 子项布局文件代码如下 : <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android=" android:layout_height="match_parent"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginright="4dip" android:layout_margintop="4dip" android:gravity="center" android:orientation="vertical"> <ImageView android:id="@+id/iv" android:layout_width="60dip" android:layout_height="55dip" /> <TextView android:id="@+id/tv" android:layout_width="70dip"

20 第 5 章 Android 控件进阶操作实战 127 android:layout_height="wrap_content" android:layout_margintop="10dip" android:gravity="center" android:textcolor="@android:color/black" android:textsize="15sp" android:textstyle="bold" /> </LinearLayout> <ImageView android:id="@+id/delete_markview" android:layout_width="20dip" android:layout_height="20dip" android:layout_gravity="right top" android:adjustviewbounds="true" android:src="@drawable/delete" android:visibility="gone" /> </FrameLayout> 上述代码中子项布局采用 FrameLayout 帧布局模式, 设置删除图片的 layout_ gravity 属性为 right top, 即布局在右上角并设置其 visibility 属性为 gone, 即初始时不显示该图片 JavaBean 类 Animal 和上一节一样, 这里就不再进行介绍 下面看一下自定义的适配器类 : public class GridAdapter extends BaseAdapter { private Context context; private List<Animal> datas; final int position = 0; private boolean misshowdelete; public GridAdapter(Context context, List<Animal> datas) { this.context = context; this.datas = datas; // 返回子项的个数 public int getcount() { return datas.size(); // 返回子项对应的对象 public Object getitem(int position) { return datas.get(position); // 返回子项的下标 public long getitemid(int position) { return position; // 返回子项视图

21 128 Android 开发入门百战经典 public View getview(final int position, View convertview, final ViewGroup parent) { Animal animal = (Animal) getitem(position); View view; ViewHolder viewholder; if (convertview == null) { view = LayoutInflater.from(context).inflate(R.layout.item_ layout, null); viewholder = new ViewHolder(); viewholder.animalimage = (ImageView) view.findviewbyid(r. id.iv); viewholder.animalname = (TextView) view.findviewbyid(r. id.tv); viewholder.deleteimage = (ImageView) view.findviewbyid(r. id.delete_markview); view.settag(viewholder); else { view = convertview; viewholder = (ViewHolder) view.gettag(); viewholder.animalname.settext(animal.getanimal()); viewholder.animalimage.setimageresource(animal.getimgid()); viewholder.deleteimage.setvisibility(misshowdelete? View. VISIBLE : View.GONE); if (misshowdelete) { viewholder.deleteimage.setonclicklistener(new View. OnClickListener() { public void onclick(view v) { datas.remove(position); setmisshowdelete(false); ); return view; // 创建 ViewHolder 类 class ViewHolder { ImageView animalimage, deleteimage; TextView animalname; public void setmisshowdelete(boolean misshowdelete) { this.misshowdelete = misshowdelete; notifydatasetchanged(); 这里设置了一个全局变量 misshowdelete 作为 DeleteImage 是否显示的标志位, 并添加了一个 setisshowdelete 方法用于改变 misshowdelete 的值, 在这个方法中还调用了 notifydatasetchanged 方法刷新 GridView 显示

22 第 5 章 Android 控件进阶操作实战 129 这里还为 DeleteImage 添加了一个单击事件的监听, 覆写了 onclick 方法, 在这个方 法中调用 List 集合的 remove 方法去除这个子项的数据并调用 setmisshowdelete 传入 false 隐藏 删除图片 MainActivity.java 代码如下 : public class MainActivity extends Activity { private GridView mgridview; private GridAdapter mgridadapter; private boolean isshowdelete; private List<Animal> datas = new ArrayList<Animal>(); protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mgridview = (GridView) findviewbyid(r.id.gv); // 初始化数据 initdatas(); // 实例化适配器类 mgridadapter = new GridAdapter(this, datas); // 设置适配器类 mgridview.setadapter(mgridadapter); // 设置长按事件监听 mgridview.setonitemlongclicklistener(newadapterview. OnItemLongClickListener() { public boolean onitemlongclick(adapterview<?> parent, View view, int position, long id) { if (isshowdelete) { // 删除图片显示时长按隐藏 isshowdelete = false; mgridadapter.setmisshowdelete(isshowdelete); else { // 删除图片隐藏时长按显示 isshowdelete = true; mgridadapter.setmisshowdelete(isshowdelete); return false; ); private void initdatas() { Animal animal0 = new Animal(" 兔八哥 ", R.drawable.rabbit); Animal animal1 = new Animal(" 眼镜蛇 ", R.drawable.snack); Animal animal2 = new Animal(" 小金鱼 ", R.drawable.fish); Animal animal3 = new Animal(" 千里马 ", R.drawable.horse); Animal animal4 = new Animal(" 米老鼠 ", R.drawable.mouse); Animal animal5 = new Animal(" 大国宝 ", R.drawable.panda); datas.add(animal0); datas.add(animal1);

23 130 Android 开发入门百战经典 datas.add(animal2); datas.add(animal3); datas.add(animal4); datas.add(animal5); 这里设置了 GridView 的长按事件监听, 当 删除图片 显示时, 将 isshowdelete 标志位设置成 false, 然后调用 GridAdapter 适配器类的 setmisshowdelete 方法隐藏右上角的 删除图片 反之, 当 删除图片 隐藏时, 则调用 setmisshowdelete 方法传入 true 参数显示右上角的 删除图片 运行实例并长按任一子项, 如图 5.12 所示 单击右上角的 删除图片 则删除当前子项, 右上角的 删除图片 也随之隐藏 查看动态图, 请扫描图 5.13 中的二维码 图 5.12 GridView 单击删除子项 图 5.13 GridView 单击删除子项二维码 GridView 动态图增加子项 下面研究如何实现动态增加子项, 在上述基础上动态增加子项的功能 布局文件不做调整, 因此, 这里就不再介绍代码 在 GridAdapter 适配器类中动态增加子项的功能, 参考代码如下 : public class GridAdapter extends BaseAdapter { // 和上一节一样, 省略部分相同代码 // 返回子项视图 public View getview(final int position, View convertview, final ViewGroup parent) { View view; ViewHolder viewholder; if (convertview == null) { view = LayoutInflater.from(context).inflate(R.layout.item_layout, null); viewholder = new ViewHolder(); viewholder.animalimage = (ImageView) view.findviewbyid(r.id.iv);

24 第 5 章 Android 控件进阶操作实战 131 viewholder.animalname = (TextView) view.findviewbyid(r.id.tv); viewholder.deleteimage = (ImageView) view.findviewbyid(r.id.delete_ markview); // 设置 tag view.settag(viewholder); else { view = convertview; // 由 tag 获取对象 viewholder = (ViewHolder) view.gettag(); if (position < datas.size()) { Animal animal = (Animal) getitem(position); viewholder.animalname.settext(animal.getanimal()); viewholder.animalimage.setimageresource(animal.getimgid()); // 根据标志位 isshowdelete 决定是否显示删除图片按钮 viewholder.deleteimage.setvisibility(isshowdelete? View.VISIBLE: View.GONE); if (isshowdelete) { viewholder.deleteimage.setonclicklistener(new View. OnClickListener() { public void onclick(view v) { datas.remove(position); setisshowdelete(false); ); else { viewholder.animalname.settext(" 单击添加 "); viewholder.animalimage.setimageresource(r.drawable.add); viewholder.deleteimage.setvisibility(view.gone); return view; // 和上一节一样, 省略部分相同代码 注意, 因为这里多了最后一个子项用来作为 添加项, 所以在 getcount 方法的返回中要返回 datas.size()+1 在 getview 方法中添加了判断, 在 position<datas.size 时, 加载 datas 里面的数据, 而在 position=datas.size() 的地方加载 添加项 MainActivity 中也做了一些调整, 代码如下 : public class MainActivity extends Activity { // 和上一节一样, 省略部分相同代码 mgridview.setonitemclicklistener(new AdapterView. OnItemClickListener() { public void onitemclick(adapterview<?> parent, View view, int position, long id) { // 单击了最后一张 "+" 图片

25 132 Android 开发入门百战经典 if (position == parent.getchildcount() - 1) { adddatas(); ); mgridview.setonitemlongclicklistener(new AdapterView. OnItemLongClickListener() { // 和上一节一样, 省略部分相同代码 ); private void adddatas() { Animal animaladd = new Animal(" 大国宝 ", R.drawable.panda); datas.add(animaladd); mgridadapter.notifydatasetchanged(); private void initdatas() { // 和上一节一样, 省略部分相同代码 这里添加了子项单击事件监听 (OnItemClickListener), 判断当 position==parent. getchildcount-1 时, 即单击最后一个 添加项 时调用 adddatas 方法, 添加一条记录到 datas 里面 注意, 添加完成数据后, 要调用 notifydatasetchanged 方法刷新列表 运行项目实例并单击最后一个 单击添加 图片, 如图 5.14 所示, 单击最后一个子项 ( 单击添加 ), 将会新插入一个子项 查看动态图, 请扫描图 5.15 中的二维码 图 5.14 GridView 单击增加子项 图 5.15 GridView 单击增加子项二维码 5.5 新控件 RecyclerView 控件 Android 5.0 引入了一个全新的列表控件 RecyclerView, 说它新, 是相对于其他控件而言 它更为灵活, 同时也拥有比 ListView 和 GridView 控件较多的优点, 例如子项 View 的

26 第 5 章 Android 控件进阶操作实战 133 创建 View 的回收以及重用等机制 为了使用 RecyclerView 控件, 需要创建一个 Adapter 和一个 LayoutManager 类 Adapter 继承自 RecyclerView.Adapetr 类, 主要用来将数据和布局子项进行绑定 LayoutManager, 布局管理器, 设置每一项 View 在 RecyclerView 中的位置布局以及控件 子项 View 的显示或者隐藏 当 View 重用或者回收时,LayoutManger 都会向 Adapter 请求 新的数据进行替换原来数据的内容 这种回收重用的机制可以提高性能, 避免创建很多的 View 或者是频繁地调用 findviewbyid 方法 RecyclerView 提供了三种内置的 LayoutManager: LinearLayoutManager: 线性布局, 横向或者纵向滑动列表 GridLayoutManager: 网格布局 StaggeredGridLayoutManager: 流式布局 ( 瀑布流效果 ) 当然除了上面的三种内部布局之外, 还可以继承 RecyclerView.LayoutManager 来实现一个自定义的 LayoutManager 下面通过一个简单实例对 RecyclerView 有一个简单的理解 RecyclerView 控件需要引入 RecyclerView 兼容包, 选中项目并右击, 在弹出的快捷菜单中选择 Open Module Settings, 如图 5.16 所示 图 5.16 Open Module Settings 切换到 Dependencies 标签, 单击右上角的 + 并选择第一项 Library dependency 选项, 如图 5.17 所示 图 5.17 添加 Library dependency 在弹出的界面中输入 recyclerview, 然后单击右边的搜索按钮, 如图 5.18 所示 图 5.18 搜索 Library

27 134 Android 开发入门百战经典 选中兼容包, 然后单击 OK 按钮, 如图 5.19 所示 图 5.19 添加 Library dependency 成功 再次选中兼容包, 然后单击 OK 按钮, 等待 Gradle 编译完成就可以使用 RecyclerView 了 RecyclerView 线性布局 主布局文件 (activity_main.xml) 中引入一个 RecyclerView, 代码如下 : <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=" android:layout_height="match_parent"> <android.support.v7.widget.recyclerview android:id="@+id/recyclerview" android:layout_height="match_parent" android:scrollbars="vertical" /> </RelativeLayout> 上述代码在相对布局中添加了一个 RecyclerView 控件, 引入时要输入完整的 包. 类 名, 可以看出 RecyclerView 在 V7 包中 为 RecyclerView 添加一个子项布局文件 (item.xml), 代码如下 : <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=" android:layout_height="50dp"> <TextView

28 第 5 章 Android 控件进阶操作实战 135 android:id="@+id/id_num" android:layout_height="50dp" android:gravity="center" android:text="1" /> </RelativeLayout> 和 ListView 相似,RecyclerView 同样需要创建一个适配器, 代码如下 : public class MyAdapter extends RecyclerView.Adapter<MyAdapter. MyViewHolder> { private Context mcontext; private List<String> mdatas; public MyAdapter(Context context, List<String> datas) { mcontext = context; mdatas = datas; public MyViewHolder oncreateviewholder(viewgroup parent, int viewtype) { MyViewHolder holder = new MyViewHolder(LayoutInflater.from( mcontext).inflate(r.layout.item, parent, false)); return holder; public void onbindviewholder(myviewholder holder, int position) { holder.tv.settext(mdatas.get(position)); public int getitemcount() { return mdatas.size(); class MyViewHolder extends RecyclerView.ViewHolder { TextView tv; public MyViewHolder(View view) { super(view); tv = (TextView) view.findviewbyid(r.id.id_num); 适配器类继承自 RecyclerView.Adapter, 这里有几个方法需要解释一下 : 构造方法 MyAdapter: 传入了 Context 对象和数据集合, 这点和 ListView 一样 OnCreateViewHolder 方法 : 这是必须要覆写的方法, 返回一个 ViewHolder 对象 创建这个内部类需要传入一个 View 对象,View 对象的获得同样是使用

29 136 Android 开发入门百战经典 LayoutInflator 类的相关方法 onbindviewholder 方法 : 绑定控件数据 getitemcount 方法 : 返回数据项个数 MainActivity.java 代码如下 : public class MainActivity extends Activity { private RecyclerView mrecyclerview; private List<String> mdatas; protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); initdata(); mrecyclerview = (RecyclerView) findviewbyid(r.id.recyclerview); mrecyclerview.setlayoutmanager(new LinearLayoutManager(this)); mrecyclerview.setadapter( new MyAdapter(this, mdatas)); protected void initdata() { mdatas = new ArrayList<String>(); for (int i = 1; i < 20; i++) { mdatas.add("" + i); 上述代码在 oncreate 方法中通过 findviewbyid 方法得到布局中添加的 RecyclerView 对象, 调用 RecyclerView 类的 setlayoutmanager 方法设置布局类型, 这里传入的是 Android 提供的 LinearLayoutManager 对象 ( 线性布局 ) 调用 setadapter 方法为 RecyclerView 添加自定义的适配器 运行实例, 如图 5.20 所示 图 5.20 RecyclerView 线性布局

30 第 5 章 Android 控件进阶操作实战 137 可以看出子项自上而下显示在屏幕中, 可以向下滑动查看下面的内容, 和 ListView 的效果基本一致 RecyclerView 网格布局修改 MainActivity.java 代码如下 : // 省略部分相同代码 protected void oncreate(bundle savedinstancestate) { // 省略部分相同代码 mrecyclerview.setlayoutmanager(new GridLayoutManager(this,4)); mrecyclerview.setadapter( new MyAdapter(this, mdatas)); // 省略部分相同代码 这时 setlayoutmanager 方法传入了一个 GridLayoutManager 对象, 这个对象需要传入两个参数 : 上下文对象和列数 再次运行实例, 如图 5.21 所示 RecyclerView 瀑布流布局 图 5.21 RecyclerView 网格布局 上面讲解了两种基本的用法, 下面讲解瀑布流布局的用法 为了提高演示效果, 这里修改了子项布局的代码, 添加了 ImageView 控件用来显示图片, 代码如下 : <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/id_num" android:layout_width="wrap_content"

31 138 Android 开发入门百战经典 android:layout_height="wrap_content" android:gravity="center" android:text="1" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 瀑布流布局需要随机调整子项的高, 修改自定义的适配器代码如下 : public class MyAdapter extends RecyclerView.Adapter<MyAdapter. MyViewHolder> { private Context mcontext; private List<String> mdatas; private List<Integer> mhights; public MyAdapter(Context context, List<String> datas) { mcontext = context; mdatas = datas; mhights = new ArrayList<>(); initheights(); // 省略部分相同代码 public void onbindviewholder(myviewholder holder, int position) { ViewGroup.LayoutParams layoutparams = holder.itemview. getlayoutparams(); layoutparams.height = mhights.get(position); holder.itemview.setlayoutparams(layoutparams); holder.tv.settext(mdatas.get(position)); // 省略部分相同代码 private void initheights(){ for (int i = 0; i < mdatas.size(); i++) { mhights.add((int) (50 + Math.random() * 300)); 在构造方法中调用了 initheights 方法初始化了一个高度的 List 集合, 在 onbindviewholder 方法中为子项设置了随机的高, 调用 View 的 getlayoutparams 方法得到布局参数对象 layoutparams, 将高度集合 List 中的值赋给这个对象的高 修改 MainActivity.java 代码如下 : // 省略部分相同代码 protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate);

32 第 5 章 Android 控件进阶操作实战 139 // 省略部分相同代码 mrecyclerview.setlayoutmanager(new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.VERTICAL)); mrecyclerview.setadapter( new MyAdapter(this, mdatas)); // 省略部分相同代码 上述代码修改 setlayoutmanager 方法中的参数为 StaggeredGridLayoutManager 对象, 创建这个对象需要传入两个参数 : 第一个参数为每行列数, 第二个参数为布局的方向, 这里传入 StaggeredGridLayoutManager.VERTICAL 常量 ( 垂直布局 ) 运行实例, 结果如图 5.22 所示 图 5.22 RecyclerView 瀑布流布局 5.6 多页面切换器 ViewPager 控件 一般 APP 都是由多个页面组成, 页面的切换是开发中比较重要的部分,Android 提供了封装好的页面切换控件 ViewPager 供开发者使用, 其继承结构如下 : public class ViewPager extends ViewGroup java.lang.object a android.view.view android.view.viewgroup android.support.v4.view.viewpager ViewPager 继承自 ViewGroup, 可以看出来它是一个容器类, 类前包名是 android. support.v4, 这是一个兼容包 注意, 在布局文件中引入该控件时, 标签要写全, 即 : < android.support.v4.view.viewpager > API 文档中对 ViewPager 进行了描述, 总结如下 : ViewPager 类直接继承自 ViewGroup 类, 作为一个容器类, 可以向其中添加 View 类 a 方框 代表继承, 继承是 Java 三大特性之一

33 140 Android 开发入门百战经典 数据源和显示之间需要一个适配器类 PagerAdapter 进行适配 ViewPager 经常和 Fragemnet 一起使用, 并且提供专门的适配器类 FragmentPagerAdapter 和 FragmentStatePagerAdapter 类供开发者调用 实现 PageAdapter 必须覆写四个方法 : public Object instantiateitem(viewgroup container, int position): 初始化一个子项 public void destroyitem(viewgroup container, int position,object object) : 销毁一个 子项 public int getcount(): 返回子项的个数 public boolean isviewfromobject(view arg0, Object arg1): 返回一个布尔型变量, 判 断子项是否来自 Object ViewPager 的基本用法 下面通过一个实例看一下 ViewPager 的基本用法 主布局文件 (activity_main.xml) 代码如下 : <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=" android:layout_height="match_parent"> <android.support.v4.view.viewpager android:id="@+id/viewpager" android:layout_height="match_parent" /> </RelativeLayout> 这里引入了一个 ViewPager 控件, 通过包. 类名的方式引入, 设置了宽高属性为 match_parent ViewPager 是布局容器类, 这里添加了三个子布局用来切换页面 子布局一 (layout1.xml) 代码如下 : <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:layout_height="match_parent"> <TextView android:layout_height="match_parent" android:gravity="center" android:text=" 页面 1" android:textsize="30sp" /> </LinearLayout> 上述子布局中仅添加了一个 TextView 用于区别不同的页面, 其余两个子布局同样也是只包含一个 TextView, 不同的仅是 text 的属性值不同, 这里就不再介绍代码 ViewPager 同样需要适配器类, 代码如下 :

34 第 5 章 Android 控件进阶操作实战 141 public class MyViewPagerAdapter extends PagerAdapter { private List<View> datas; public MyViewPagerAdapter(List<View> datas) { this.datas = datas; // 返回页卡数量 public int getcount() { return datas.size(); // 判断 View 是否来自 Object public boolean isviewfromobject(view view, Object object) { return view == object; // 初始化一个页卡 public Object instantiateitem(viewgroup container, int position) { container.addview(datas.get(position)); return datas.get(position); // 销毁一个页卡 public void destroyitem(viewgroup container, int position, Object object) { container.removeview(datas.get(position)); 自定义适配器类 MyViewPagerAdapter 继承自 PagerAdapter, 创建了构造函数, 用于在初始化时传入 datas 数据集 PagerAdapter 是抽象类, 继承这个类需要覆写它的四个抽象方法, 这四个方法的说明请参考代码中的注释 MainActivity.java 代码如下 : public class MainActivity extends Activity { private ViewPager mviewpager; private List<View> mdatas; private MyViewPagerAdapter myviewpageradapter; protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mviewpager = (ViewPager) findviewbyid(r.id.viewpager); // 初始化数据集 initdatas(); myviewpageradapter = new MyViewPagerAdapter(mDatas); // 设置适配器 mviewpager.setadapter(myviewpageradapter);

35 142 Android 开发入门百战经典 private void initdatas() { mdatas = new ArrayList<>(); View view1 = LayoutInflater.from(this).inflate(R.layout.layout1, null); View view2 = LayoutInflater.from(this).inflate(R.layout.layout2, null); View view3 = LayoutInflater.from(this).inflate(R.layout.layout3, null); mdatas.add(view1); mdatas.add(view2); mdatas.add(view3); 总结以下,ViewPager 的实现可以分为三个步骤 : 准备数据源 (initdatas), 这里是调用 LayoutInflater 的静态方法 from 并传入上下文对象获得一个 LayoutInflater 对象, 和前面获取 LayoutInflater 对象的方式稍有不同, 但查看源码可以看出, 它们其实调用的方法是一致的, 是 Android 封装好的方法 参考如下源码 : public static LayoutInflater from(context context) { LayoutInflater LayoutInflater = (LayoutInflater) context. getsystemservice(context.layout_inflater_service); if (LayoutInflater == null) { throw new AssertionError("LayoutInflater not found."); return LayoutInflater; 可以看出,from 是一个静态方法, 这个方法内部也是通过 getsystemservice 方法并传入 Context.LAYOUT_INFLATER_SERVICE 常量来获取 LayoutInflater 对象, 然后返回这个对象 准备适配器类并初始化 (MyViewPagerAdapter), 传入布局数据源 设置适配器, 调用 ViewPager 的 setadapter 方法传入初始化的自定义适配器 运行实例后并向右滑动即可切换到第二个页面, 如图 5.23 所示 查看动态图, 请扫描图 5.24 中的二维码 图 5.23 ViewPager 基本用法第二个页面 图 5.24 ViewPager 基本用法二维码

36 第 5 章 Android 控件进阶操作实战 143 可以看出, 左右滑动屏幕就可以切换不同的 View 了 ViewPager 导航条 上面的是通过页面中的内容来区别不同的页面, 其实 ViewPager 还提供了导航条来区 别不同页面和切换页面 下面介绍如何添加顶部或底部导航 Android 提供了两种方式供 开发者选择, 即 PagerTitleStrip 和 PagerTabStrip, 下面分别介绍 1. PagerTitleStrip API 中这么定义 :PagerTitleStrip 是一个非交互的页面指示器, 一般指示 ViewPager 中的前一页 当前页和下一页三个页面 可以通过 PagerTitleStrip 标签添加到 xml 布局中 我们可以设置 layout_gravity 属性为 TOP 或者 BOTTOM 来决定在页面顶部或者底部显示, 添加 PagerTitleStrip 要在适配器中覆写 getpagetitle 方法 上面是抽象的理论描述, 下面通过实例来看一下如何在 ViewPager 中添加 PagerTitleStrip 控件 主布局文件代码如下 : <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=" android:layout_height="match_parent"> <android.support.v4.view.viewpager android:id="@+id/viewpager" android:layout_height="match_parent"> <android.support.v4.view.pagertitlestrip android:id="@+id/pagertitlestrip" android:layout_height="wrap_content"> </android.support.v4.view.pagertitlestrip> </android.support.v4.view.viewpager> </RelativeLayout> PagerTitleStrip 标签也要设置全路径并放在 ViewPager 标签内, 默认没有添加 layout_gravity 属性, 标签显示在页面顶部, 若想设置在底部, 添加这一属性设置其值为 BOTTOM 即可 修改适配器类如下 : public class MyViewPagerAdapter extends PagerAdapter { private List<View> datas; private List<String> titles; public MyViewPagerAdapter(List<View> datas, List<String> titles) { this.datas = datas; this.titles = titles;

37 144 Android 开发入门百战经典 // 省略部分相同代码 public CharSequence getpagetitle(int position) { return titles.get(position); 为了方便观察, 对上一个实例增加或修改的代码部分进行了加粗 首先修改了构造方法, 多传入了一个标题的数据集 ; 然后覆写了一个 getpagertitle 的方法, 这个方法可以根据 position 参数返回对应的 title MainActivity.java 代码如下 : public class MainActivity extends Activity { private ViewPager mviewpager; private PagerTitleStrip mpagertitlestrip; private List<View> mdatas; private List<String> mtitles; private MyViewPagerAdapter myviewpageradapter; protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mviewpager = (ViewPager) findviewbyid(r.id.viewpager); mpagertitlestrip = (PagerTitleStrip) findviewbyid(r. id.pagertitlestrip); initdatas(); myviewpageradapter = new MyViewPagerAdapter(mDatas, mtitles); mviewpager.setadapter(myviewpageradapter); private void initdatas() { mdatas = new ArrayList<>(); mtitles = new ArrayList<>(); View view1 = LayoutInflater.from(this).inflate(R.layout.layout1, null); View view2 = LayoutInflater.from(this).inflate(R.layout.layout2, null); View view3 = LayoutInflater.from(this).inflate(R.layout.layout3, null); mdatas.add(view1); mdatas.add(view2); mdatas.add(view3); mtitles.add(" 第一页 "); mtitles.add(" 第二页 "); mtitles.add(" 第三页 "); 与上一个实例相比, 这里添加了一个标题的数据集 titles, 初始化 MyViewPagerAdapter 时传入了两个参数 : 页面布局数据集 (mdatas) 和标题数据集 (mtitles), 标题数据集数据将传到自定义的适配器中 运行实例并向右滑动屏幕, 如图 5.25 所示 可以看出页面切换到第二个页面, 同时

38 第 5 章 Android 控件进阶操作实战 145 顶部的页面标签也切换到了 第二页 查看动态图, 请扫描图 5.26 中的二维码 图 5.25 ViewPager 之 PagerTitleStrip 用法 图 5.26 ViewPager 之 PagerTitleStrip 用法二维码 单击顶部的标题栏, 不会进行页面切换, 正如 API 文档中所描述的,non-interactive indicator 只能作为一个页面指示器, 不具有交互作用 下面介绍具有交互效果的 Pager TabStrip 2. PagerTabStrip API 中这么描述 PagerTabStrip: PagerTabStrip is an interactive indicator of the current, next, and previous pages of a ViewPager. It is intended to be used as a child view of a ViewPager widget in your XML layout. Add it as a child of a ViewPager in your layout file and set its android:layout_gravity to TOP or BOTTOM to pin it to the top or bottom of the ViewPager. The title from each page is supplied by the method getpagetitle(int) in the adapter supplied to the ViewPager. For a non-interactive indicator, see PagerTitleStrip. 大致含义如下 :PagerTabStrip 是一个关于当前页 下一页和上一页可交互的页面指示器, 作为一个子项布局在 ViewPager 控件内部 同时, 也可以通过设置 layout_gravity 属性为 TOP 或 BOTTOM 来决定显示在页面顶部或底部 每个页面标题是通过适配器类中覆写 getpagetitle 方法提供给 ViewPager 的 最后一句也点明了, 若要使用一个非交互指示器, 可以参考 PagerTitleStrip 从 API 文档可以看出, 两个方式使用方法一样, 因此, 这里只要在布局文件中更换一下标签, 代码如下 : <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=" android:layout_height="match_parent"> <android.support.v4.view.viewpager android:id="@+id/viewpager" android:layout_height="match_parent"> <android.support.v4.view.pagertabstrip android:id="@+id/pagertabstrip"

39 146 Android 开发入门百战经典 android:layout_height="wrap_content"> </android.support.v4.view.pagertabstrip> </android.support.v4.view.viewpager> </RelativeLayout> 上述代码将标签换成 android.support.v4.view.pagertabstrip MainActivity.java 中, 将 PagerTitleStrip 换成 PagerTabStrip 即可, 其余代码不变 : private PagerTabStrip pagertabstrip= (PagerTabStrip)findViewById(R. id.pagertabstrip); 运行实例并单击顶部 Tab 第二页, 结果如图 5.27 所示 图 5.27 ViewPager 之 PagerTabStrip 用法第二个页面 单击顶部指示页, 可以进行页面切换, 还有动画效果 除此之外, 相对 PagerTitleStrip 而言,PagerTabStrip 当前页的下面还多了一个小横标 以上功能基本实现了, 下面来研究如何让外观变得更漂亮 Android 提供了一些方法用于改变指示栏的样式 常用方法如表 5.4 所示 表 5.4 PagerTabStrip 的常用方法 方 法 说 明 setbackgroundcolor(int color) 设置背景颜色 setbackgroundresource(int resid) 设置背景图片 setdrawfullunderline(boolean drawfull) 设置是否显示分隔栏 settabindicatorcolor(int color) 设置指示器颜色 settextcolor(int color) 设置指示器文字颜色 在 MainActivity.java 的 oncreate 方法中加入如下代码 : mpagertabstrip = (PagerTabStrip) findviewbyid(r.id.pagertabstrip); // 取消标题栏子 View 之间的分割线 mpagertabstrip.setdrawfullunderline(false); // 改变指示器颜色为白色 mpagertabstrip.settabindicatorcolor(color.yellow); // 该变字体颜色为白色 mpagertabstrip.settextcolor(color.green);

40 第 5 章 Android 控件进阶操作实战 147 // 设置字体大小 mpagertabstrip.settextsize(1,24); // 设置标题栏背景图片 mpagertabstrip.setbackgroundresource( android.r.drawable.screen_background_light_transparent); 再次运行实例并向右滑动切换界面, 如图 5.28 所示 查看动态图, 请扫描图 5.29 中的二维码 图 5.28 PagerTabStrip 自定义标题栏 图 5.29 PagerTabStrip 自定义标题栏二维码 可以看出, 除了通过左右滑动切换页面之外, 还可以单击顶部标题来切换页面

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new ListView 自訂排版 主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new int[]{r.drawable.dog1, R.drawable.dog2,

More information

预览图 : (2) 在 SelectCity.java 中增加控件, 用于绑定 select_city 文件的 ListView, TextView,EditTest 等控件 代码和注释如下 :

预览图 : (2) 在 SelectCity.java 中增加控件, 用于绑定 select_city 文件的 ListView, TextView,EditTest 等控件 代码和注释如下 : EditText 实现城市搜索 1801210778 邹宇航 摘要 : 使用 EditText 实现搜索城市的功能, 以此为依据更新 ListView 1. 效果图 : 2. 主要步骤 (1) 在 select-city.xml 布局文件中中添加 EditText 控件用作搜索框, 然后添加 ListView 控件用来显示城市名字内容 代码如下 : 预览图 : (2) 在 SelectCity.java

More information

RecyclerView and CardVew

RecyclerView and CardVew RecyclerView and CardView 建國科技大學資管系饒瑞佶 2017/10 V1 CardView CardView A CardView is a ViewGroup. Like any other ViewGroup, it can be added to youractivity or Fragment using a layout XML file. To create an

More information

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

res/layout 目录下的 main.xml 源码 : <?xml version=1.0 encoding=utf 8?> <TabHost android:layout_height=fill_parent xml 拓展训练 1- 界面布局 1. 界面布局的重要性做应用程序, 界面是最基本的 Andorid 的界面, 需要写在 res/layout 的 xml 里面, 一般情况下一个 xml 对应一个界面 Android 界面布局有点像写 html( 连注释代码的方式都一样 ), 要先给 Android 定框架, 然后再在框架里面放控件,Android 提供了几种框架,AbsoluteLayout,LinearLayout,

More information

Microsoft Word - AEL CH05.doc

Microsoft Word - AEL CH05.doc 5-2 AutoCompleteTextView AutoCompleteTextView 非常類似 EditText, 屬於文字輸入方塊 ; 不過 AutoCompleteTextView 會在使用者輸入幾個字時就會顯示提示文字, 方便使用者選取而無需輸入所有文字, 是一種體貼使用者輸入的設計 AutoCompleteTextView 的提示列表與 Spinner 的選項列表建立方式相同, 需要建立字串陣列來儲存欲提示的文字

More information

Microsoft Word - 第4章 3D相册.doc

Microsoft Word - 第4章 3D相册.doc 第 4 章 3D 相册 学习目标 u 掌握相册界面的开发, 实现相册的立体与倒影效果 在现实生活中, 我们浏览照片时, 不同的相册软件有不同的浏览效果 本章主要实现了一个 3D 效果的相册, 该相册中的图片可以循环滑动展示 4.1 3D 相册 任务综述 相册界面主要是展示一组图片的立体效果, 并显示每个图片的倒影, 左右滑动可以切换不同的图片到 界面的中间位置, 同时在图片下方显示当前图片的标题,

More information

Microsoft Word - weather12 刷新按钮动画+搜索框+bug处理.docx

Microsoft Word - weather12 刷新按钮动画+搜索框+bug处理.docx 一 刷新按钮的动画效果 : 在刷新按钮的位置做两个按钮的布局, 一个是原来的静态图片, 一个是旋转的动画, 然 后控制这两个效果的显示和隐藏 ( 一 ) 刷新按钮的 style: 1. 在 app/src/main/res/values/ styles.xml 文件里添加一个 style: 2. 在 drawable 文件夹下新建一个 title_update_anim.xml, 添加如下内容 注

More information

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入 100 年 特 種 考 試 地 方 政 府 公 務 人 員 考 試 試 題 等 別 : 三 等 考 試 類 科 : 資 訊 處 理 科 目 : 系 統 分 析 與 設 計 一 請 參 考 下 列 旅 館 管 理 系 統 的 使 用 案 例 圖 (Use Case Diagram) 撰 寫 預 約 房 間 的 使 用 案 例 規 格 書 (Use Case Specification), 繪 出 入

More information

<android.support.v7.widget.recyclerview android:layout_width="0dp" android:layout_height="0dp" android:layout_marginbottom

<android.support.v7.widget.recyclerview android:layout_width=0dp android:layout_height=0dp android:layout_marginbottom Android 天气预报简单记录 ( 二 ) 主要内容使用 RecyclerView 显示所有城市和未来 4 天天气使用 SearchView 来实现查询基于百度地图 API 实现定位, 更新天气 ViewPager 实现介绍界面使用 RecyclerView 显示所有城市和未来 4 天天气 RecyclerView 是 support.v7 包中的控件, 和 ListView 类似, 十分的灵活,

More information

Android Fragment

Android Fragment Android Fragment 建國科技大學資管系饒瑞佶 2017/10 V1 Android 3.0 後才支援 Fragment 解決部分 App 適應螢幕大小的問題 它類似於 Activity, 可以像 Activity 可以擁有自己的版面設計, 也和 Activity 一樣有自己的生命週期 ( 具備 oncreate() oncreateview() 與 onpause() 方法 ) LifeCycle

More information

Dynamic Layout in Android

Dynamic Layout in Android Dynamic Layout in Android 建國科技大學資管系 饒瑞佶 2013/5 V1 Layout 多半都透過 res/layout/xml 格式設定來達成 Android 是 OOP, 所以可以動態產生 Layout 重點是 Layout 的階層關係 (Hierarchy) 需要處理對應事件 最後一樣用 setcontentview 加入 Layout 一 加入現有 Layout 中

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

Android 编程基础 Android 开发教程 & 笔记 1

Android 编程基础 Android 开发教程 & 笔记 1 Android 开发教程 & 笔记 1 多式样 ProgressBar 撰写 : 地狱怒兽 联系 :zyf19870302@126.com 普通圆形 ProgressBar 该类型进度条也就是一个表示运转的过程, 例如发送短信, 连接网络等等, 表示一个过程正 在执行中 一般只要在 XML 布局中定义就可以了

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

图 6-1 主界面 MainActivity 界面对应的布局文件 (activity_main.xml) 如下所示 : <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="

图 6-1 主界面 MainActivity 界面对应的布局文件 (activity_main.xml) 如下所示 : <?xml version=1.0 encoding=utf-8?> <RelativeLayout xmlns:android= 第 6 章广播接收者 应用案例 案例 6-1 CallRecord( 通话记录 ) 一 案例描述 1 考核知识点 030006001: 广播接收者简介 030006002: 广播接收者的创建 2 练习目标 广播的静态注册和使用 使用广播处理处理事件 3 需求分析手机最重要的功能就是通话功能, 同样储存通话记录也是必不可少的 该案例使用广 播接收者自己实现通话记录的功能 包括呼出电话 已接来电 未接来电以及通话产生的

More information

_banneradview.setuserkeywords("swimming"); _banneradview.setusercategories("1,3,4"); _banneradview.setusergender(jdbanneradview.gender_male); _bannera

_banneradview.setuserkeywords(swimming); _banneradview.setusercategories(1,3,4); _banneradview.setusergender(jdbanneradview.gender_male); _bannera 京东与 AdView APP 联盟 SDK Android 版接口说明文档 1.5 1. 嵌入 SDK 1.1 添加 SDK Android Studio 环境 : 菜单 New->New Module->Import.jar or.aar package, 然后选中 App 联盟 SDK 所带的 jar 文件 Eclipse+ADT 环境 : 将 App 联盟 SDK 所带的 jar 文件拷贝到

More information

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e Android Studio Debugging 本篇教學除了最基本的中斷點教學之外, 還有條件式中斷的教學 條件式中斷是進階的除錯技巧, 在某些特定情況中, 我們有一個函數可能會被呼叫數次, 但是我們只希望在某種條件成立時才進行中斷, 進而觀察變數的狀態 而條件式中斷這項技巧正是符合這項需求 本教學分兩部分 單步除錯 (Page2~11, 共 10) 條件式中斷點 (Page12~17, 共 6)

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

untitled

untitled JavaEE+Android - 6 1.5-2 JavaEE web MIS OA ERP BOSS Android Android Google Map office HTML CSS,java Android + SQL Sever JavaWeb JavaScript/AJAX jquery Java Oracle SSH SSH EJB+JBOSS Android + 1. 2. IDE

More information

Android Service

Android Service Android Service- 播放音樂 建國科技大學資管系 饒瑞佶 2013/7 V1 Android Service Service 是跟 Activity 並行 一個音樂播放程式若沒使用 Service, 即使按 home 鍵畫面離開之後, 音樂還是照播 如果再執行一次程式, 新撥放的音樂會跟先前撥放的一起撥, 最後程式就會出錯 執行中的程式完全看不到! 但是, 寫成 Service 就不同了

More information

EJB-Programming-3.PDF

EJB-Programming-3.PDF :, JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Value Object Design Pattern J2EE Design Patterns Value Object Value Object Factory J2EE EJB Test Client

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

EJB-Programming-4-cn.doc

EJB-Programming-4-cn.doc EJB (4) : (Entity Bean Value Object ) JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Session Bean J2EE Session Façade Design Pattern Session Bean Session

More information

软件工程文档编制

软件工程文档编制 实训抽象类 一 实训目标 掌握抽象类的定义 使用 掌握运行时多态 二 知识点 抽象类的语法格式如下 : public abstract class ClassName abstract void 方法名称 ( 参数 ); // 非抽象方法的实现代码 在使用抽象类时需要注意如下几点 : 1 抽象类不能被实例化, 实例化的工作应该交由它的子类来完成 2 抽象方法必须由子类来进行重写 3 只要包含一个抽象方法的抽象类,

More information

Android + NFC

Android + NFC Android + NFC 建國科技大學資管系饒瑞佶 2017/3 v1 讀取 Tag UUID Android 2.3.3 (API Level 10) 才有支援完整的 NFC 功能 只要 NFC 相容都讀的到 (NFC 或 Mifare) 建立新專案修改 AndroidManifest.xml 加入 , 如果有 NFC Tag 進入感測範圍, 本 App 也會變成可處理的

More information

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應 專題進度 老師 : 趙啟時老師 學生 : 陳建廷 2013/10/13 用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應 程式碼 : package com.example.phone; import java.util.arraylist;

More information

可 Web 编程的NativeUI 设计与实现

可 Web 编程的NativeUI  设计与实现 可 Web 编程的 NativeUI 设计与实现 张袁炜 zhangyuanwei@baidu.com 欢迎转岗简历请发 About Me @ 张袁炜 直达号 网址导航 百度 音乐 前端 Node.js Android Arduino RaspberryPI https://github.com/zhangyuanwei Outline 一个 Hybrid App 的进化史 Native UI 实现原理

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

建模与图形思考

建模与图形思考 F06_c 观摩 :ContentProvider 基於軟硬整合觀點 架构與 DB 引擎移植方法 ( c) By 高煥堂 4 通用性基类 ContentProvider 基於軟硬整合觀點 的使用范例 刚才的范例里, 我们直接使用 DataPersist 类的接口来与 SQLite 沟通 本节将替 DataPersist 配上 ContentProvider 基类, 让 Client 能透过 ContentProvider

More information

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 -> 目录 1 大概思路... 1 2 创建 WebAPI... 1 3 创建 CrossMainController 并编写... 1 4 Nuget 安装 microsoft.aspnet.webapi.cors... 4 5 跨域设置路由... 4 6 编写 Jquery EasyUI 界面... 5 7 运行效果... 7 8 总结... 7 1 1 大概思路 创建 WebAPI 创建 CrossMainController

More information

Android线程和进程

Android线程和进程 Android 进程和线程 版权声明 华清远见教育集团版权所有 ; 未经华清远见明确许可, 不得为任何目的以任何形式复制或传播此文档的任何部分 ; 本文档包含的信息如有更改, 恕不另行通知 ; 华清远见教育集团保留所有权利 Android 进程和线程 在安装 Android 应用程序的时候,Android 会为每个程序分配一个 Linux 用户 ID, 并设置相应的权限, 这样其它应用程序就不能访问此应用程序所拥有的数据和资源了

More information

Microsoft PowerPoint - 08_Android_Spring11_Control2.pptx

Microsoft PowerPoint - 08_Android_Spring11_Control2.pptx 作者 : 李昭賢作者 : 洪振偉編撰整理者 : 陳彥霖 學習目標 1. 透過 XML 產生控制項 2. 透過 Java 產生控制項 3. 新增事件 (Event) 處理 AnalogClock / DigitalClock 負責顯示時間 AnalogClock: 以傳統鐘錶指針方式顯示時與分 DigitalClock: 以數位數字方式顯示時 分與秒 類比小時鐘 (AnalogClock 類別 ) 數位小時鐘

More information

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii 前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii C# 7 More Effective C# C# C# C# C# C# Common Language Runtime CLR just-in-time

More information

_banneradview.settest(true); _banneradview.setuserkeywords("swimming"); _banneradview.setusercategories("1,3,4"); _banneradview.setusergender(jdbanner

_banneradview.settest(true); _banneradview.setuserkeywords(swimming); _banneradview.setusercategories(1,3,4); _banneradview.setusergender(jdbanner 京东 APP 联盟 SDK Android 版接口说明文档 1.0 1. 嵌入 SDK 1.1 添加 SDK Android Studio 环境 : 菜单 New->New Module->Import.jar or.aar package, 然后选中 App 联盟 SDK 所带的 jar 文件 Eclipse+ADT 环境 : 将 App 联盟 SDK 所带的 jar 文件拷贝到 libs/ 目录下

More information

INTRODUCTION TO COM.DOC

INTRODUCTION TO COM.DOC How About COM & ActiveX Control With Visual C++ 6.0 Author: Curtis CHOU mahler@ms16.hinet.net This document can be freely release and distribute without modify. ACTIVEX CONTROLS... 3 ACTIVEX... 3 MFC ACTIVEX

More information

建模与图形思考

建模与图形思考 C03_c 基 於 軟 硬 整 合 觀 點 JNI: 从 C 调 用 Java 函 数 ( c) By 高 煥 堂 3 How-to: 基 於 軟 硬 整 合 觀 點 从 C 调 用 Java 函 数 如 果 控 制 点 摆 在 本 地 C 层, 就 会 常 常 1. 从 本 地 C 函 数 去 调 用 Java 函 数 ; 2. 从 本 地 C 函 数 去 存 取 Java 层 对 象 的 属 性

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 第 3 章 Android 控件进阶 要设计出让用户喜欢的 Android 应用程序界面, 除了需要用到在第 2 章讲的最基本的 TextView EditText 和 Button 控件外, 还要用到其他控件, 如 ImageButton 控件 ImageView 控件 RadioButton 控件 CheckBox 控件和 ListView 控件等 本章主要讲解功能强大 应用广泛的一些控件 3.1

More information

Struts2自定义类型转换.doc

Struts2自定义类型转换.doc Struts2 自定义类型转换 原理 struts2 的自定义类型转换机制为复杂类型的输入输出处理提供了便捷.struts2 已经为我们提供了几乎所有的 primitive 类型以及常用类型 ( 如 Date) 的类型转换器, 我们也可以为我们自定义类添加自定义类型转化器. struts2 为我们提供了一个类型转化器的入口 : ognl.defaulttypeconverter, 或继承 org.apache.struts2.util.strutstypeconverter,

More information

基于ECO的UML模型驱动的数据库应用开发1.doc

基于ECO的UML模型驱动的数据库应用开发1.doc ECO UML () Object RDBMS Mapping.Net Framework Java C# RAD DataSetOleDbConnection DataGrod RAD Client/Server RAD RAD DataReader["Spell"].ToString() AObj.XXX bug sql UML OR Mapping RAD Lazy load round trip

More information

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit Tomcat Web JUnit Cactus JUnit Java Cactus JUnit 26.1 JUnit Java JUnit JUnit Java JSP Servlet JUnit Java Erich Gamma Kent Beck xunit JUnit boolean JUnit Java JUnit Java JUnit Java 26.1.1 JUnit JUnit How

More information

Microsoft Word - 01.DOC

Microsoft Word - 01.DOC 第 1 章 JavaScript 简 介 JavaScript 是 NetScape 公 司 为 Navigator 浏 览 器 开 发 的, 是 写 在 HTML 文 件 中 的 一 种 脚 本 语 言, 能 实 现 网 页 内 容 的 交 互 显 示 当 用 户 在 客 户 端 显 示 该 网 页 时, 浏 览 器 就 会 执 行 JavaScript 程 序, 用 户 通 过 交 互 式 的

More information

Guava学习之CharSequenceReader

Guava学习之CharSequenceReader CharSequenceReader 类是以 CharSequence 的形式读取字符 CharSequenceReader 类继承自 Reader 类, 除了 remaining() hasremaining() 以及 checkopen() 函数之后, 其他的函数都是重写 Reader 类中的函数 CharSequenceReader 类声明没有用 public 关键字, 所以我们暂时还不能调用这个类

More information

幻灯片 1

幻灯片 1 Delivering accurate maps to Chinese Android users 为中国安卓用户提供准确的地图服务 Work at Mapbox includes: Android apps, demos, starter kits, documentation, support, syncing Android team with other departments, etc.

More information

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 复习 Java 包 创建包 : package 语句, 包结构与目录结构一致 使用包 : import restaurant/ - people/ - Cook.class - Waiter.class - tools/ - Fork.class

More information

Microsoft PowerPoint - ch6 [相容模式]

Microsoft PowerPoint - ch6 [相容模式] UiBinder wzyang@asia.edu.tw UiBinder Java GWT UiBinder XML UI i18n (widget) 1 2 UiBinder HelloWidget.ui.xml: UI HelloWidgetBinder HelloWidget.java XML UI Owner class ( Composite ) UI XML UiBinder: Owner

More information

實作SQLiteOpenHelper類別

實作SQLiteOpenHelper類別 SQLiteOpenHelper 類別存取 SQLite 建國科技大學資管系 饒瑞佶 2013/5 V1 Android 連結資料庫 MySQL SQL Server Web Service 遠端資料庫 Internet Intranet Android SQLite 單機資料庫 Android vs. SQLite 透過 SQLiteOpenHelper 類別來操作 建立資料庫 ( 建構子 ) 建立資料表

More information

在Spring中使用Kafka:Producer篇

在Spring中使用Kafka:Producer篇 在某些情况下, 我们可能会在 Spring 中将一些 WEB 上的信息发送到 Kafka 中, 这时候我们就需要在 Spring 中编写 Producer 相关的代码了 ; 不过高兴的是,Spring 本身提供了操作 Kafka 的相关类库, 我们可以直接通过 xml 文件配置然后直接在后端的代码中使用 Kafka, 非常地方便 本文将介绍如果在 Spring 中将消息发送到 Kafka 在这之前,

More information

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 本章学习目标 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 配置视图解析器 @RequestMapping 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 和 Struts2 都属于表现层的框架, 它是 Spring 框架的一部分, 我们可 以从 Spring 的整体结构中看得出来 :

More information

2 从列表选择在添加黑名单界面中, 点击 从联系人中添加 按钮时, 会跳转到联系人列表界面, 点击其中的任意一个联系人, 此时该联系人的电话号码和姓名会显示在添加黑名单界面的编辑框中, 点击下方的 添加 按钮, 此时会将该号码添加到黑名单中, 并在主界面中展示, 如图 3-2 所示 图 3-2 从联

2 从列表选择在添加黑名单界面中, 点击 从联系人中添加 按钮时, 会跳转到联系人列表界面, 点击其中的任意一个联系人, 此时该联系人的电话号码和姓名会显示在添加黑名单界面的编辑框中, 点击下方的 添加 按钮, 此时会将该号码添加到黑名单中, 并在主界面中展示, 如图 3-2 所示 图 3-2 从联 第 3 章通讯卫士模块 了解通讯卫士模块功能 掌握 SQLite 数据库的使用 掌握如何使用广播接收者拦截电话和短信在日常生活中, 使用手机时经常会被某些电话或短信骚扰, 例如推销保险 中奖信息等, 为此, 我们开发了通讯卫士模块, 该模块可以将骚扰电话或垃圾短信添加到黑名单中, 并对其进行拦截 本章将针对通讯卫士模块进行详细讲解 3.1 模块概述 3.1.1 功能介绍 通讯卫士模块的主要功能是进行黑名单拦截,

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 第 章.1 Android UI 基本概念 用户界面 (User Interface,UI) 是用户与设备之间进行信息交流的直接媒介, 是决定用户体验最重要的部分 相比于早期的计算机的主要交互界面 批处理界面和命令行界面, 现在更为流行的是更简单直接的用户图形界面 (Graphical User Interface, GUI) GUI 简单易用, 受众面广, 直接推动了个人计算机的发展 目前, 主流大众的操作系统都采用了

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

LEFT, RIGHT // 左 // 右 (2) 当图片移动后, 按钮的坐标发生改变, 此操作通过 setloca tion() 方法实现 setlocation() 方法是从 Component 类继承的, 其定义如下 : public void setlocation(int x, int y

LEFT, RIGHT // 左 // 右 (2) 当图片移动后, 按钮的坐标发生改变, 此操作通过 setloca tion() 方法实现 setlocation() 方法是从 Component 类继承的, 其定义如下 : public void setlocation(int x, int y 拼图游戏 任务说明 本实例实现了拼图游戏的开发 运行程序, 单击 开始 按钮将打乱图片的位置, 效果如图 1 所示, 然后通过鼠标单击图片进行移动, 直到将所有图片都移动到正确位置, 游戏过关, 过关后的效果如图 2 所示 图 1 打乱图片位置的效果图 2 图片移动到正确位置的效果 关键技术 本程序主要通过 Swing 与枚举类实现, 程序将一幅完整的图片平均分成 9 部分, 每一部分为一个正方形,

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

0511-Android程式之GPS應用_專題週記4

0511-Android程式之GPS應用_專題週記4 逢甲大學通訊工程學系專題研究 Android 程式之 GPS 應用 專題週記 0511 學生姓名 陳彥儒 D0035131 廖元譽 D0077791 指導老師 楊豐瑞老師繳交日期 2014.05.11 1 匯入 GoogleMap 1.1 取得授權步驟 目前進度 取得 Google 授權鑰匙 實作程式尚未成功 1.1.1 建立個人的 keystore 1.1.2 由個人的 keystore 查詢 SHA1

More information

Microsoft Word - 新1-12.doc

Microsoft Word - 新1-12.doc 实训 5 面向对象编程练习 实训 5 面向对象编程练习 5.1 实训目的 通过编程和上机实验理解 Java 语言是如何体现面向对象编程基本思想 以及如何创建类 和对象 了解成员变量和成员方法的特性 5.2 实训要求 编写一个体现面向对象思想的程序 编写一个创建对象和使用对象的方法的程序 5.3 实训内容 5.3.1 创建对象并使用对象 1 定义一个 Person 类 可以在应用程序中使用该类 成员属性

More information

Introduction Android 应用开发课程介绍 本课程旨在通过 6 个基本任务和相关的知识点, 让学习者在短时间内通过任务驱动的方式快速学习掌握 Android 的基本编程 本在线教程与温州大学 SPOC 对接, 可在 SPOC 中观看具体的视频, 帮助完成实现各基本任务 本在线教程目前

Introduction Android 应用开发课程介绍 本课程旨在通过 6 个基本任务和相关的知识点, 让学习者在短时间内通过任务驱动的方式快速学习掌握 Android 的基本编程 本在线教程与温州大学 SPOC 对接, 可在 SPOC 中观看具体的视频, 帮助完成实现各基本任务 本在线教程目前 目錄 Introduction 认识 Android 开发 (Eclipse 版 ) 任务 1:UI 布局编程任务 1- 具体任务任务 1 知识点任务 2:UI 列表编程任务 2- 具体任务任务 2 知识点任务 3:UI 菜单编程任务 3- 具体任务任务 3 知识点任务 4:Http 编程任务 4- 具体任务任务 4 知识点任务 5: 数据库编程任务 5- 具体任务任务 5 知识点任务 6:Excel

More information

建立Android新專案

建立Android新專案 Android 智 慧 型 手 機 程 式 設 計 Android WebService 建 國 科 技 大 學 資 管 系 饒 瑞 佶 2012/4 V1 2012/8 V2 2013/5 V3 2014/10 v4 提 醒 這 節 的 內 容 針 對 的 是 MS 的 Web Service 或 是 使 用 SOAP(Simple Object Access Protocol) 標 準 建 立

More information

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 第 1 页共 32 页 crm Mobile V1.0 for IOS 用户手册 一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 二 crm Mobile 界面介绍 : 第 3 页共 32 页 三 新建 (New) 功能使用说明 1 选择产品 第 4 页共 32 页 2 填写问题的简要描述和详细描述 第 5 页共

More information

Microsoft Word - Android App开发从入门到精通.doc

Microsoft Word - Android App开发从入门到精通.doc 第 2 章 Android 控件 本章主要介绍 Android 中常用的控件及其使用方法,Android SDK 本身给我们提供大量的 UI 控件, 合理熟练地使用这些控件才能做出优美的界面 有时候 Android 自带的控件不一定能满足业务需求, 所以本章还会介绍自定义控件 2.1 View 介绍 在 Android 开发中,Android 的 UI 界面都是由 View 及其派生类组合而成的 View

More information

内文-2.indd

内文-2.indd 客户端服务端音乐资源信息 : 1. 项目需求从本项目开始, 我们一起开发一个简单的在线音乐播放器, 它具有以下功能 (1) 程序启动时显示一个启动画面, 如图 1-1 所示 (2) 在程序主页面显示服务器上的歌曲列表, 包括歌手名与歌曲名, 单击列表条目可实现在线音乐播放, 单击 播放 暂停 上一曲 下一曲 按钮可实现对应的功能, 进度条可以显示歌曲播放进度, 如图 1-2 所示 图 1-1 程序启动画面

More information

Android 开发教程

Android 开发教程 封面 1 GUI 可视化设计器 DroidDraw DroidDraw 是一个基于 Java Swing 的 Android 界面设计器, 可以通过它来生成复杂的 Android Layout XML 文 件,Android 的 Layout 和 Swing Layout 中有很好的对应, 设计器的代码编写起来比较容易 2 AnDroidDraw AnDroidDraw 是一个与 DroidDraw

More information

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d =

More information

<4D6963726F736F667420506F776572506F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

<4D6963726F736F667420506F776572506F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074> 程 序 设 计 实 习 INFO130048 3-2.C++ 面 向 对 象 程 序 设 计 重 载 继 承 多 态 和 聚 合 复 旦 大 学 计 算 机 科 学 与 工 程 系 彭 鑫 pengxin@fudan.edu.cn 内 容 摘 要 方 法 重 载 类 的 继 承 对 象 引 用 和 拷 贝 构 造 函 数 虚 函 数 和 多 态 性 类 的 聚 集 复 旦 大 学 计 算 机 科 学

More information

IoC容器和Dependency Injection模式.doc

IoC容器和Dependency Injection模式.doc IoC Dependency Injection /Martin Fowler / Java Inversion of Control IoC Dependency Injection Service Locator Java J2EE open source J2EE J2EE web PicoContainer Spring Java Java OO.NET service component

More information

Chapter 9: Objects and Classes

Chapter 9: Objects and Classes Java application Java main applet Web applet Runnable Thread CPU Thread 1 Thread 2 Thread 3 CUP Thread 1 Thread 2 Thread 3 ,,. (new) Thread (runnable) start( ) CPU (running) run ( ) blocked CPU sleep(

More information

ContextMenu

ContextMenu 作者 : 林致宇 日期 :2012/1/20 問題 : 如何建立 ContextMenu? 解答 : 什麼是 ContextMenu 呢? 下面兩張圖是 ContextMenu 的範例, 紅色框線中的選單即所謂的 ContextMenu, 可以視為 選單列表, 例如在左圖的 ContextMenu 中有兩個選項 : Action 1 與 Action 2, 按下 Action 1 可執行某些動作,

More information

《大话设计模式》第一章

《大话设计模式》第一章 第 1 章 代 码 无 错 就 是 优? 简 单 工 厂 模 式 1.1 面 试 受 挫 小 菜 今 年 计 算 机 专 业 大 四 了, 学 了 不 少 软 件 开 发 方 面 的 东 西, 也 学 着 编 了 些 小 程 序, 踌 躇 满 志, 一 心 要 找 一 个 好 单 位 当 投 递 了 无 数 份 简 历 后, 终 于 收 到 了 一 个 单 位 的 面 试 通 知, 小 菜 欣 喜

More information

拦截器(Interceptor)的学习

拦截器(Interceptor)的学习 二 拦截器 (Interceptor) 的学习 拦截器可以监听程序的一个或所有方法 拦截器对方法调用流提供了细粒度控制 可以在无状态会话 bean 有状态会话 bean 和消息驱动 bean 上使用它们 拦截器可以是同一 bean 类中的方法或是一个外部类 下面介绍如何在 Session Bean 类中使用外部拦截器类 @Interceptors 注释指定一个或多个在外部类中定义的拦截器 下面拦截器

More information

epub83-1

epub83-1 C++Builder 1 C + + B u i l d e r C + + B u i l d e r C + + B u i l d e r C + + B u i l d e r 1.1 1.1.1 1-1 1. 1-1 1 2. 1-1 2 A c c e s s P a r a d o x Visual FoxPro 3. / C / S 2 C + + B u i l d e r / C

More information

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6 www.brainysoft.net 1.JasperReport ireport...4 1.1 JasperReport...4 1.2 ireport...4 2....4 2.1 JDK...4 2.1.1 JDK...4 2.1.2 JDK...5 2.1.3 JDK...5 2.2 ant...6 2.2.1 ant...6 2.2.2 ant...6 2.3 JasperReport...7

More information

untitled

untitled 1 Outline 數 料 數 數 列 亂數 練 數 數 數 來 數 數 來 數 料 利 料 來 數 A-Z a-z _ () 不 數 0-9 數 不 數 SCHOOL School school 數 讀 school_name schoolname 易 不 C# my name 7_eleven B&Q new C# (1) public protected private params override

More information

使用MapReduce读取XML文件

使用MapReduce读取XML文件 使用 MapReduce 读取 XML 文件 XML( 可扩展标记语言, 英语 :extensible Markup Language, 简称 : XML) 是一种标记语言, 也是行业标准数据交换交换格式, 它很适合在系统之间进行数据存储和交换 ( 话说 Hadoop H ive 等的配置文件就是 XML 格式的 ) 本文将介绍如何使用 MapReduce 来读取 XML 文件 但是 Had oop

More information

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple halcon 与 C# 混合编程之 Halcon 代码调用 写在前面 完成 halcon 与 C# 混合编程的环境配置后, 进行界面布局设计构思每一个按钮所需要实现 的功能, 将 Halcon 导出的代码复制至相应的 C# 模块下即可 halcon 源程序 : dev_open_window(0, 0, 512, 512, 'black', WindowHandle) read_image (Image,

More information

第一章 Android 简介与开发环境搭建

第一章 Android 简介与开发环境搭建 安卓开发环境与常用布局 第一章 Android 简介与开发环境搭建 本章目标 3G 的概念 Android 的改变 Android 开发环境的搭建编写第一个 Android 程序 Android 程序的目录结构 手机发展史 1. 3G 的概念 3G 全称为 :3rd Generation, 中文含义即为第三代数字通信, 是指将无线通信与国际互联网等多媒体通信结合的新一代移动通信系统 2. 符合 3G

More information

1. 2. Flex Adobe 3.

1. 2. Flex Adobe 3. 1. 2. Flex Adobe 3. Flex Adobe Flex Flex Web Flex Flex Flex Adobe Flash Player 9 /rich Internet applications/ria Flex 1. 2. 3. 4. 5. 6. SWF Flash Player Flex 1. Flex framework Adobe Flex 2 framework RIA

More information

untitled

untitled 1 .NET 利 [] [] 來 說 切 切 理 [] [ ] 來 說 拉 類 類 [] [ ] 列 連 Web 行流 來 了 不 不 不 流 立 行 Page 類 Load 理 Response 類 Write 料 Redirect URL Response.Write("!! ives!!"); Response.Redirect("WebForm2.aspx"); (1) (2) Web Form

More information

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

KillTest 质量更高 服务更好 学习资料   半年免费更新服务 KillTest 质量更高 服务更好 学习资料 http://www.killtest.cn 半年免费更新服务 Exam : 310-055Big5 Title : Sun Certified Programmer for the Java 2 Platform.SE 5.0 Version : Demo 1 / 22 1. 11. public static void parse(string str)

More information

Android + WebService

Android + WebService Android + Web Service 建國科技大學資管系饒瑞佶 2017/3 V1 呼叫 OpenData Web Service http://data.taipei/opendata/datalist/apiaccess?scope=resourceaquire& rid=e7c46724-3517-4ce5-844f-5a4404897b7d http://data.taipei/opendata/datalist/apiaccess?scope=resourceaquir

More information

使用Cassandra和Spark 2.0实现Rest API服务

使用Cassandra和Spark 2.0实现Rest API服务 使用 Cassandra 和 Spark 2.0 实现 Rest API 服务 在这篇文章中, 我将介绍如何在 Spark 中使用 Akkahttp 并结合 Cassandra 实现 REST 服务, 在这个系统中 Cassandra 用于数据的存储 我们已经见识到 Spark 的威力, 如果和 Cassandra 正确地结合可以实现更强大的系统 我们先创建一个 build.sbt 文件, 内容如下

More information

Microsoft Word - ch04三校.doc

Microsoft Word - ch04三校.doc 4-1 4-1-1 (Object) (State) (Behavior) ( ) ( ) ( method) ( properties) ( functions) 4-2 4-1-2 (Message) ( ) ( ) ( ) A B A ( ) ( ) ( YourCar) ( changegear) ( lowergear) 4-1-3 (Class) (Blueprint) 4-3 changegear

More information

概述

概述 Android Material Design 基础 北京理工大学计算机学院金旭亮 概述 概述 Material Design 是 Google 提出的一种 UI 设计风格, 主要用在 Android App 的开发中, 同时, 也为 AngularJS 提供了相应的组件, 可以用于开发具有 Material Design 风格的网页 设置 Material 主题 Material Design 其实是一种

More information

ebook 86-15

ebook 86-15 15 G t k + d e l e t e _ e v e n t G n o m e G n o m e 15.1 GnomeDialog G t k + G n o m e D i a l o g 15.1.1 G n o m e D i a l o g g n o m e _ d i a l o g _ n e w ( ) G N O M E _ D I A L O G ( d i a l

More information

基于UML建模的管理管理信息系统项目案例导航——VB篇

基于UML建模的管理管理信息系统项目案例导航——VB篇 PowerBuilder 8.0 PowerBuilder 8.0 12 PowerBuilder 8.0 PowerScript PowerBuilder CIP PowerBuilder 8.0 /. 2004 21 ISBN 7-03-014600-X.P.. -,PowerBuilder 8.0 - -.TP311.56 CIP 2004 117494 / / 16 100717 http://www.sciencep.com

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 第 3 章 多个用户界面的程序设计 3.1 页面的切换与传递参数值 3.1.1 传递参数组件 Intent Intent 是 Android 系统的一种运行时的绑定机制, 在应用程序运行时连接两个不同组件 在 Android 的应用程序中不管是页面切换还是传递数据或是调用外部程序都可能要用到 Intent Intent 负责对应用中某次操作的动作 动作涉及的数据 附加数据进行描述, Android

More information

chp6.ppt

chp6.ppt Java 软 件 设 计 基 础 6. 异 常 处 理 编 程 时 会 遇 到 如 下 三 种 错 误 : 语 法 错 误 (syntax error) 没 有 遵 循 语 言 的 规 则, 出 现 语 法 格 式 上 的 错 误, 可 被 编 译 器 发 现 并 易 于 纠 正 ; 逻 辑 错 误 (logic error) 即 我 们 常 说 的 bug, 意 指 编 写 的 代 码 在 执 行

More information

概述

概述 OPC Version 1.6 build 0910 KOSRDK Knight OPC Server Rapid Development Toolkits Knight Workgroup, eehoo Technology 2002-9 OPC 1...4 2 API...5 2.1...5 2.2...5 2.2.1 KOS_Init...5 2.2.2 KOS_InitB...5 2.2.3

More information

javaexample-02.pdf

javaexample-02.pdf n e w. s t a t i c s t a t i c 3 1 3 2 p u b l i c p r i v a t e p r o t e c t e d j a v a. l a n g. O b j e c t O b j e c t Rect R e c t x 1 y 1 x 2 y 2 R e c t t o S t r i n g ( ) j a v a. l a n g. O

More information

OOP with Java 通知 Project 3: 4 月 19 日晚 9 点

OOP with Java 通知 Project 3: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 3: 4 月 19 日晚 9 点 复习 Upcasting 同一基类的不同子类可以被视为同一类型 ( 基类 ) 放宽类型一致性 简化接口 class A{ class B{ A a = new A(); B b = new B(); // A a = new B(); compile

More information

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0, http://debut.cis.nctu.edu.tw/~chi Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0, : POSITIVE_INFINITY NEGATIVE_INFINITY

More information

9, : Java 19., [4 ]. 3 Apla2Java Apla PAR,Apla2Java Apla Java.,Apla,,, 1. 1 Apla Apla A[J ] Get elem (set A) A J A B Intersection(set A,set B) A B A B

9, : Java 19., [4 ]. 3 Apla2Java Apla PAR,Apla2Java Apla Java.,Apla,,, 1. 1 Apla Apla A[J ] Get elem (set A) A J A B Intersection(set A,set B) A B A B 25 9 2008 9 M ICROEL ECTRON ICS & COMPU TER Vol. 25 No. 9 September 2008 J ava 1,2, 1,2, 1,2 (1, 330022 ; 2, 330022) :,. Apla - Java,,.. : PAR ;Apla - Java ; ;CMP ; : TP311 : A : 1000-7180 (2008) 09-0018

More information

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 Java V1.0.1 2007 4 10 1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 6.2.10 6.3..10 6.4 11 7.12 7.1

More information

人民邮电

人民邮电 第 2 章 布 局 布 局 是 所 有 带 界 面 的 Android 程 序 的 开 端 布 局 应 用 得 好 坏 直 接 决 定 了 程 序 的 用 户 体 验 虽 然 布 局 看 似 没 有 组 件 复 杂, 但 也 涉 及 到 了 很 多 技 巧 在 各 大 公 司 的 面 试 题 中 也 会 经 常 遇 到 关 于 布 局 的 一 些 问 题 通 过 这 些 问 题 可 以 考 查 应

More information

Spring3.x开发入门

Spring3.x开发入门 Spring Bean 管理 Spring 的工厂类 课程安排 Spring 的 Bean 管理 (XML 方式 ) Spring 的属性注入 (XML 方式 ) Spring 的 Bean 管理 ( 注解方式 ) Spring 的属性注入 ( 注解方式 ) Spring 的工厂类 Spring 的 Bean 管理 (XML 方式 ) 三种实例化 Bean 的方式 使用类构造器实例化 ( 默认无参数

More information

一、

一、 2015 年 6 月 30 日 卓易广告平台 SDK1.0 二 申请流程...7 卓易广告平台 SDK1.0 一 简介 卓易移动推广 SDK(Android) 是卓易官方推出的移动推广 SDK 在 Android 平台上的版本 ( 以下简称 SDK) SDK 的发行版本 ( 完整下载包为 Adroi_MobAds_SDK.zip) 中包括 JAR 包 javadoc 文档 示例以及您正在阅读的用户手册

More information

任务实施 (1) 创建项目 图 3-1 欢迎界面 首先创建一个工程, 将其命名为 BoXueGu, 指定包名为 com.boxuegu (2) 导入界面图片将欢迎界面所需要的背景图片 launch_bg.png 导入到 drawable 文件夹中, 项目的 icon 图标 app_icon.png

任务实施 (1) 创建项目 图 3-1 欢迎界面 首先创建一个工程, 将其命名为 BoXueGu, 指定包名为 com.boxuegu (2) 导入界面图片将欢迎界面所需要的背景图片 launch_bg.png 导入到 drawable 文件夹中, 项目的 icon 图标 app_icon.png 第 3 章注册与登录模块 学习目标 掌握欢迎界面的开发, 能够独立制作欢迎界面 ; 掌握注册和登录模块的开发, 能够实现用户登录功能 博学谷项目的注册与登录模块主要用于创建用户账号, 管理用户信息 当用户注册成功后会跳转到登录界面, 用户登录后可以修改密码以及设置密保, 且只有设置过密保的账户才可以找回密码 本章将针对注册与登录模块进行详细讲解 3.1 欢迎界面 任务综述 在实际开发中, 开启应用程序时首先会呈现一个欢迎界面,

More information

2009年3月全国计算机等级考试二级Java语言程序设计笔试试题

2009年3月全国计算机等级考试二级Java语言程序设计笔试试题 2009 年 3 月 全 国 计 算 机 等 级 考 试 笔 试 试 卷 二 级 Java 语 言 程 序 设 计 ( 考 试 时 间 90 分 钟, 满 分 100 分 ) 一 选 择 题 ( 每 题 2 分, 共 70 分 ) 下 列 各 题 A) B) C) D) 四 个 选 项 中, 只 有 一 个 选 项 是 正 确 的 请 将 正 确 选 项 填 涂 在 答 题 卡 相 应 位 置 上,

More information

59 1 CSpace 2 CSpace CSpace URL CSpace 1 CSpace URL 2 Lucene 3 ID 4 ID Web 1. 2 CSpace LireSolr 3 LireSolr 3 Web LireSolr ID

59 1 CSpace 2 CSpace CSpace URL CSpace 1 CSpace URL 2 Lucene 3 ID 4 ID Web 1. 2 CSpace LireSolr 3 LireSolr 3 Web LireSolr ID 58 2016. 14 * LireSolr LireSolr CEDD Ajax CSpace LireSolr CEDD Abstract In order to offer better image support services it is necessary to extend the image retrieval function of our institutional repository.

More information

Android Android Android SDK iv

Android Android Android SDK iv Android Market Google Android SDK Apple Google Microsoft b2c b 2010 Internet Android how why iii Android 240... Android Android SDK iv Android Market Google Android SDK Visual C++ Java N-tier J2EE Unix/Linux

More information