Microsoft Word - 第5章.doc

Size: px
Start display at page:

Download "Microsoft Word - 第5章.doc"

Transcription

1 第 5 章 文件管理器 Android 系统并不自带文件管理器, 但是很多情况下, 我们有诸如从 SD 中打开文件的需要, 怎么办呢? 相信大家都比较习惯 Window 下操作文件和文件夹的方式, 那么 Android 下是否也有类似的工具呢? 答案是必须有 本章我们将要开发的应用就是 Android 平台下的文件管理器 5.1 功能分析 本章将要实现的文件管理器, 借鉴于 Windows, 从用户实际使用需求出发, 主要实现的功能有 : 浏览任意目录下的文件及文件夹 打开文件 新建文件 删除文件 复制文件 对文件进行重命名 在当前目录或者整个目录进行搜索 返回上一级及根目录等 我们设计的文件管理器最终效果如图 5.1 所示 图 5.1 文件管理器 从图 5.1 可以看到, 我们需要两种基本的布局 :ListView 和 GridView ListView 用于显示文件图标及图片, 而 GridView 用于显示底部的菜单 并且, 我们要为每一个元素绑定监听器, 包括菜单项的单击监听器和列表菜单的长按监听器 同时我们可以想到, 我们需

2 第 5 章文件管理器 要用到多种形式的对话框, 包括搜索对话框 重命名对话框等 通过以上的分析, 我们大体可以知道我们需要定制一些什么样的界面了 5.2 界面设计 (1) 首先是主界面 main.xml, 如上面分析, 我们采用 RelativeLayout 的布局, 在界面顶部放置一个 TextView 用于显示当前文件的路径, 在底部放一个 GridView 用于放置菜单, 而中间用一个 ListView 显示文件信息 01 <?xml version="1.0" encoding="utf-8"?> 02 <RelativeLayout 03 xmlns:android=" 04 android:layout_width="fill_parent" 05 android:layout_height="fill_parent" 06 android:background="@drawable/background"> 07 <!-- 用于显示当前路径 --> 08 <TextView 09 android:layout_width="fill_parent" 10 android:layout_height="wrap_content" 11 android:id="@+id/mpath" 12 android:textsize="20sp" 13 android:singleline="true"></textview> 14 <!-- 用于显示当前目录的内容 --> 15 <ListView 16 android:id="@+id/android:list" 17 android:layout_width="fill_parent" 18 android:layout_height="wrap_content" 19 android:layout_below="@+id/mpath" 20 android:cachecolorhint="# " 21 android:divider="@drawable/line" 22 android:layout_marginbottom="70px"></listview> 23 <!-- 用于显示菜单 --> 24 <GridView 25 android:id="@+id/file_gridview_toolbar" 26 android:layout_height="wrap_content" 27 android:layout_width="fill_parent" 28 android:layout_alignparentbottom="true"></gridview> 29 </RelativeLayout> (2) 如下所示是创建文件时显示的对话框 create_dialog.xml, 提供用户一个二选一选项, 以及一个用于填写文件名称的文本框 01 <?xml version="1.0" encoding="utf-8"?> 02 <LinearLayout 03 xmlns:android=" 04 android:layout_width="fill_parent" 05 android:layout_height="wrap_content" 06 android:orientation="vertical" > 07 <!-- 二选一 --> 08 <RadioGroup 09 android:id="@+id/radiogroup_create" 10 android:layout_width="fill_parent" 11 android:layout_height="wrap_content"> 12 <!-- 创建文件选项 --> 83

3 第 2 篇 Android 典型应用实战案例 13 <RadioButton 14 android:layout_height="wrap_content" 15 android:layout_width="fill_parent" 16 android:text="@string/create_file" 17 android:id="@+id/create_file" /> 18 <!-- 创建文件夹选项 --> 19 <RadioButton 20 android:layout_height="wrap_content" 21 android:layout_width="fill_parent" 22 android:text="@string/create_folder" 23 android:id="@+id/create_folder" /> 24 </RadioGroup> 25 <!-- 文本框, 供用户填写文件名称 --> 26 <EditText 27 android:layout_height="wrap_content" 28 android:id="@+id/new_filename" 29 android:layout_width="fill_parent" 30 android:hint="@string/create _hint" 31 android:singleline="true" /> 32 </LinearLayout> (3) 以下是重命名的对话框 rename_dialog.xml, 只需要一个填写新文件名称的 EditText 即可 01 <?xml version="1.0" encoding="utf-8"?> 02 <LinearLayout 03 xmlns:android=" 04 android:layout_height="wrap_content" android:layout_width="fill_ parent"> 05 <!-- 用于填写新的文件名称 --> 06 <EditText android:id="@+id/new_filename" 07 android:layout_width="fill_parent" 08 android:layout_height="wrap_content" 09 android:autotext="false" 10 android:singleline="true" 11 android:capitalize="none" 12 android:gravity="fill_horizontal"/> 13 </LinearLayout> (4) 接下去是搜索对话框 search_dialog.xml, 同样提供一个二选一的选项 在当前目录下搜索 和 在整个目录中搜索, 以及一个 EditText 用于用户输入要搜索的关键词 01 <?xml version="1.0" encoding="utf-8"?> 02 <LinearLayout 03 xmlns:android=" 04 android:layout_width="fill_parent" 05 android:orientation="vertical" android:layout_height="wrap_ content"> 06 <!-- 提供二选一选项 --> 07 <RadioGroup 08 android:id="@+id/radiogroup_search" 09 android:layout_width="fill_parent" 10 android:layout_height="wrap_content"> 11 <!-- 在当前目录下搜索 --> 12 <RadioButton 13 android:layout_height="wrap_content" 14 android:layout_width="fill_parent" 15 android:text="@string/radio_currentpath" 84

4 第 5 章文件管理器 16 android:id="@+id/radio_currentpath" /> 17 <!-- 在整个目录中搜索 --> 18 <RadioButton 19 android:layout_height="wrap_content" 20 android:layout_width="fill_parent" 21 android:text="@string/radio_wholepath" 22 android:id="@+id/radio_wholepath" /> 23 </RadioGroup> 24 <!-- 输入文件或者文件夹名字 --> 25 <EditText 26 android:layout_height="wrap_content" 27 android:id="@+id/edit_search" 28 android:layout_width="fill_parent" 29 android:hint="@string/edit_search_hint" android:singleline="true" /> 30 </LinearLayout> (5) 还有 GirdView 的每个 Item 的布局 item_menu.xml 01 <?xml version="1.0" encoding="utf-8"?> 02 <RelativeLayout xmlns:android=" res/android" 03 android:id="@+id/relativelayout_item" 04 android:layout_width="fill_parent" 05 android:layout_height="wrap_content" 06 android:paddingbottom="5dip"> 07 <!-- 用于显示菜单的图片 --> 08 <ImageView 09 android:id="@+id/item_image" 10 android:layout_centerhorizontal="true" 11 android:layout_width="wrap_content" 12 android:layout_height="45dp"></imageview> 13 <!-- 用于显示菜单的文字 --> 14 <TextView 15 android:layout_below="@id/item_image" 16 android:id="@+id/item_text" 17 android:layout_centerhorizontal="true" 18 android:layout_width="wrap_content" 19 android:layout_height="wrap_content" 20 android:textcolor="#ffffffff"></textview> 21 </RelativeLayout> (6) 用于显示 ListView 各个子元素的布局跟 item_menu.xml 很相似, 如下所示, 也是由一个 ImageView 和一个 TextView 组成 01 <?xml version="1.0" encoding="utf-8"?> 02 <RelativeLayout xmlns:android=" android" 03 android:id="@+id/relativelayout_item" 04 android:layout_width="fill_parent" 05 android:layout_height="wrap_content" 06 android:paddingbottom="5dip"> 07 <!-- 用于显示菜单的图片 --> 08 <ImageView 09 android:id="@+id/item_image" 10 android:layout_centerhorizontal="true" 11 android:layout_width="wrap_content" 12 android:layout_height="45dp"></imageview> 13 <!-- 用于显示菜单的文字 --> 14 <TextView 15 android:layout_below="@id/item_image" 85

5 第 2 篇 Android 典型应用实战案例 16 android:id="@+id/item_text" 17 android:layout_centerhorizontal="true" 18 android:layout_width="wrap_content" 19 android:layout_height="wrap_content" (7) 当打开文本文件的时候, 我们会使用自己设计的一个编辑器, 编辑器的布局文件 edit_txt.xml 如下所示, 一个 TextView 用于显示文件的标题, 一个 EditText 用于显示当前文件的内容, 以及一个 保存 按钮和一个 取消 按钮 01 <?xml version="1.0" encoding="utf-8"?> 02 <RelativeLayout 03 xmlns:android=" 04 android:layout_width="fill_parent" 05 android:layout_height="fill_parent"> 06 <!-- 用于显示文件名 --> 07 <TextView 08 android:id="@+id/textviewtitle" 09 android:singleline="true" 10 android:textsize="20sp" 11 android:layout_width="fill_parent" 12 android:layout_height="wrap_content" /> 13 <!-- 用于显示文本内容 --> 14 <EditText 15 android:layout_below="@id/textviewtitle" 16 android:layout_height="wrap_content" 17 android:layout_width="fill_parent" 18 android:id="@+id/edittextdetail" 19 android:lines="8" 20 android:gravity="top" /> 21 <! 保存 按钮 --> 22 <Button 23 android:layout_height="wrap_content" 24 android:text="@string/button_refer" 25 android:layout_below="@id/edittextdetail" 26 android:id="@+id/buttonrefer" 27 android:layout_width="100dp" /> 28 <! 取消 按钮 --> 29 <Button 30 android:layout_height="wrap_content" 31 android:text="@string/button_back" 32 android:layout_below="@id/edittextdetail" 33 android:layout_torightof="@id/buttonrefer" 34 android:id="@+id/buttonback" 35 android:layout_width="100dp" /> 36 </RelativeLayout> (8) 同样, 对于网页文件我们也用自己设计的一个 浏览器 打开, 在浏览器中使用了 Android 浏览器的核心组件 WebView, 并为这个 WebView 设置了放大和缩小按钮 最下方是一个进度条, 将它单独放在一个 RelativeLayout 里面, 比较方便控制它的显示和隐藏 01 <?xml version="1.0" encoding="utf-8"?> 02 <FrameLayout 03 xmlns:android=" 04 android:layout_width="fill_parent" 05 android:layout_height="fill_parent" 06 android:background="@drawable/tray_bg"> 07 <RelativeLayout 86

6 第 5 章文件管理器 08 android:id="@+id/weblayout" 09 android:layout_width="fill_parent" 10 android:layout_height="fill_parent"> 11 <!-- 网页浏览器 --> 12 <android.webkit.webview 13 android:id="@+id/webkit" 14 android:layout_width="fill_parent" 15 android:layout_height="fill_parent"> 16 </android.webkit.webview> 17 <!-- 放大 缩小按钮 --> 18 <ZoomControls 19 android:id="@+id/zoomcontrols" 20 android:layout_alignparentbottom="true" 21 android:layout_alignparentright="true" 22 android:layout_width="wrap_content" 23 android:layout_height="wrap_content" 24 android:layout_marginbottom="5dip" 25 android:layout_marginright="5dip"></zoomcontrols> 26 </RelativeLayout> 27 <RelativeLayout 28 android:id="@+id/loadinglayout" 29 android:background="#802b2b2b" 30 android:layout_width="fill_parent" 31 android:layout_height="fill_parent"> 32 <!-- 进度条 --> 33 <ProgressBar 34 android:id="@+id/progressbar" 35 android:layout_centerinparent="true" 36 android:layout_width="wrap_content" 37 android:layout_height="wrap_content"></progressbar> 38 </RelativeLayout> 5.3 功能实现 此时我们假设我们是用户, 从一开始单击程序图标开始运行程序, 到所有功能都单击一遍, 想象我们需要走过的所有流程 一开始, 笔者正是以这样的思路来设计程序的, 现在, 我们再重走一下这个过程 声明变量 首先, 展现在我们眼前的是主界面 我们先定义一些需要用到的变量, 比如 List 型变量 mfilename 用于存储当前目录的文件名称, 相对应的有 List 型变量 mfilepaths, 用于存储这些文件对应的路径 在 oncreate() 函数中, 首先运行函数 initgridview() 初始化菜单视图, 紧接着用函数 initmenulistener() 为各项菜单绑定监听器, 为 ListView 列表绑定长按监听器, 然后运行函数 initfilelistinfo(mrootpath), 默认显示根目录下的文件 01 public class MainActivity extends ListActivity implements OnItemLong ClickListener{ 02 // 声明成员变量 03 // 存放显示的文件列表的名称 04 private List<String> mfilename = null; 87

7 第 2 篇 Android 典型应用实战案例 05 // 存放显示的文件列表的相对应的路径 06 private List<String> mfilepaths = null; 07 // 起始目录 / 08 private String mrootpath = java.io.file.separator; 09 // SD 卡根目录 10 private String msdcard = Environment.getExternalStorageDirectory().toString(); 11 private String moldfilepath = ""; 12 private String mnewfilepath = ""; 13 private String keywords; 14 // 用于显示当前路径 15 private TextView mpath; 16 // 用于放置工具栏 17 private GridView mgridviewtoolbar; 18 private int[] girdview_menu_image = {R.drawable.menu_phone,R. drawable.menu_sdcard, 19 R.drawable.menu_search,R.drawable.menu_create,R.drawable.menu_ palse,r.drawable.menu_exit}; 20 private String[] gridview_menu_title = {" 手机 ","SD 卡 "," 搜索 "," 创建 "," 粘贴 "," 退出 "}; 21 // 代表手机或 SD 卡,1 代表手机,2 代表 SD 卡 22 private static int menuposition = 1; public void oncreate(bundle savedinstancestate) { 26 super.oncreate(savedinstancestate); 27 setcontentview(r.layout.main); 28 // 初始化菜单视图 29 initgridviewmenu(); 30 // 初始化菜单监听器 31 initmenulistener(); 32 // 为列表项绑定长按监听器 33 getlistview().setonitemlongclicklistener(this); 34 mpath = (TextView)findViewById(R.id.mPath); 35 // 程序一开始的时候加载手机目录下的文件列表 36 initfilelistinfo(mrootpath); 37 } 初始化菜单及绑定监听器 在上面我们提到了初始化菜单视图及绑定监听器, 接下去我们来看看具体是如何实现的 如下面的代码所示, 在 05 行中设定元素被选中时的背景颜色,07 行设置菜单的背景图片,09 行设置菜单显示的个数 然后为视图设置适配器, 如 16 行所示 该适配器的实现在代码 20~35 行, 用到了我们一开始定义的两个数组 :imageresourcearray 和 menunamearray 将数组的内容分别存储到一个个的 HashMap 中, 并将这些 HashMap 存储到一个 ArrayList 中, 再将这两个数组的内容分别映射到布局文件 item_menu.xml 中的图片和文字区域 在菜单的监听器中分别为每一个图标绑定一个函数, 前两个图标分别用来显示各目录的内容和 SD 卡目录的内容 接着分别是搜索 创建文件 粘贴 退出程序 01 /** 为 GridView 配置菜单资源 */ 02 private void initgridviewmenu(){ 88

8 第 5 章文件管理器 03 mgridviewtoolbar = (GridView)findViewById(R.id.file_gridview_ toolbar); 04 // 设置选中时候的背景图片 05 mgridviewtoolbar.setselector(r.drawable.menu_item_selected); 06 // 设置背景图片 07 mgridviewtoolbar.setbackgroundresource(r.drawable.menu_background); 08 // 设置列数 09 mgridviewtoolbar.setnumcolumns(6); 10 // 设置居中对齐 11 mgridviewtoolbar.setgravity(gravity.center); 12 // 设置水平 垂直间距为 mgridviewtoolbar.setverticalspacing(10); 14 mgridviewtoolbar.sethorizontalspacing(10); 15 // 设置适配器 16 mgridviewtoolbar.setadapter(getmenuadapter(gridview_menu_title, girdview_menu_image)); 17 } /** 菜单适配器 */ 20 private SimpleAdapter getmenuadapter(string[] menunamearray, 21 int[] imageresourcearray) { 22 // 数组列表用于存放映射表 23 ArrayList<HashMap<String, Object>> mdata = new ArrayList<HashMap <String, Object>>(); 24 for (int i = 0; i < menunamearray.length; i++) { 25 HashMap<String, Object> mmap = new HashMap<String, Object>(); 26 // 将 image 映射成图片资源 27 mmap.put("image", imageresourcearray[i]); 28 // 将 title 映射成标题 29 mmap.put("title", menunamearray[i]); 30 mdata.add(mmap); 31 } 32 // 新建简单适配器, 设置适配器的布局文件和映射关系 33 SimpleAdapter madapter = new SimpleAdapter(this, mdata,r.layout.item_menu, new String[] { "image", "title" },new int[] { R.id.item_ image, R.id.item_text }); 34 return madapter; 35 } /** 菜单项的监听 */ 38 protected void initmenulistener(){ 39 mgridviewtoolbar.setonitemclicklistener(new OnItemClick Listener(){ public void onitemclick(adapterview<?> arg0, View arg1, int arg2, 42 long arg3) { 43 switch(arg2){ 44 // 回到根目录 45 case 0: 46 menuposition = 1; 47 initfilelistinfo(mrootpath); 48 break; 49 // 回到 SD 卡根目录 50 case 1: 51 menuposition = 2; 52 initfilelistinfo(msdcard); 53 break; 54 // 显示搜索对话框 89

9 第 2 篇 Android 典型应用实战案例 55 case 2: 56 searchdilalog(); 57 break; 58 // 创建文件夹 59 case 3: 60 createfolder(); 61 break; 62 // 粘贴文件 63 case 4: 64 palsefile(); 65 break; 66 // 退出 67 case 5: 68 MainActivity.this.finish(); 69 break; 70 } 71 } 72 }); 73 } 设置长按监听器 下一步是设置长按监听器 onitemlongclick, 这里首先还是过滤一下两个特殊的菜单项 返回根目录图标和返回上一级目录图标, 然后执行 inititemlongclicklistener() 函数设置监听器 长按时, 正常情况将会弹出一个对话框, 如图 5.2 所示, 包含复制 重命名 删除这三个操作 但是, 这些操作都需要建立在文件可读的基础上, 如代码 21 行所示 如果是复制操作, 则将复制标志位 iscopy 置为 true, 并保存当前的文件名和路径 ; 如果是删除操作, 则弹出删除对话框 ; 如果是重命名操作, 则弹出重命名对话框 01 // 长按列表项的事件监听 : 对长按需要进行一个控制, 当列表中包括 返回根目录 和 返回上一级 时, 02 // 需要对这两列进行屏蔽 03 public boolean onitemlongclick(adapterview<?> arg0, View arg1, final int position, long arg3) { 04 if(isaddbackup == true){// 说明存在返回根目录和返回上一级两列, 接下来要对这两列进行屏蔽 05 if(position!= 0 && position!= 1){ 06 inititemlongclicklistener(new File(mFilePaths.get (position))); 07 } 08 } 09 if(mcurrentfilepath.equals(mrootpath) mcurrentfilepath.equals (msdcard)){ 10 inititemlongclicklistener(new File(mFilePaths.get(position))); 11 } 12 return false; 13 } 14 private String mcopyfilename; 15 private boolean iscopy = false; 16 /** 长按文件或文件夹时弹出的带 ListView 效果的功能菜单 */ 17 private void inititemlongclicklistener(final File file){ 18 OnClickListener listener = new DialogInterface.OnClickListener(){ 19 //item 的值就是从 0 开始的索引值 ( 从列表的第一项开始 ) 20 public void onclick(dialoginterface dialog, int item) { 90

10 第 5 章文件管理器 21 if(file.canread()){// 注意, 所有对文件的操作必须是在该文件可读的情 况下才可以, 否则报错 22 if(item == 0){ // 复制 23 if(file.isfile()&&"txt".equals((file.getname().substring(file.getname().lastindexof(".")+1, file.getname().length())).tolowercase())){ 24 Toast.makeText(MainActivity.this, " 已复制!", Toast.LENGTH_SHORT).show(); 25 // 复制标志位, 表明已复制文件 26 iscopy = true; 27 // 取得复制文件的名字 28 mcopyfilename = file.getname(); 29 // 记录复制文件的路径 30 moldfilepath = mcurrentfilepath+java.io.file. separator+mcopyfilename; 31 }else{ 32 Toast.makeText(MainActivity.this, " 对不起, 目前只支 持复制文本文件!", Toast.LENGTH_SHORT).show(); 33 } 34 }else if(item == 1){ // 重命名 35 initrenamedialog(file); 36 }else if(item == 2){ // 删除 37 initdeletedialog(file); 38 } 39 }else{ 40 Toast.makeText(MainActivity.this, " 对不起, 您的访问权限不 足!", Toast.LENGTH_SHORT).show(); 41 } 42 } 43 }; 44 // 列表项名称 45 String[] mmenu = {" 复制 "," 重命名 "," 删除 "}; 46 // 显示操作选择对话框 47 new AlertDialog.Builder(MainActivity.this) 48.setTitle(" 请选择操作!") 49.setItems(mMenu, listener) 50.setPositiveButton(" 取消 ",null).show(); 51 } 图 5.2 长按显示对话框 91

11 第 2 篇 Android 典型应用实战案例 显示指定目录内容 如下代码所示, 是显示指定目录内容的函数 当前目录用一个静态变量 mcurrentfilepath 存储, 当一个文件路径被传入 initfilelistinfo 中时, 首先初始化 mfilename 和 mfilepaths 这两个 ArrayList, 并判断当前目录是否是手机目录或者 SD 卡根目录 如果不是, 则通过 initaddbackup() 函数, 在当前界面的上方添加返回根目录和上级目录的按钮 01 // 用静态变量存储当前目录路径信息 02 public static String mcurrentfilepath = ""; 03 /** 根据给定的一个文件夹路径字符串遍历出这个文 04 * 件夹中包含的文件名称并配置到 ListView 列表中 */ 05 private void initfilelistinfo(string filepath){ 06 isaddbackup = false; 07 mcurrentfilepath = filepath; 08 // 显示当前的路径 09 mpath.settext(filepath); 10 mfilename = new ArrayList<String>(); 11 mfilepaths = new ArrayList<String>(); 12 File mfile = new File(filePath); 13 // 遍历出该文件夹路径下的所有文件 / 文件夹 14 File[] mfiles = mfile.listfiles(); 15 // 只要当前路径不是手机根目录或者是 sd 卡根目录, 则显示 返回根目录 和 返回上一级 16 if(menuposition == 1&&!mCurrentFilePath.equals(mRootPath)){ 17 initaddbackup(filepath,mrootpath); 18 }else if(menuposition == 2&&!mCurrentFilePath.equals(mSDCard)){ 19 initaddbackup(filepath,msdcard); 20 } 21 /* 将所有文件信息添加到集合中 */ 22 for(file mcurrentfile:mfiles){ 23 mfilename.add(mcurrentfile.getname()); 24 mfilepaths.add(mcurrentfile.getpath()); 25 } 26 /* 适配数据 */ 27 setlistadapter(new FileAdapter(MainActivity.this,mFileName, mfilepaths)); 28 } 29 private boolean isaddbackup = false; 30 /** 根据单击 手机 " 还是 "SD 卡 " 来加 " 返回根目录 " 和 " 返回上一级 "*/ 31 private void initaddbackup(string filepath,string phone_sdcard){ 32 if(!filepath.equals(phone_sdcard)){ 33 /* 列表项的第一项设置为返回根目录 */ 34 mfilename.add("backtoroot"); 35 mfilepaths.add(phone_sdcard); 36 /* 列表项的第二项设置为返回上一级 */ 37 mfilename.add("backtoup"); 38 // 回到当前目录的父目录即回到上级 39 mfilepaths.add(new File(filePath).getParent()); 40 // 将添加返回按键标识位设置为 true 41 isaddbackup = true; 42 } 92

12 第 5 章文件管理器 43 } 创建文件夹 如下所示是创建文件夹的代码, 如代码 13 行 15 行所示, 我们用 LayoutInflater 来实现在主视图中插入新布局, 并操作新布局里面的元素 在 22~29 行为布局中的按钮绑定监听器, 当选项改变时, 将标志变量 mchecked 分别改变成 1 或者 2 在代码 35 行设置 AlertDialog 的布局文件为 mll 当创建文件成功的时候, 需要用 initfilelistinfo 来更新一下当前的目录内容 运行的效果图如图 5.3 所示 01 private String mnewfoldername = ""; 02 private File mcreatefile; 03 private RadioGroup mcreateradiogroup; 04 private static int mchecked; 05 /** 创建文件夹的方法 : 当用户单击软件下面的创建菜单的时候, 是在当前目录下创建一个 文件夹 06 * 静态变量 mcurrentfilepath 存储的就是当前路径 07 * java.io.file.separator 是 Java 给我们提供的一个 File 类中的静态成员, 08 * 它会根据系统的不同来创建分隔符 09 * mnewfoldername 正是我们要创建的新文件的名称, 从 EditText 组件上得到 */ 10 private void createfolder(){ 11 // 用于标识当前选中的是文件或者文件夹 12 mchecked = 2; 13 LayoutInflater mli = (LayoutInflater)this.getSystemService (Context.LAYOUT_INFLATER_SERVICE); 14 // 初始化对话框布局 15 final LinearLayout mll = (LinearLayout)mLI.inflate(R.layout.create_dialog, null); 16 mcreateradiogroup = (RadioGroup)mLL.findViewById(R.id.radiogroup_ create); 17 final RadioButton mcreatefilebutton = (RadioButton)mLL.findViewById (R.id.create_file); 18 final RadioButton mcreatefolderbutton = (RadioButton)mLL.findView ById(R.id.create_folder); 19 // 设置默认为创建文件夹 20 mcreatefolderbutton.setchecked(true); 21 // 为按钮设置监听器 22 mcreateradiogroup.setoncheckedchangelistener(new RadioGroup.OnCheckedChangeListener(){ 23 // 当选择改变时触发 24 public void oncheckedchanged(radiogroup arg0, int arg1) { 25 if(arg1 == mcreatefilebutton.getid()){ 26 mchecked = 1; 27 }else if(arg1 == mcreatefolderbutton.getid()){ 28 mchecked = 2; 29 } 30 } 31 }); 32 // 显示对话框 33 Builder mbuilder = new AlertDialog.Builder(MainActivity.this) 34.setTitle(" 新建 ") 35.setView(mLL) 36.setPositiveButton(" 创建 ", new DialogInterface.OnClickListener(){ 37 public void onclick(dialoginterface dialog, int which) { 93

13 第 2 篇 Android 典型应用实战案例 38 // 获得用户输入的名称 39 mnewfoldername = ((EditText)mLL.findViewById(R.id.new_ filename)).gettext().tostring(); 40 if(mchecked == 1){ 41 try { 42 mcreatefile = new File(mCurrentFilePath+ 43 java.io.file.separator+mnewfoldername+".txt"); 44 mcreatefile.createnewfile(); 45 // 刷新当前目录文件列表 46 initfilelistinfo(mcurrentfilepath); 47 } catch (IOException e) { 48 Toast.makeText(MainActivity.this, " 文件名拼接出错..!!", Toast.LENGTH_SHORT).show(); 49 } 50 }else if(mchecked == 2){ 51 mcreatefile = new File(mCurrentFilePath+java.io.File.separator+mNewFolderName); 52 if(!mcreatefile.exists()&&!mcreatefile.isdirectory() &&mnewfoldername.length()!= 0){ 53 if(mcreatefile.mkdirs()){ 54 // 刷新当前目录文件列表 55 initfilelistinfo(mcurrentfilepath); 56 }else{ 57 Toast.makeText(MainActivity.this, " 创建失败, 可能是系 统权限不够,root 一下?", 58 Toast.LENGTH_SHORT).show(); 59 } 60 }else{ 61 Toast.makeText(MainActivity.this, " 文件名为空, 还是重名 了呢?", 62 Toast.LENGTH_SHORT).show(); 63 } 64 } 65 } 66 }).setneutralbutton(" 取消 ", null); 67 mbuilder.show(); 68 } 94 图 5.3 创建文件夹

14 第 5 章文件管理器 重命名文件 如下所示是重命名文件的代码, 我们同样使用 LayoutInflater 来展开对话框视图, 并操作对话框视图中的界面元素 重命名的时候, 需要检查当前目录下是否有同名的文件, 如果有重名需要提示用户 否则直接使用 file.renameto() 函数进行重命名, 并更新当前目录的内容 重命名界面如图 5.4 所示 01 EditText met; 02 // 显示重命名对话框 03 private void initrenamedialog(final File file){ 04 LayoutInflater mli = LayoutInflater.from(MainActivity.this); 05 // 初始化重命名对话框 06 LinearLayout mll = (LinearLayout)mLI.inflate(R.layout.rename_ dialog, null); 07 met = (EditText)mLL.findViewById(R.id.new_filename); 08 // 显示当前的文件名 09 met.settext(file.getname()); 10 // 设置监听器 11 OnClickListener listener = new DialogInterface.OnClickListener(){ 12 public void onclick(dialoginterface dialog,int which){ 13 String modifyname = met.gettext().tostring(); 14 final String modifyfilepath = file.getparentfile().getpath()+java.io.file.separator; 15 final String newfilepath = modifyfilepath+modifyname; 16 // 判断该新的文件名是否已经在当前目录下存在 17 if(new File(newFilePath).exists()){ 18 if(!modifyname.equals(file.getname())){// 把 重命名 操作时 没做任何修改的情况过滤掉 19 // 弹出该新命名后的文件已经存在的提示, 并提示接下来的操作 20 new AlertDialog.Builder(MainActivity.this) 21.setTitle(" 提示!") 22.setMessage(" 该文件名已存在, 是否要覆盖?") 23.setPositiveButton(" 确定 ", new DialogInterface.On ClickListener(){ 24 public void onclick(dialoginterface dialog,int which){ 25 file.renameto(new File(newFilePath)); 26 Toast.makeText(MainActivity.this, 27 "the file path is "+new File(newFilePath), Toast. LENGTH_SHORT).show(); 28 // 更新当前目录信息 29 initfilelistinfo(file.getparentfile().getpath()); 30 } 31 }) 32.setNegativeButton(" 取消 ", null).show(); 33 } 34 }else{ 35 // 文件名不重复时直接修改文件名后再次刷新列表 36 file.renameto(new File(newFilePath)); 37 initfilelistinfo(file.getparentfile().getpath()); 38 } 39 } }; 95

15 第 2 篇 Android 典型应用实战案例 42 // 显示对话框 43 AlertDialog renamedialog = new AlertDialog.Builder(MainActivity.this).create(); 44 renamedialog.setview(mll); 45 renamedialog.setbutton(" 确定 ", listener); 46 renamedialog.setbutton2(" 取消 ", new DialogInterface.OnClick Listener(){ 47 public void onclick(dialoginterface dialog,int which){ 48 // 什么都不做, 关闭当前对话框 49 } 50 }); 51 renamedialog.show(); 52 } 图 5.4 重命名 删除文件 当选择了删除时, 将执行代码如下的函数 initdeletedialog(), 显示对话框供用户确认操作, 如果是文件则执行 file.delete(), 如果是文件夹则执行 deletefolder, 如图 5.5 所示 删除文件夹时要采用递归删除的方法, 因为文件夹中可能还有文件夹, 甚至有好几层目录 01 // 弹出删除文件 / 文件夹的对话框 02 private void initdeletedialog(final File file){ 03 new AlertDialog.Builder(MainActivity.this) 04.setTitle(" 提示!") 05.setMessage(" 您确定要删除该 "+(file.isdirectory()?" 文件夹 ":" 文件 ")+" 吗?") 06.setPositiveButton(" 确定 ", new DialogInterface.OnClickListener(){ 07 public void onclick(dialoginterface dialog,int which){ 08 if(file.isfile()){ 09 // 是文件则直接删除 10 file.delete(); 11 }else{ 12 // 是文件夹则用这个方法删除 96

16 第 5 章文件管理器 13 deletefolder(file); 14 } 15 // 重新遍历该文件的父目录 16 initfilelistinfo(file.getparent()); 17 } 18 }) 19.setNegativeButton(" 取消 ", null).show(); 20 } // 删除文件夹的方法 ( 递归删除该文件夹下的所有文件 ) 23 public void deletefolder(file folder){ 24 File[] filearray = folder.listfiles(); 25 if(filearray.length == 0){ 26 // 空文件夹则直接删除 27 folder.delete(); 28 }else{ 29 // 遍历该目录 30 for(file currentfile:filearray){ 31 if(currentfile.exists()&&currentfile.isfile()){ 32 // 文件则直接删除 33 currentfile.delete(); 34 }else{ 35 // 递归删除 36 deletefolder(currentfile); 37 } 38 } 39 folder.delete(); 40 } 41 } 图 5.5 删除文件 粘贴文件 以下代码是粘贴文件的函数, 粘贴前需要保证对文件执行过复制操作, 这样 incopy 的值就会变成 true 并且为了保证粘贴是有效的, 粘贴的路径要与源文件的路径不一致, 97

17 第 2 篇 Android 典型应用实战案例 最后要判断目标路径是否也存在同样文件, 如代码 06 行所示, 如果有相同的文件, 则提示用户作出选择 是否要覆盖 复制文件的实现函数在代码 26~53 行, 通过文件流的方式, 将源文件逐个 byte 复制到目标文件中 01 /** 粘贴 */ 02 private void palsefile(){ 03 mnewfilepath = mcurrentfilepath+java.io.file.separator+mcopy FileName; // 得到新路径 04 Log.d("copy", "moldfilepath is "+moldfilepath+" mnewfilepath is "+mnewfilepath+" iscopy is "+iscopy); 05 if(!moldfilepath.equals(mnewfilepath)&&iscopy == true){ // 在不同路径下复制才有效 06 if(!new File(mNewFilePath).exists()){ 07 copyfile(moldfilepath,mnewfilepath); 08 Toast.makeText(MainActivity.this, " 执行了粘贴 ", Toast.LENGTH_ SHORT).show(); 09 initfilelistinfo(mcurrentfilepath); 10 }else{ 11 new AlertDialog.Builder(MainActivity.this) 12.setTitle(" 提示!") 13.setMessage(" 该文件名已存在, 是否要覆盖?") 14.setPositiveButton(" 确定 ", new DialogInterface.OnClick Listener(){ 15 public void onclick(dialoginterface dialog,int which){ 16 copyfile(moldfilepath,mnewfilepath); 17 initfilelistinfo(mcurrentfilepath); 18 } 19 }) 20.setNegativeButton(" 取消 ", null).show(); 21 } 22 }else{ 23 Toast.makeText(MainActivity.this, " 未复制文件!", Toast.LENGTH_ LONG).show(); 24 } 25 } 26 private int i; 27 FileInputStream fis; 28 FileOutputStream fos; 29 // 复制文件 30 private void copyfile(string oldfile,string newfile){ 31 try { 32 fis = new FileInputStream(oldFile); 33 fos = new FileOutputStream(newFile); 34 do{ 35 // 逐个 byte 读取文件, 并写入另一个文件中 36 if((i = fis.read())!= -1){ 37 fos.write(i); 38 } 39 }while(i!= -1); 40 // 关闭输入文件流 41 if(fis!= null){ 42 fis.close(); 43 } 44 // 关闭输出文件流 45 if(fos!= null){ 46 fos.close(); 98

18 第 5 章文件管理器 47 } 48 } catch (FileNotFoundException e) { 49 e.printstacktrace(); 50 } catch (IOException e) { 51 e.printstacktrace(); 52 } 53 } 搜索文件 当单击菜单项中的 搜索 按钮时, 将调用 serachdialog() 函数 和新建文件类似, 首先我们要判断当前用户选择的是在当前文件夹搜索还是在整个目录搜索 通过 mradiochecked 的值可以确定, 当 mradiochecked 的值为 1 时, 表明是在当前目录, 为 2 时表明是在整个目录下搜索 当单击 搜索 按钮的时候, 将会发送一个广播, 将搜索的关键字和将要搜索的目录传递过去, 接着开启服务, 进行搜索 01 // 显示搜索对话框 02 private void searchdilalog(){ 03 // 用于确定是在当前目录搜索还是在整个目录搜索的标志 04 mradiochecked = 1; 05 LayoutInflater mli = LayoutInflater.from(MainActivity.this); 06 final View mll = (View)mLI.inflate(R.layout.search_dialog, null); 07 mradiogroup = (RadioGroup)mLL.findViewById(R.id.radiogroup_search); 08 final RadioButton mcurrentpathbutton = (RadioButton)mLL.findView ById(R.id.radio_currentpath); 09 final RadioButton mwholepathbutton = (RadioButton)mLL.findView ById(R.id.radio_wholepath); 10 // 设置默认选择在当前路径搜索 11 mcurrentpathbutton.setchecked(true); 12 mradiogroup.setoncheckedchangelistener(new RadioGroup.OnChecked ChangeListener(){ 13 // 当选择改变时触发 14 public void oncheckedchanged(radiogroup radiogroup,int checkid) { 15 // 当前路径的标志为 1 16 if(checkid == mcurrentpathbutton.getid()){ 17 mradiochecked = 1; 18 // 整个目录的标志为 2 19 }else if(checkid == mwholepathbutton.getid()){ 20 mradiochecked = 2; 21 } 22 } 23 }); 24 Builder mbuilder = new AlertDialog.Builder(MainActivity.this) 25.setTitle(" 搜索 ").setview(mll) 26.setPositiveButton(" 确定 ", new OnClickListener(){ 27 public void onclick(dialoginterface arg0, int arg1) { 28 keywords = ((EditText)mLL.findViewById(R.id.edit_search)).getText().toString(); 29 if(keywords.length() == 0){ 30 Toast.makeText(MainActivity.this, " 关键字不能为空!", Toast.LENGTH_SHORT).show(); 31 searchdilalog(); 99

19 第 2 篇 Android 典型应用实战案例 32 }else{ 33 if(menuposition == 1){ 34 mpath.settext(mrootpath); 35 }else{ 36 mpath.settext(msdcard); 37 } 38 // 获取用户输入的关键字并发送广播 - 开始 39 Intent keywordintent = new Intent(); 40 keywordintent.setaction(keyword_broadcast); 41 // 传递搜索的范围区间 :1. 当前路径下搜索 2.SD 卡下搜索 42 if(mradiochecked == 1){ 43 keywordintent.putextra("searchpath", mcurrent FilePath); 44 }else{ 45 keywordintent.putextra("searchpath", msdcard); 46 } 47 // 传递关键字 48 keywordintent.putextra("keyword", keywords); 49 /* 到这里为止是携带关键字信息并发送了广播, 50 会在 Service 服务当中接收该广播并提取关键字进行搜索 */ 51 getapplicationcontext().sendbroadcast(keywordintent); 52 // 获取用户输入的关键字并发送广播 - 结束 53 serviceintent = new Intent("com.android.service.FILE_ SEARCH_START"); 54 MainActivity.this.startService(serviceIntent); // 开启服务, 启动搜索 55 iscomebackfromnotification = false; 56 } 57 } 58 }) 59.setNegativeButton(" 取消 ", null); 60 mbuilder.create().show(); 61 } 接收器源文件 接收器的源文件 SearchBroadCast.java 代码如下所示, 定义了两个静态变量 : mservicekeyword 和 mservicesearchpath, 分别用来存储关键字和搜索路径 在 14 行和 15 行, 当接收到广播的时候, 就对这两个变量赋值 01 package com.supermario.filemanager; // 声明包语句 //02~04 行为引入相关类, 这里不再列举, 请阅读光盘内容 05 public class SearchBroadCast extends BroadcastReceiver { 06 public static String mserviceketword = "";// 接收搜索关键字的静态变量 07 public static String mservicesearchpath = "";// 接收搜索路径的静态变量 09 public void onreceive(context context, Intent intent) { 10 // 取得 intent 11 String maction = intent.getaction(); 12 if(mainactivity.keyword_broadcast.equals(maction)){ 13 // 取得 intent 传递过来的信息 14 mserviceketword = intent.getstringextra("keyword"); 15 mservicesearchpath = intent.getstringextra("searchpath"); 16 } 100

20 第 5 章文件管理器 17 } 18 } 搜索服务 以下是搜索服务 FileService 的代码, 当用户单击启动这个服务的时候, 先后执行了 oncreate() 和 onstart() 函数 在 oncreate() 函数中, 代码 031~035 行新建了一个线程用于执行搜索操作 在 onstart() 函数中通过执行 filesearchnotification() 函数来发出通知, 表明当前正在搜索文件 我们来看下这个搜索服务是如何执行搜索操作的, 在 initfilearray 中首先判断当前文件或文件夹是否可读, 如果不加这个判断将会导致异常, 如代码 079 行所示 接着遍历目录下的所有文件, 并获取文件名与关键字进行比较, 如果包含关键字就存储到 mfilename 和 mfilepaths 中 这里还设置了一个变量 m, 初值设置为 1, 代码 083~088 行对搜索结果作了个处理, 当搜索到第一个结果的时候会在上面添加一个 返回到之前目录 的按钮 由于考虑到文件夹中可能仍有文件夹, 因此需要采用递归的方式, 如代码 093~098 所示 在每次递归搜索文件夹的开始, 需要判断用户是否取消了搜索, 如果取消了搜索, 就直接停止当前的搜索 代码 103~115 行实现通知, 主要通过 PendingIntent 存储当前的 context 和 intent, 然后当用户单击 通知 按钮时可以显示相应的信息 001 package com.supermario.filemanager; // 声明包语句 //002~014 行为引入相关类, 这里不再列举, 请阅读光盘内容 015 public class FileService extends Service { 016 private Looper mlooper; 017 private FileHandler mfilehandler; 018 private ArrayList<String> mfilename = null; 019 private ArrayList<String> mfilepaths = null; 020 public static final String FILE_SEARCH_COMPLETED = "com.supermario.file.file_search_completed"; 021 public static final String FILE_NOTIFICATION = "com.supermario.file.file_notification"; 023 public IBinder onbind(intent arg0) { 024 return null; 025 } 026 // 创建服务 028 public void oncreate() { 029 super.oncreate(); 030 Log.d("FileService", "file service is oncreate"); 031 // 新建处理线程 032 HandlerThread mht = new HandlerThread("FileService",Handler Thread.NORM_PRIORITY); 033 mht.start(); 034 mlooper = mht.getlooper(); 035 mfilehandler = new FileHandler(mLooper); 036 } 037 // 服务开始 039 public void onstart(intent intent, int startid) { 101

21 102 第 2 篇 Android 典型应用实战案例 040 super.onstart(intent, startid); 041 Log.d("FileService", "file service is onstart"); 042 mfilename = new ArrayList<String>(); 043 mfilepaths = new ArrayList<String>(); 044 mfilehandler.sendemptymessage(0); 045 // 发出通知表明正在进行搜索 046 filesearchnotification(); 047 } 049 public void ondestroy() { 050 super.ondestroy(); 051 // 取消通知 052 mnf.cancel(r.string.app_name); 053 } 054 class FileHandler extends Handler{ 055 public FileHandler(Looper looper){ 056 super(looper); 057 } 059 public void handlemessage(message msg) { 060 super.handlemessage(msg); 061 Log.d("FileService", "file service is handlemessage"); 062 // 在指定范围搜索 063 initfilearray(new File(SearchBroadCast.mServiceSearch Path)); 064 // 当用户单击了取消搜索则不发送广播 065 if(!mainactivity.iscomebackfromnotification == true){ 066 Intent intent = new Intent(FILE_SEARCH_COMPLETED); 067 intent.putstringarraylistextra("mfilenamelist", m FileName); 068 intent.putstringarraylistextra("mfilepathslist", m FilePaths); 069 // 搜索完毕之后携带数据并发送广播 070 sendbroadcast(intent); 071 } 072 } 073 } 074 private int m = -1; 075 /** 具体做搜索事件的可回调函数 */ 076 private void initfilearray(file file){ 077 Log.d("FileService", "currentarray is "+file.getpath()); 078 // 只能遍历可读的文件夹, 否则会报错 079 if(file.canread()){ 080 File[] mfilearray = file.listfiles(); 081 for(file currentarray:mfilearray){ 082 if(currentarray.getname().indexof(searchbroadcast.mservicekeyword)!= -1){ 083 if (m == -1) { 084 m++; 085 // 返回搜索之前的目录 086 mfilename.add("backtosearchbefore"); 087 mfilepaths.add(mainactivity.mcurrentfilepath); 088 } 089 mfilename.add(currentarray.getname()); 090 mfilepaths.add(currentarray.getpath()); 091 } 092 // 如果是文件夹则回调该方法 093 if(currentarray.exists()&&currentarray.isdirectory()){ 094 // 如果用户取消了搜索, 应该停止搜索的过程 095 if(mainactivity.iscomebackfromnotification == true){

22 第 5 章文件管理器 096 return; 097 } 098 initfilearray(currentarray); 099 } 100 } 101 } 102 } 103 NotificationManager mnf; 104 /** 通知 */ 105 private void filesearchnotification(){ 106 Notification mnotification = new Notification(R.drawable.logo, " 后台搜索中...",System.currentTimeMillis()); 107 Intent intent = new Intent(FILE_NOTIFICATION); 108 // 打开 notice 时的提示内容 109 intent.putextra("notification", " 当通知还存在, 说明搜索未完成, 可以 在这里触发一个事件, 当点击通知回到 Activity 之后, 可以弹出一个框, 提示是否 取消搜索!"); 110 PendingIntent mpi = PendingIntent.getBroadcast(this,0, intent,0); 111 mnotification.setlatesteventinfo(this, " 在 "+SearchBroadCast. mservicesearchpath+" 下搜索 ", " 搜索关键字为 "+SearchBroadCast.mServiceKeyword+" 点击可取消搜索 ", mpi); 112 if(mnf == null){ 113 mnf = (NotificationManager)getSystemService(NOTIFICATION_ SERVICE); 114 } 115 mnf.notify(r.string.app_name, mnotification); 116 } 117 } 广播接收器 在搜索过程中我们用到了两个广播接收器, 一个是刚开始执行关键字搜索的时候调用的 SearchBroadCast, 另一个是搜索结束后用到的 FileBroadcast 这两个接收器都采用动态注册的方式, 在 onstart() 函数中进行接收器的注册, 在 Destroy 中取消接收器的注册, 如代码 20 行 21 行 32 行 33 行所示 第一个接收器我们在前面已经介绍过了, 下面我们看一下 FileBroadCast 的实现方式 可以看出这个接收器根据绑定在 Intent 中的 action 类型可以执行两种不同的操作 当收到的是 FILE_SEARCH_COMPLETED 的 action 时, 表明搜索完毕, 弹出对话框提示用户是否要显示结果 ; 当收到的 action 是 FILE_NOTIFICATION 时, 表明用户单击了通知, 此时弹出对话框, 询问用户是否取消当前的搜索 搜索对话框的实现代码在 61~88 行, 同样根据当前 action 值的不同显示两种不同的对话框 当搜索完毕, 并单击了 确定 按钮时, 如果没有任何匹配的结果, 则提示 无相关文件 / 文件夹 ; 若有结果则为当前 ListView 绑定新的 Adapter 当弹出是否取消搜索的对话框时, 用户单击 确定 按钮将会使 iscomebackfromnotification 置为 true, 并停止搜索服务, 使文件搜索停止 01 /** 注册广播 */ 02 private IntentFilter mfilter; 03 private FileBroadcast mfilebroadcast; 103

23 第 2 篇 Android 典型应用实战案例 04 private IntentFilter mintentfilter; 05 private SearchBroadCast mservicebroadcast; 07 protected void onstart() { 08 super.onstart(); 09 mfilter = new IntentFilter(); 10 mfilter.addaction(fileservice.file_search_completed); 11 mfilter.addaction(fileservice.file_notification); 12 mintentfilter = new IntentFilter(); 13 mintentfilter.addaction(keyword_broadcast); 14 if(mfilebroadcast == null){ 15 mfilebroadcast = new FileBroadcast(); 16 } 17 if(mservicebroadcast == null){ 18 mservicebroadcast = new SearchBroadCast(); 19 } 20 this.registerreceiver(mfilebroadcast, mfilter); 21 this.registerreceiver(mservicebroadcast, mintentfilter); 22 } /** 注销广播 */ 27 protected void ondestroy() { 28 super.ondestroy(); 29 Log.d("NullPointError", "ondestroy"); 30 mfilename.clear(); 31 mfilepaths.clear(); 32 this.unregisterreceiver(mfilebroadcast); 33 this.unregisterreceiver(mservicebroadcast); 34 } private String maction; 37 public static boolean iscomebackfromnotification = false; 38 /** 内部广播类 */ 39 class FileBroadcast extends BroadcastReceiver{ 41 public void onreceive(context context, Intent intent) { 42 maction = intent.getaction(); 43 // 搜索完毕的广播 44 if(fileservice.file_search_completed.equals(maction)){ 45 mfilename = intent.getstringarraylistextra("mfile NameList"); 46 mfilepaths = intent.getstringarraylistextra("mfile PathsList"); 47 Toast.makeText(MainActivity.this, " 搜索完毕!", Toast.LENGTH_ SHORT).show(); 48 // 这里搜索完毕之后应该弹出一个弹出框提示用户要不要显示数据 49 searchcompleteddialog(" 搜索完毕, 是否马上显示结果?"); 50 getapplicationcontext().stopservice(serviceintent); // 当搜索完毕的时候停止服务, 然后在服务中取消通知 51 // 单击通知栏跳转过来的广播 52 }else if(fileservice.file_notification.equals(maction)){ // 单击通知回到当前 Activity, 读取其中信息 53 String mnotification = intent.getstringextra ("notification"); 54 Toast.makeText(MainActivity.this, mnotification, Toast.LENGTH_LONG).show(); 55 searchcompleteddialog(" 你确定要取消搜索吗?"); 104

24 第 5 章文件管理器 56 } 57 } 58 } // 搜索完毕后单击通知过来时的提示框 61 private void searchcompleteddialog(string message){ 62 Builder searchdialog = new AlertDialog.Builder(MainActivity.this) 63.setTitle(" 提示 ") 64.setMessage(message) 65.setPositiveButton(" 确定 ", new OnClickListener(){ 66 public void onclick(dialoginterface dialog,int which) { 67 // 当弹出框时, 需要对这个 " 确定 " 按钮进行一个判断, 因为要对不同的情况作不同 的处理 (2 种情况 ) 68 // 1. 搜索完毕 69 // 2. 取消搜索 70 if(fileservice.file_search_completed.equals(maction)){ 71 if(mfilename.size() == 0){ 72 Toast.makeText(MainActivity.this, " 无相关文件 / 文件夹!", Toast.LENGTH_SHORT).show(); 73 setlistadapter(new FileAdapter(MainActivity.this, mfilename,mfilepaths)); // 清空列表 74 }else{ 75 // 显示文件列表 76 setlistadapter(new FileAdapter(MainActivity.this, mfilename,mfilepaths)); 77 } 78 }else{ 79 // 设置搜索标志为 true 80 iscomebackfromnotification = true; 81 // 关闭服务, 取消搜索 82 getapplicationcontext().stopservice(serviceintent); 83 } 84 } 85 }) 86.setNegativeButton(" 取消 ", null); 87 searchdialog.create(); 88 searchdialog.show(); 89 } FileAdapter 代码 前面提到搜索完毕之后需要有一个新的 Adapter, 这个 Adapter 的实现代码如下所示 可以看到 FileAdapter 继承于 BaseAdapter, 在它的构造函数中, 初始化各种类型的文件对应的 icon, 然后就是重写 BaseAdapter 的函数 getitem getview 等 这个类的核心就是实现 getview() 函数, 用于将获得的文件名数组和相应的路径数组转换成文件类型对应的 icon 加文件名的形式, 而判断文件类型的依据就是通过文件的扩展名 到这里, 整个搜索的过程就讲解完毕, 搜索的实际效果如图 5.6 和图 5.7 所示 001 // 自定义 Adapter 内部类 002 class FileAdapter extends BaseAdapter{ 003 // 返回键, 各种格式的文件的图标 004 private Bitmap mbackroot; 005 private Bitmap mbackup; 006 private Bitmap mimage; 105

25 106 第 2 篇 Android 典型应用实战案例 007 private Bitmap maudio; 008 private Bitmap mrar; 009 private Bitmap mvideo; 010 private Bitmap mfolder; 011 private Bitmap mapk; 012 private Bitmap mothers; 013 private Bitmap mtxt; 014 private Bitmap mweb; private Context mcontext; 017 // 文件名列表 018 private List<String> mfilenamelist; 019 // 文件对应的路径列表 020 private List<String> mfilepathlist; public FileAdapter(Context context,list<string> filename,list <String> filepath){ 023 mcontext = context; 024 mfilenamelist = filename; 025 mfilepathlist = filepath; 026 // 初始化图片资源 027 // 返回到根目录 028 mbackroot = BitmapFactory.decodeResource(mContext.get Resources(),R.drawable.back_to_root); 029 // 返回到上一级目录 030 mbackup = BitmapFactory.decodeResource(mContext.get Resources(),R.drawable.back_to_up); 031 // 图片文件对应的 icon 032 mimage = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.image); 033 // 音频文件对应的 icon 034 maudio = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.audio); 035 // 视频文件对应的 icon 036 mvideo = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.video); 037 // 可执行文件对应的 icon 038 mapk = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.apk); 039 // 文本文件对应的 icon 040 mtxt = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.txt); 041 // 其他类型文件对应的 icon 042 mothers = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.others); 043 // 文件夹对应的 icon 044 mfolder = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.folder); 045 //zip 文件对应的 icon 046 mrar = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.zip_icon); 047 // 网页文件对应的 icon 048 mweb = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.web_browser); 049 } 050 // 获得文件的总数 051 public int getcount() { 052 return mfilepathlist.size(); 053 }

26 第 5 章文件管理器 054 // 获得当前位置对应的文件名 055 public Object getitem(int position) { 056 return mfilenamelist.get(position); 057 } 058 // 获得当前的位置 059 public long getitemid(int position) { 060 return position; 061 } 062 // 获得视图 063 public View getview(int position, View convertview, ViewGroup viewgroup) { 064 ViewHolder viewholder = null; 065 if (convertview == null) { 066 viewholder = new ViewHolder(); 067 LayoutInflater mli = (LayoutInflater)mContext.getSystem Service(Context.LAYOUT_INFLATER_SERVICE); 068 // 初始化列表元素界面 069 convertview = mli.inflate(r.layout.list_child, null); 070 // 获取列表布局界面元素 071 viewholder.miv = (ImageView)convertView.findViewById(R.id.image_list_childs); 072 viewholder.mtv = (TextView)convertView.findViewById(R.id.text_list_childs); 073 // 将每一行的元素集合设置成标签 074 convertview.settag(viewholder); 075 } else { 076 // 获取视图标签 077 viewholder = (ViewHolder) convertview.gettag(); 078 } 079 File mfile = new File(mFilePathList.get(position).toString()); 080 // 如果当前单击的是返回根目录 081 if(mfilenamelist.get(position).tostring().equals ("BacktoRoot")){ 082 // 添加返回根目录的按钮 083 viewholder.miv.setimagebitmap(mbackroot); 084 viewholder.mtv.settext(" 返回根目录 "); 085 }else if(mfilenamelist.get(position).tostring().equals ("BacktoUp")){ 086 // 添加返回上一级菜单的按钮 087 viewholder.miv.setimagebitmap(mbackup); 088 viewholder.mtv.settext(" 返回上一级 "); 089 }else if(mfilenamelist.get(position).tostring().equals ("BacktoSearchBefore")){ 090 // 添加返回搜索之前目录的按钮 091 viewholder.miv.setimagebitmap(mbackroot); 092 viewholder.mtv.settext(" 返回搜索之前目录 "); 093 }else{ 094 String filename = mfile.getname(); 095 viewholder.mtv.settext(filename); 096 if(mfile.isdirectory()){ 097 viewholder.miv.setimagebitmap(mfolder); 098 }else{ 099 String fileends = filename.substring(filename.last IndexOf(".")+1,fileName.length()).toLowerCase(); // 取出文件后缀名并转成小写 100 if(fileends.equals("m4a") fileends.equals("mp3") fileends.equals("mid") fileends.equals("xmf") fileends.equals("ogg") fileends.equals("wav")){ 101 viewholder.miv.setimagebitmap(mvideo); 107

27 第 2 篇 Android 典型应用实战案例 102 }else if(fileends.equals("3gp") fileends.equals("mp4")){ 103 viewholder.miv.setimagebitmap(maudio); 104 }else if(fileends.equals("jpg") fileends.equals("gif") file Ends.equals("png") fileends.equals("jpeg") fileends.equals("bmp")){ 105 viewholder.miv.setimagebitmap(mimage); 106 }else if(fileends.equals("apk")){ 107 viewholder.miv.setimagebitmap(mapk); 108 }else if(fileends.equals("txt")){ 109 viewholder.miv.setimagebitmap(mtxt); 110 }else if(fileends.equals("zip") fileends.equals("rar")){ 111 viewholder.miv.setimagebitmap(mrar); 112 }else if(fileends.equals("html") fileends.equals("htm") fileends.equals("mht")){ 113 viewholder.miv.setimagebitmap(mweb); 114 }else { 115 viewholder.miv.setimagebitmap(mothers); 116 } 117 } 118 } 119 return convertview; 120 } 121 // 用于存储列表每一行元素的图片和文本 122 class ViewHolder { 123 ImageView miv; 124 TextView mtv; 125 } 126 } 图 5.6 正在搜索 图 5.7 显示搜索结果 打开文件 还有一个功能, 也是文件管理器很重要的功能, 那就是打开文件 为此, 我们需要为 ListView 设置一个按键回调函数, 如下代码所示 当用户单击列表中的文件的时候, 首先判断是文件还是文件夹, 若是文件夹, 直接进入文件夹并显示文件目录 若是文件, 则根 108

28 第 5 章文件管理器 据文件的类型决定打开方式 其中 txt 文件和 html 文件均使用我们自己的查看工具打开, 其他的文件则使用系统的默认打开方式打开 当打开文本文件的时候, 由于需要进行一些比较耗时的工作, 所以此时需要显示一个圆形进度条以通知用户等待 这个进度条的实现函数如代码 56~72 行所示, 简单设置了标题和可被取消属性 01 /** 列表项单击时的事件监听 */ 03 protected void onlistitemclick(listview listview, View view, int position, long id){ 04 final File mfile = new File(mFilePaths.get(position)); 05 // 如果该文件是可读的, 我们进去查看文件 06 if(mfile.canread()){ 07 if(mfile.isdirectory()){ 08 // 如果是文件夹, 则直接进入该文件夹, 查看文件目录 09 initfilelistinfo(mfilepaths.get(position)); 10 }else{ 11 // 如果是文件, 则用相应的打开方式打开 12 String filename = mfile.getname(); 13 String fileends = filename.substring(filename.lastindexof (".")+1,fileName.length()).toLowerCase(); 14 if(fileends.equals("txt")){ 15 // 显示进度条, 表示正在读取 16 initprogressdialog(progressdialog.style_horizontal); 17 new Thread(new Runnable(){ 18 public void run(){ 19 // 打开文本文件 20 opentxtfile(mfile.getpath()); 21 } 22 }).start(); 23 new Thread(new Runnable(){ 24 public void run(){ 25 while(true){ 26 if(istxtdataok == true){ 27 // 关闭进度条 28 mprogressdialog.dismiss(); 29 executeintent(txtdata.tostring(),mfile.getpath()); 30 break; 31 } 32 if(iscancleprogressdialog == true){ 33 // 关闭进度条 34 mprogressdialog.dismiss(); 35 break; 36 } 37 } 38 } 39 }).start(); 40 // 如果是 html 文件则用自己写的工具打开 41 } else if(fileends.equals("html") fileends.equals("mht") fileends.equals("htm")){ 42 Intent intent = new Intent(MainActivity.this,Web Activity.class); 43 intent.setflags(intent.flag_activity_new_task); 44 intent.putextra("filepath", mfile.getpath()); 45 startactivity(intent); 46 } else { 109

29 第 2 篇 Android 典型应用实战案例 47 openfile(mfile); 48 } 49 } 50 }else{ 51 // 如果该文件不可读, 我们给出提示不能访问, 防止用户操作系统文件造成系统崩溃等 52 Toast.makeText(MainActivity.this, " 对不起, 您的访问权限不足!", Toast.LENGTH_SHORT).show(); 53 } 54 } 55 // 进度条 56 ProgressDialog mprogressdialog; 57 boolean iscancleprogressdialog = false; 58 /** 弹出正在解析文本数据的 ProgressDialog*/ 59 private void initprogressdialog(int style){ 60 iscancleprogressdialog = false; 61 mprogressdialog = new ProgressDialog(this); 62 mprogressdialog.settitle(" 提示 "); 63 mprogressdialog.setmessage(" 正在为你解析文本数据, 请稍后..."); 64 mprogressdialog.setcancelable(true); 65 mprogressdialog.setbutton(" 取消 ", new DialogInterface.OnClick Listener(){ 66 public void onclick(dialoginterface arg0, int arg1) { 67 iscancleprogressdialog = true; 68 mprogressdialog.dismiss(); 69 } 70 }); 71 mprogressdialog.show(); 72 } 系统默认打开文件的方法 先来看看使用系统默认方式打开文件的方法如何实现, 如下代码所示 为了保险起见, 我们对文件是否是文件夹又作了一次判断, 然后新建一个 intent, 为 intent 设置 Flags Action 和 DataAndType 属性, 最后使用函数 startactivity(intent) 调用系统方法打开文件 在设置 DataAndType 属性的时候, 需要获得文件的 MIME 类型, 该函数的实现如代码 15~30 行所示, 也是根据文件扩展名来确定的 作为示例, 我们单击一个 jpg 文件, 可以看到效果如图 5.8 所示 01 /** 调用系统的方法, 来打开文件的方法 */ 02 private void openfile(file file){ 03 if(file.isdirectory()){ 04 initfilelistinfo(file.getpath()); 05 }else{ 06 Intent intent = new Intent(); 07 intent.addflags(intent.flag_activity_new_task); 08 intent.setaction(android.content.intent.action_view); 09 // 设置当前文件类型 10 intent.setdataandtype(uri.fromfile(file), getmimetype(file)); 11 startactivity(intent); 12 } 13 } 14 /** 获得 MIME 类型的方法 */ 15 private String getmimetype(file file){ 16 String type = ""; 110

30 第 5 章文件管理器 17 String filename = file.getname(); 18 // 取出文件后缀名并转成小写 19 String fileends = filename.substring(filename.lastindexof (".")+1,fileName.length()).toLowerCase(); 20 if(fileends.equals("m4a") fileends.equals("mp3") fileends.equals("mid") fileends.equals("xmf") fileends.equals("ogg") fileends.equals("wav")){ 21 type = "audio/*";// 系统将列出所有可能打开音频文件的程序选择器 22 }else if(fileends.equals("3gp") fileends.equals("mp4")){ 23 type = "video/*";// 系统将列出所有可能打开视频文件的程序选择器 24 }else if(fileends.equals("jpg") fileends.equals("gif") file Ends.equals("png") fileends.equals("jpeg") fileends.equals ("bmp")){ 25 type = "image/*";// 系统将列出所有可能打开图片文件的程序选择器 26 }else{ 27 type = "*/*"; // 系统将列出所有可能打开该文件的程序选择器 28 } 29 return type; 30 } 图 5.8 打开 jpg 文件 用编辑器打开文本文件 如果打开的文件是文本文件的话, 我们希望使用自己设计的一个简单的编辑器打开 首先, 新建一个变量 txtdata 用于存储文本文件的内容, 使用 opentxtfile() 函数打开文本文件, 并将文本数据存储到 txtdata 变量中, 如代码 16 行所示 接着执行 excuteintent() 函数使用 intent 打开文本编辑器, 并将文本数据 文件路径和标题信息传递过去 01 String txtdata = ""; 02 boolean istxtdataok = false; 03 // 打开文本文件的方法, 用于读取文件数据 111

31 第 2 篇 Android 典型应用实战案例 04 private void opentxtfile(string file){ 05 istxtdataok = false; 06 try { 07 FileInputStream fis = new FileInputStream(new File(file)); 08 StringBuilder msb = new StringBuilder(); 09 int m; 10 // 读取文本文件内容 11 while((m = fis.read())!= -1){ 12 msb.append((char)m); 13 } 14 fis.close(); 15 // 保存读取到的数据 16 txtdata = msb.tostring(); 17 // 读取完毕 18 istxtdataok = true; 19 } catch (FileNotFoundException e) { 20 e.printstacktrace(); 21 } catch (IOException e) { 22 e.printstacktrace(); 23 } 24 } 25 // 执行 Intent 跳转的方法 26 private void executeintent(string data,string file){ 27 Intent intent = new Intent(MainActivity.this,EditTxtActivity.class); 28 intent.setflags(intent.flag_activity_new_task); 29 // 传递文件的路径 标题和内容 30 intent.putextra("path", file); 31 intent.putextra("title", new File(file).getName()); 32 intent.putextra("data", data.tostring()); 33 // 跳转到 EditTxtActivity 34 startactivity(intent); 35 } 文本编辑器的实现 文本编辑器的实现代码如下所示, 新建一个 EditTxtActivity, 主要通过一个 EditText 显示文本内容, 并可以在上面做一些编辑操作, 最后单击 保存 按钮, 实现对文本文件的编辑 不过这个文本文件编辑器做得有些粗糙, 对中文的处理也不好, 可以当做是一个文本编辑器的雏形 读者若有兴趣可以对这个编辑器进行改造, 设计出自己适用的编辑器 如图 5.9 所示, 是在编辑器打开一个文本文件之后显示的效果图 01 package com.supermario.filemanager; // 声明包语句 02~14 行为引入相关类, 这里不再列举, 请阅读光盘内容 // 15 // 文本编辑器 16 public class EditTxtActivity extends Activity implements OnClick Listener{ 17 // 显示打开的文本内容 18 private EditText txtedittext; 19 // 显示打开的文件名 20 private TextView txttexttitle; 21 // 保存 按钮 22 private Button txtsavebutton; 112

32 第 5 章文件管理器 23 // 取消 按钮 24 private Button txtcanclebutton; 25 private String txttitle; 26 private String txtdata; 27 private String txtpath; 29 protected void oncreate(bundle savedinstancestate) { 30 super.oncreate(savedinstancestate); 31 setcontentview(r.layout.edit_txt); 32 // 初始化界面 33 initcontentview(); 34 // 获得文件路径 35 txtpath = getintent().getstringextra("path"); 36 // 获得文件名 37 txttitle = getintent().getstringextra("title"); 38 // 获得文本数据 39 txtdata = getintent().getstringextra("data"); 40 try { 41 txtdata = new String(txtData.getBytes("ISO "),"UTF-8"); // 转码 42 } catch (UnsupportedEncodingException e) { 43 e.printstacktrace(); 44 } 45 txttexttitle.settext(txttitle); 46 txtedittext.settext(txtdata); 47 } 48 /** 组件初始化 */ 49 private void initcontentview(){ 50 txtedittext = (EditText)findViewById(R.id.EditTextDetail); 51 txttexttitle = (TextView)findViewById(R.id.TextViewTitle); 52 txtsavebutton = (Button)findViewById(R.id.ButtonRefer); 53 txtcanclebutton = (Button)findViewById(R.id.ButtonBack); 54 // 设置 保存 按钮监听器 55 txtsavebutton.setonclicklistener(this); 56 // 设置 取消 按钮监听器 57 txtcanclebutton.setonclicklistener(this); 58 } 59 /** 单击事件监听 */ 60 public void onclick(view view) { 61 if(view.getid() == txtsavebutton.getid()){ 62 // 保存 63 savetxt(); 64 }else if(view.getid() == txtcanclebutton.getid()){ 65 EditTxtActivity.this.finish(); 66 } 67 } 68 /** 保存编辑后的文本信息 */ 69 private void savetxt(){ 70 try { 71 // 取得编辑框内容 72 String newdata = txtedittext.gettext().tostring(); 73 BufferedWriter mbw = new BufferedWriter(new FileWriter(new File(txtPath))); 74 // 写入文件 75 mbw.write(newdata,0,newdata.length()); 76 mbw.newline(); 77 mbw.close(); 78 // 提示 113

33 第 2 篇 Android 典型应用实战案例 79 Toast.makeText(EditTxtActivity.this, " 成功保存!", Toast.LENGTH_SHORT).show(); 80 } catch (IOException e) { 81 Toast.makeText(EditTxtActivity.this, " 存储文件时出现了异常!", Toast.LENGTH_SHORT).show(); 82 e.printstacktrace(); 83 } 84 this.finish(); 85 } 86 } 图 5.9 打开文本文档 网页浏览器 除了文本编辑器以外, 我们还自己设计了一个简单的网页浏览器 主要是使用到了 WebView,WebView 是个好东西, 作用相当于一个迷你的浏览器, 采用 Webkit 内核, 因此完美支持 HTML JavaScript CSS 等 如下代码所示, 在 025~039 行中显示初始化页面的组件, 包括 WebView 组件 RelativeLayout 组件等, 然后通过 MyAnsyncTask 执行一个异步进程 这个进程一开始先通过 setvisibility 设置布局的可见性, 将包含 WebView 的布局隐藏, 显示一个进度条, 如代码 087 行 088 行所示 接着这个异步进程在后台执行耗时函数 reading(), 如代码 040~057 行所示,webView 通过 loaddata() 函数载入网页文件的数据 而网页文件的数据是通过函数 readwebdatatostringfrompath 获得, 读取方法也很简单, 如代码 064~070 行所示, 将文件先转换成 FileInputStream, 每次读取 1024 字节, 直到读取完成 当读取文件完成后, 首先还是同样的方式, 通过函数 setvisibility() 隐藏进度条, 显示网页主体 同时为浏览器设置放大 缩小功能, 如代码 104~118 行所示 最后我们打开测 114

34 第 5 章文件管理器 试用的一个 html 文件, 如图 5.10 所示 001 package com.supermario.filemanager; // 声明包语句 002~017 行为引入相关类, 这里不再列举, 请阅读光盘内容 // 018 public class WebActivity extends Activity { 019 // 网页浏览器 020 private WebView webview; 021 // 进度条布局和网页内容主体布局 022 private RelativeLayout loadinglayout,weblayout; 023 // 放大 缩小控制器 024 private ZoomControls zoomcontrols; 026 protected void oncreate(bundle savedinstancestate) { 027 super.oncreate(savedinstancestate); 028 setcontentview(r.layout.web); 029 // 初始化页面组件 030 webview = (WebView)findViewById(R.id.webkit); 031 loadinglayout = (RelativeLayout)findViewById(R.id.loading Layout); 032 weblayout = (RelativeLayout)findViewById(R.id.weblayout); 033 zoomcontrols = (ZoomControls)findViewById(R.id.zoomControls); 034 WebSettings websettings = webview.getsettings(); 035 // 设置可以使用 js 脚本 036 websettings.setjavascriptenabled(true); 037 // 执行异步进程 038 new MyAsyncTask().execute(""); 039 } 040 private void reading(){ 041 String filepath = getintent().getstringextra("filepath"); 042 if (filepath!= null) { 043 // 读取文件 044 webview.loaddata(readwebdatatostringfrompath(filepath, new FileReadOverBack() { 046 public void filereadover() { 047 } 048 }), "text/html", HTTP.UTF_8); 049 } else { 050 new AlertDialog.Builder(WebActivity.this).setTitle(" 出错了 ").setmessage(" 获取文件路径出错!").setPositiveButton(" 返回 ", new OnClickListener() { 052 public void onclick(dialoginterface dialog, int which) { 053 WebActivity.this.finish(); 054 } 055 }); 056 } 057 } 058 // 将网页数据读取到一个字符串变量中 059 private String readwebdatatostringfrompath(string path,final File ReadOverBack filereadoverback){ 060 File file = new File(path); 061 StringBuffer stringbuffer = new StringBuffer(); 062 try { 063 // 读取文件内容 064 FileInputStream inputstream = new FileInputStream(file); 065 byte[] bytes = new byte[1024]; 066 int readcount = 0; 115

35 第 2 篇 Android 典型应用实战案例 067 while ((readcount = inputstream.read(bytes)) > 0) { 068 stringbuffer.append(new String(bytes, 0, readcount)); 069 } 070 filereadoverback.filereadover(); 071 } catch (FileNotFoundException e) { 072 return " 文件不存在!"; 073 } catch (IOException e) { 074 return " 文件读取错误!"; 075 } 076 return stringbuffer.tostring(); 077 } 078 interface FileReadOverBack{ 079 void filereadover(); 080 } 081 // 异步处理类 082 class MyAsyncTask extends AsyncTask<String, String, String>{ 083 // 首先执行的函数 085 protected void onpreexecute() { 086 super.onpreexecute(); 087 loadinglayout.setvisibility(view.visible); 088 weblayout.setvisibility(view.gone); 089 } 090 // 后台执行 092 protected String doinbackground(string... params) { 093 reading(); 094 return null; 095 } 097 protected void onpostexecute(string result) { 098 super.onpostexecute(result); 099 // 设置载入进度条隐藏 100 loadinglayout.setvisibility(view.gone); 101 // 设置浏览器内容可见 102 weblayout.setvisibility(view.visible); 103 // 放大按钮 104 zoomcontrols.setonzoominclicklistener(new View.OnClick Listener() { 105 // 将网页内容放大 107 public void onclick(view v) { 108 webview.zoomin(); 109 } 110 }); 111 // 缩小按钮 112 zoomcontrols.setonzoomoutclicklistener(new View.OnClick Listener() { 113 // 将网页内容缩小 115 public void onclick(view v) { 116 webview.zoomout(); 117 } 118 }); 119 } 116

36 第 5 章文件管理器 120 } 121 } 图 5.10 打开 html 文件 5.4 知识拓展 本章在读取 WebView 文件数据的时候采用了一种特别的处理方式 异步操作, Android 提供了一套专门用于异步处理的类 AynsTask 类 使用这个类可以为耗时程序开辟一个新线程进行处理, 处理完时返回 其实,AsynTask 类就是对 Thread 类的一个封装, 并且加入了一些新的方法 编程时, 两者都可以实现同样的功能 本节后面将对 AsynTask 和 Thread 进行比较 (1)AsynTask 类结构 doinbackground() onpreexecute() onpostexecute() onprogressupdate() 正是这几个回调函数构成了 AsynTask 类的使用逻辑结构, 其中每个 AsynTask 子类必须至少复写 doinbackground() 方法 (2) 回调逻辑关系调用关系如图 5.11 所示 主线程调用 AsynTask 子类实例的 execute() 方法后, 首先会调用 onpreexecute() 方法 onpreexecute() 在主线程中运行, 可以用来写一些开始提示代码 之后启动新线程, 调用 doinbackground() 方法, 进行异步数据处理 处理完毕之后异步线程结束, 在主线程中调用 onpostexecute() 方法 onpostexecute() 可以进行一些结束提示处理 另外, 在 doinbackground() 方法异步处理的时候, 如果希望通知主线程一些数据 ( 如 117

37 第 2 篇 Android 典型应用实战案例 处理进度 ), 可以调用 publishprogress() 方法 这时, 主线程会调用 AsynTask 子类的 onprogressupdate() 方法进行处理 图 5.11 AsynTask 子类线程和主线程回调关系图 (3) 各个函数间数据的传递通过上面的调用关系, 我们就可以大概看出一些数据传递关系, 如下 :execute() 向 doinbackground() 传递,doInBackground() 的返回值会传递给 onpostexecute(), publishprogress() 向 progressupdate() 传递 为了使调用关系明确及安全,AsynTask 类在继承时要传入 3 个泛型 : 第一个泛型对应 execute() 向 doinbackground() 传递的类型 ; 第二个泛型对应 doinbackground() 的返回类型和传递给 onpostexecute() 的类型 ; 第三个泛型对应 publishprogress() 向 progressupdate() 传递的类型 传递的数据都是对应类型的数组, 数组都是可变长的, 可以根据具体情况使用 下面我们看一个简单的例子, 例子功能很简单 :activity 中有 1 个 textview 和 botton 当单击 botton 时, 异步改变 textview 的值, 并且在相应的回调函数执行时, 用 Log.e 输出值 在 Eclipse 中新建一个工程 AnsyncTest, 界面布局如下所示 : <?xml version="1.0" encoding="utf-8"?> 02 <LinearLayout xmlns:android=" android" 03 android:layout_width="fill_parent" 04 android:layout_height="fill_parent" 05 android:orientation="vertical" > 06 <!-- 用于显示数据 --> 07 <TextView 08 android:id="@+id/text" 09 android:layout_width="fill_parent" 10 android:layout_height="wrap_content" 11 android:text="@string/hello" /> 12 <!-- 用于开启异步进程 -->

38 第 5 章文件管理器 13 <Button 14 android:id="@+id/button" 15 android:layout_width="fill_parent" 16 android:layout_height="wrap_content" 17 android:text="change" 18 /> 主体程序如下所示, 首先在 oncreate 函数中初始化界面元素, 为按键绑定监听器, 如代码 18~36 行所示 当用户按下了按键的时候, 新建一个异步进程 anys, 并执行 当单击按钮的时候, 在异步进程类 AnsyTry 中, 先后执行 onpreexecute() doinbackground() onpostexcute() 这 3 个函数, 最后更新主界面 我们设置每次单击的时候, 在主界面 TextView 的内容后面添加一个 A, 如图 5.12 所示, 是我们单击了按钮 4 次之后的结果, 对应的 logcat 的信息如图 5.13 所示 01 package com.supermario.ansynctest; // 声明包语句 02~09 行为引入相关类, 这里不再列举, 请阅读光盘内容 // 10 public class AnsyncTestActivity extends Activity { 11 /** Called when the activity is first created. */ 12 TextView text =null; 13 Button button=null; 14 String str=null; 15 AnsyTry anys=null; 16 double result=0; 18 public void oncreate(bundle savedinstancestate) { 19 super.oncreate(savedinstancestate); 20 setcontentview(r.layout.main); 21 // 初始化界面元素 22 text=(textview) findviewbyid(r.id.text); 23 button=(button) findviewbyid(r.id.button); 24 // 随意设置一个参数 25 str="flag"; 26 // 设置监听器 27 button.setonclicklistener(new OnClickListener() { 29 public void onclick(view v) { 30 // TODO Auto-generated method stub 31 anys=new AnsyTry(text); 32 // 执行线程 33 anys.execute(str); 34 } 35 }); 36 } 37 class AnsyTry extends AsyncTask<String, TextView, Double>{ 38 TextView te=null; 39 public AnsyTry(TextView te) { 40 super(); 41 this.te = te; 42 } 43 // 执行后台进程 45 protected Double doinbackground(string... params) { 46 // TODO Auto-generated method stub 47 double dou=0; 48 if(params[0].equals("flag")){ 49 // 显示当前线程的名称 50 Log.e("ansync",Thread.currentThread().getName()+""); 119

39 第 2 篇 Android 典型应用实战案例 51 dou=100; 52 } 53 publishprogress(te); 54 return dou; 55 } 56 // 后台进程执行完毕 58 protected void onpostexecute(double result) { 59 // TODO Auto-generated method stub 60 super.onpostexecute(result); 61 Log.e("ansync","postExecute---double---"+result); 62 } 63 // 后台进程执行之前 65 protected void onpreexecute() { 66 // TODO Auto-generated method stub\ 67 Log.e("ansync","pretExecute------"); 68 super.onpreexecute(); 69 } 70 // 用于更新界面 72 protected void onprogressupdate(textview... values) { 73 // TODO Auto-generated method stub 74 // 更新 TextView 的内容 75 values[0].settext(values[0].gettext()+"a"); 76 super.onprogressupdate(values); 77 } 78 } 79 } 图 5.12 执行异步进程 图 5.13 执行异步进程的 logcat 信息 5.5 本章小结 本章讲解了如何编写一个简单的文件管理器, 要实现一个文件管理器需要具备的一些基本的功能, 如创建文件 删除文件 复制文件 打开文件 搜索等, 此外针对文本文件和网页文件我们还设计了自己的编辑器和浏览器 本章的布局相对前面几章比较复杂, 主要用到了 ListView GridView 和 WebView 等界面元素, 大家必须熟练掌握这些视图组件的使用, 才能在今后设计程序的时候游刃有余 120

主程式 : 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

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

Android Service

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

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

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

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

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

Guava学习之Resources

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

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

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

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

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

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

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

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

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

Microsoft Word - 01.DOC

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

More information

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

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

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

建模与图形思考

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

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

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

_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

图 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

單步除錯 (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

Android 开发教程

Android 开发教程 封面 1 文件存取编程基础 文件 文件可以用来存储比使用引用更大数量的数据 Android 提供方法来读 写文件 只有本地文件可以被访问 优点 : 可以存储大容量的数据 缺点 : 文件更新或是格式改变可能会导致巨大的编程工作 文件操作 读文件 Context.openFileInput(String name) 打开一个与应用程序联系的私有文件输入流 当文件不存在时抛出 FileNotFoundException

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

實作SQLiteOpenHelper類別

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

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

建模与图形思考

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

More information

The Embedded computing platform

The Embedded computing platform Android User Interfaces Hsiao-Lung Chan, Ph.D. Dept Electrical Engineering Chang Gung University, Taiwan chanhl@maili.cgu.edu.tw Basic control components Text components TextView EditText Button compoents

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

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

无类继承.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

_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

<C8EBC3C5C6AAA3A8B5DA31D5C2A3A92E696E6464>

<C8EBC3C5C6AAA3A8B5DA31D5C2A3A92E696E6464> 第 1 章 进入 Photoshop 的全新世界 本章导读 Photoshop 1 1.1 Photoshop CS6 Photoshop Photoshop 1.1.1 Photoshop POP 1-1 图 1-1 平面广告效果 1.1.2 Photoshop 1-2 Photoshop CS6 Photoshop CS6 Photoshop CS6 Extended 3D 3 Photoshop

More information

Microsoft Word - AccessPortal使用手册v3.1.doc

Microsoft Word - AccessPortal使用手册v3.1.doc HighGuard Access Portal 使用手册 地址 : 上海市张江高科技园区松涛路 563 号海外创新园 B 座 301-302 室 电话 : 021-50806229 传真 : 021-50808180 电子邮件 : marketing@highguard.com.cn 第 1 页共 24 页 目录 1. ACCESSPORTAL 概述...4 1.1. AccessPortal 主页面

More information

中 文 摘 要 智 慧 型 手 機 由 於 有 強 大 的 功 能, 以 及 優 渥 的 便 利 性, 還 能 與 網 路 保 持 隨 時 的 鏈 結 與 同 步 更 新, 因 此 深 受 廣 大 消 費 者 喜 愛, 當 然, 手 機 遊 戲 也 成 為 現 代 人 不 可 或 缺 的 娛 樂 之

中 文 摘 要 智 慧 型 手 機 由 於 有 強 大 的 功 能, 以 及 優 渥 的 便 利 性, 還 能 與 網 路 保 持 隨 時 的 鏈 結 與 同 步 更 新, 因 此 深 受 廣 大 消 費 者 喜 愛, 當 然, 手 機 遊 戲 也 成 為 現 代 人 不 可 或 缺 的 娛 樂 之 臺 北 市 大 安 高 級 工 業 職 業 學 校 資 訊 科 一 百 零 一 學 年 度 專 題 製 作 報 告 ------ 以 Android 製 作 ------ ----- 連 線 塔 防 遊 戲 ------ Tower defense game using Internet technology 班 級 : 資 訊 三 甲 組 別 : A9 組 組 員 : 葉 冠 麟 (9906129)

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

Microsoft Word - 第3章.doc

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

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

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

手说TTS开发指南

手说TTS开发指南 手说 TTS 开发指南 v1.3 2011 年 6 月 版权所有 : 手说工作室 shoushuo.com 版本时间作者说明 1.0 2010-11-15 张波 1.1 2010-12-27 在 ondestroy 方法 unbindservice 1.2 2010-12-30 1.3 2011-6-12 去掉 TTS 初始化 ; ttsservice.initialize() 方法调用添加接口方法

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

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

// 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

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

while ((ch = fr.read())!= -1) { System.out.print((char) ch); fr.close(); 例 3: 用 BufferedReader 读 TXT 文件 public class FileReaderDemo3 { public static v

while ((ch = fr.read())!= -1) { System.out.print((char) ch); fr.close(); 例 3: 用 BufferedReader 读 TXT 文件 public class FileReaderDemo3 { public static v 第九章 Java I/O 流操作 实验目的 (1) 掌握文本文件的读写方法 (2) 掌握 InputStream OutputStream 的使用方法 (3) 熟悉 FileReader,BufferedReader,InputStreamReader 和 FileWriter, BufferedWriter, PrintWriter 的使用方法 ; 理解使用过滤流实现数据项的读写 :DataOutputStream,

More information

untitled

untitled 1 行 行 行 行.NET 行 行 類 來 行 行 Thread 類 行 System.Threading 來 類 Thread 類 (1) public Thread(ThreadStart start ); Name 行 IsAlive 行 行狀 Start 行 行 Suspend 行 Resume 行 行 Thread 類 (2) Sleep 行 CurrentThread 行 ThreadStart

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

使用MapReduce读取XML文件

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

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

投影片 1

投影片 1 Chapter 13 Android 實戰演練 線上匯率查詢 線上匯率查詢 本節範例將實作一個簡單的線上費率查詢, 利用 Url 查詢台灣銀行的即時匯率, 欲查詢的網址為 http://rate.bot.com.tw/pages/static/uip003.zh- TW.htm 此網頁中每隔幾分鐘會更新一次匯率, 所以範例程式在一開啟時會抓取此網頁並將網頁內容解析後將匯率資料取出 線上匯率查詢 台灣銀行線上即時匯率查詢

More information

Microsoft Word - CX1000-HMI_程序开发_PLC通讯

Microsoft Word - CX1000-HMI_程序开发_PLC通讯 用 VB.Net 开发 CX1000 的 HMI 第二部分和 TwinCAT PLC 通讯 一 TwinCAT 动态库 TwinCAT.Ads.dll The TwinCAT.Ads.dll 是一个.NET 类库, 它提供和 ADS 设备通讯的类 如果 TwinCAT PLC 运行在 IPC 上, 则需要添加的类库是路径 \TwinCAT\ADS Api\.NET\v1.1.4322 下的 TwinCAT.Ads.dll

More information

Microsoft Word - AEL CH05.doc

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

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 - Chap04.doc

Microsoft Word - Chap04.doc 04-26 ICON 此範例將說明設定離開與關閉程式的對話視窗提示選項 而啟動這個對話視窗是由一個按鈕來處理, 當按下 按我離開 按鈕時, 會出現 AlertDialog 的訊息, 而 AlertDialog 的內容設定, 先設定是否要顯示 title 的文字 ( 也可以不設定 ), 在此範例是設定為讓它顯示, 所以使用 res/values/string/app_about 這個字串常數 下一步則是顯示

More information

F515_CS_Book.book

F515_CS_Book.book /USB , ( ) / L R 1 > > > 2, / 3 L 1 > > > 2 + - 3, 4 L 1 了解显示屏上显示的图标 Wap 信箱收到一条 Wap push 信息 ( ) GSM 手机已连接到 GSM 网络 指示条越多, 接收质量越好 2 ...........................4.............................. 4 Micro SD (

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

RxJava

RxJava RxJava By 侦跃 & @hi 头 hi RxJava 扩展的观察者模式 处 观察者模式 Observable 发出事件 Subscriber 订阅事件 bus.post(new AnswerEvent(42)); @Subscribe public void onanswer(answerevent event) {! }! Observable observable = Observable.create(new

More information

通过Hive将数据写入到ElasticSearch

通过Hive将数据写入到ElasticSearch 我在 使用 Hive 读取 ElasticSearch 中的数据 文章中介绍了如何使用 Hive 读取 ElasticSearch 中的数据, 本文将接着上文继续介绍如何使用 Hive 将数据写入到 ElasticSearch 中 在使用前同样需要加入 elasticsearch-hadoop-2.3.4.jar 依赖, 具体请参见前文介绍 我们先在 Hive 里面建个名为 iteblog 的表,

More information

建立Android新專案

建立Android新專案 經濟部工業局 Android 智慧型手機程式設計實務應用班 Android WebService 建國科技大學資管系 饒瑞佶 2012/4 WebService 需要 ksoap2-android-assembly-2.5.2-jar-withdependencies.jar 或 ksoap2-android-assembly-2.5.2-jar-withdependencies_timeout1.jar

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

Microsoft Word - Broker.doc

Microsoft Word - Broker.doc Broker 模式 采用 broker 模式对分布式计算进行简单模拟 系统在一个进程内模拟分布式环境, 因此不涉及网络编程和进程间通信,Broker 通过本地函数调用的方式实现 request 和 response 的转发 采用 broker 模式对分布式计算进行简单的模拟, 要求如下 : 设计四个 server, 一个 server 接收两个整数, 求和并返回结果, 一个 server 接收两个整数,

More information

Lecture01_Android介绍

Lecture01_Android介绍 移动平台应用软件开发 Android 介绍 主讲 : 张齐勋 zhangqx@ss.pku.edu.cn 移动平台应用软件开发 课程建设小组 北京大学 二零一七年秋北京 Android是什么 Android不仅仅是一个操作系统 它更是一个完整的软件框 架 Android基于Linux内核 2005年Google公司收购了Android公司 Google公司选择使用Apache许可证开放Android源码

More information

X713_CS_Book.book

X713_CS_Book.book / / /USB ) ; ; C D ; ; B B 1 >> 2 3 B 1 ( > > ) 了解显示屏上显示的图标 Wap 信箱收到一条 Wap push 信息 GSM GPS ( ) 手机已连接到 GSM 网络 指示条越多, 接收质量越好 GPS 2 ...........................4.............................. 4 Micro SD (

More information

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc 1.1 组合 Hibernate 与 Spring 1. 在 Eclipse 中, 新建一个 Web project 2. 给该项目增加 Hibernate 开发能力, 增加 Hibernate 相关类库到当前项目的 Build Path, 同时也提供了 hibernate.cfg.xml 这个配置文件 3. 给该项目增加 Spring 开发能力, 增加 spring 相关类库到当前项目的 Build

More information

Android 开发教程

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

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

chp6.ppt

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

More information

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6: Chapter 15. Suppressed Exception CH14 Finally Block Java SE 7 try-with-resources JVM cleanup try-with-resources JVM cleanup cleanup Java SE 7 Throwable getsuppressed Throwable[] getsuppressed() Suppressed

More information

Swing-02.pdf

Swing-02.pdf 2 J B u t t o n J T e x t F i e l d J L i s t B u t t o n T e x t F i e l d L i s t J F r a m e 21 2 2 Swing C a n v a s C o m p o n e n t J B u t t o n AWT // ToolbarFrame1.java // java.awt.button //

More information

手册 doc

手册 doc 1. 2. 3. 3.1 3.2 3.3 SD 3.4 3.5 SD 3.6 3.7 4. 4.1 4.2 4.3 SD 4.4 5. 5.1 5.2 5.3 SD 6. 1. 1~3 ( ) 320x240~704x288 66 (2G SD 320x2401FPS ) 32M~2G SD SD SD SD 24V DC 3W( ) -10~70 10~90% 154x44x144mm 2. DVR106

More information

教育部補助資訊軟體人才培育先導計畫 100 年度課程發展專案計畫 實驗課程名稱 : IPC(Inter-Process Communication) 開發教師 : 張晉源老師 開發學生 : 林政揚 學校系所 : 樹德科技大學資訊工程學系

教育部補助資訊軟體人才培育先導計畫 100 年度課程發展專案計畫 實驗課程名稱 : IPC(Inter-Process Communication) 開發教師 : 張晉源老師 開發學生 : 林政揚 學校系所 : 樹德科技大學資訊工程學系 教育部補助資訊軟體人才培育先導計畫 100 年度課程發展專案計畫 實驗課程名稱 : IPC(Inter-Process Communication) 開發教師 : 張晉源老師 開發學生 : 林政揚 (s11639104@stu.edu.tw) 學校系所 : 樹德科技大學資訊工程學系 實驗目的 本實驗的目的在於讓同學們可以了解 Android 系統核心內部的行程通訊的原理, 透過呼叫系統提供的其中一樣服務

More information

基于CDIO一体化理念的课程教学大纲设计

基于CDIO一体化理念的课程教学大纲设计 Java 语 言 程 序 设 计 课 程 教 学 大 纲 Java 语 言 程 序 设 计 课 程 教 学 大 纲 一 课 程 基 本 信 息 1. 课 程 代 码 :52001CC022 2. 课 程 名 称 :Java 语 言 程 序 设 计 3. 课 程 英 文 名 称 :Java Programming 4. 课 程 类 别 : 理 论 课 ( 含 实 验 上 机 或 实 践 ) 5. 授

More information

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

第 5 章 Android 控件进阶操作实战 ArrayAdapter 适配器 ListView 的数据渲染都需要借助适配器来完成, 首先看一下结合最简单的 ArrayAdapter 来实现 ListView 主布局文件 (activity_main.xml) 代码如下 : <? 108 Android 开发入门百战经典 第 5 章 Android 控件进阶操作实战 5.1 控之经典 ListView ListView 是最经典的控件之一, 虽然现在其江山地位不稳, 将要被 RecylerView 取 代, 但设计理念是很经典的, 而且很多程序员还是习惯了 ListView, 因此我们还需要对 ListView 进行深入学习 ListView 内容非常多, 读者要有足够的耐心进行学习,

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

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

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

More information

Java Access 5-1 Server Client Client Server Server Client 5-2 DataInputStream Class java.io.datainptstream (extends) FilterInputStream InputStream Obj

Java Access 5-1 Server Client Client Server Server Client 5-2 DataInputStream Class java.io.datainptstream (extends) FilterInputStream InputStream Obj Message Transition 5-1 5-2 DataInputStream Class 5-3 DataOutputStream Class 5-4 PrintStream Class 5-5 (Message Transition) (Exercises) Java Access 5-1 Server Client Client Server Server Client 5-2 DataInputStream

More information

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

KillTest 质量更高 服务更好 学习资料   半年免费更新服务 KillTest 质量更高 服务更好 学习资料 http://www.killtest.cn 半年免费更新服务 Exam : 1Z0-854 Title : Java Standard Edition 5 Programmer Certified Professional Upgrade Exam Version : Demo 1 / 12 1.Given: 20. public class CreditCard

More information

目录 一 功能介绍 功能列表 使用限制...3 二 Android studio 如何导入 SDK SDK 文件结构 导入必要文件 工程配置...6 三 调用 SDK 初始化 如何开始预览...1

目录 一 功能介绍 功能列表 使用限制...3 二 Android studio 如何导入 SDK SDK 文件结构 导入必要文件 工程配置...6 三 调用 SDK 初始化 如何开始预览...1 PISOFTTECH 圆周率全景相机 Android SDK 使用指南 版本 :V0.9.0.DOUBLE Louise 本文主要指导用户如何将本公司的 Android SDK 集成到自己的 Android 项目中, 及提供 API 说明 目录 一 功能介绍...3 1. 功能列表...3 2. 使用限制...3 二 Android studio 如何导入 SDK... 3 1. SDK 文件结构...

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

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

Microsoft PowerPoint - 07.Android 介面元件-TableLayout、Toast、AlertDialog

Microsoft PowerPoint - 07.Android 介面元件-TableLayout、Toast、AlertDialog 計劃名稱 : 104 年度教育部資通訊軟體創新人才推升推廣計畫跨校資源中心 : 雲端運算 ( 國立中山大學 ) 課程名稱 : 網路及平台服務 Part1- 課程教材 教材名稱 :Android 介面元件 -TableLayout Toast AlertDialog 國立高雄大學資訊工程學系張保榮教授 大綱 TableLayout 版面配置 Toast 版面配置 AlertDialog 版面配置 TableLayout

More information

云数据库 RDS SDK

云数据库 RDS SDK 云数据库 RDS SDK SDK SDK 下载 SDK 下载 最新版本 java_sdk.zip python_sdk.zip php_sdk.zip c#_sdk.zip 历史版本 2015-11-3 java_sdk.zip python_sdk.zip php_sdk.zip c#_sdk.zip JAVA 教程 JAVA 创建 Access Key 登陆阿里云账号 打开 我的 Access

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

06 01 action JavaScript action jquery jquery AJAX CSS jquery CSS jquery HTML CSS jquery.css() getter setter.css('backgroundcolor') jquery CSS b

06 01 action JavaScript action jquery jquery AJAX CSS jquery CSS jquery HTML CSS jquery.css() getter setter.css('backgroundcolor') jquery CSS b 06 01 action JavaScript action jquery jquery AJAX 04 4-1 CSS jquery CSS jquery HTML CSS jquery.css() getter setter.css('backgroundcolor') jquery CSS background-color camel-cased DOM backgroundcolor.css()

More information

JavaIO.PDF

JavaIO.PDF O u t p u t S t ream j a v a. i o. O u t p u t S t r e a m w r i t e () f l u s h () c l o s e () public abstract void write(int b) throws IOException public void write(byte[] data) throws IOException

More information

untitled

untitled 1 Outline 料 類 說 Tang, Shih-Hsuan 2006/07/26 ~ 2006/09/02 六 PM 7:00 ~ 9:30 聯 ives.net@gmail.com www.csie.ntu.edu.tw/~r93057/aspnet134 度 C# 力 度 C# Web SQL 料 DataGrid DataList 參 ASP.NET 1.0 C# 例 ASP.NET 立

More information

<4D F736F F D E4345C6BDCCA84323B1E0B3CCD2AAB5E3D6AED2BB2E646F63>

<4D F736F F D E4345C6BDCCA84323B1E0B3CCD2AAB5E3D6AED2BB2E646F63> 基于 WINCE 平台 C# 编程要点之一 本文主要介绍在基于 Windows CE 平台的英创嵌入式主板下进行 C#(Microsoft Visual Stdio.Net 2005) 应用程序开发时会常常用到的一些功能函数以及开发方法, 这些方法适用于英创采用 WinCE 平台的所有型号嵌入式主板, 包括 EM9000 EM9260 EM9160 等 本文要点包括 : 文件的删除和复制 如何获取存取设备的空间大小

More information

题目

题目 开发 Android 应用 目的 : 帮助大家了解 Android 平台开发 作者 : 王威威 技术爱好 : linux,qt, 嵌入式开发 MSN : wangweiweicdma@hotmail.com Email : wang.weiwei1@ztenc.com.cn wangjiecdma@126.com 下载开发资源 1 下载最新的 Android SDK http://code.google.com/android/download.html

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

基于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

Lecture01_Android介绍

Lecture01_Android介绍 移动平台应用软件开发 Android 介绍 主讲 : 张齐勋 zhangqx@ss.pku.edu.cn 移动平台应用软件开发 课程建设小组 北京大学 二零一八年秋北京 Android 是什么 Android 不仅仅是一个操作系统, 它更是一个完整的软件框架 Android 基于 Linux 内核 2005 年 Google 公司收购了 Android 公司 Google 公司选择使用 Apache

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

Chapter 9: Objects and Classes

Chapter 9: Objects and Classes Fortran Algol Pascal Modula-2 BCPL C Simula SmallTalk C++ Ada Java C# C Fortran 5.1 message A B 5.2 1 class Vehicle subclass Car object mycar public class Vehicle extends Object{ public int WheelNum

More information

Database_001

Database_001 作者 : 林致宇日期 :2011/10/26 主要參考來源 : http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applicat ions/ 問題 : 如在存取一個已經建立好的資料庫? 解答 : 有一些應用程式會需要讀取已經建立好的資料庫, 例如一個試題測驗應用程式, 裡面的試題可能已經於電腦上, 使用任何的

More information

Chapter 4

Chapter 4 Chapter 4 手機控制項應用 元件佈局 線性佈局共有兩個方向 : 垂直 (vertical) 水帄 (horizontal) 決定垂直或是水帄的屬性為 Orientation android:orientation="vertical" 線性佈局就是將在 < LinearLayout > 內的元件以線性的方式來呈現

More information

03 开发入门.key

03 开发入门.key #3 手机应用开发入门 刘宁 Email:liuning2@mail.sysu.edu.cn 大纲» Android 基本概念» 开发包及 工具安装» 创建 HelloWorld» Android 程序设计基础 2 Android 开发基本概念» Activities» Intents» 视图与控件 ( 界 面元素 )» 异步调 用 ( 多线程 支持 )» 后台服务 3 Activities Android

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