金山API介绍、xml解析数据、查词布局

惯例先下载地址:https://yunpan.cn/cqt5xp3QAJsSM (提取码:ffaa)

总结一下(三)中的小问题,

  1. Activity继承的是FragmentActivity,当然是因为要往里面方Fragment…..他是3.0以后的东西,为了在低版本中使用Fragment就要用到v4包,而FragmentActivity就是这个兼容包里面的,它提供了操作Fragment的一些方法,其功能跟3.0及以后的版本的Activity的功能一样。
    下面是API中的原话:
    FragmentActivity is a special activity provided in the Support Library to handle fragments on system versions older than API level 11. If the lowest system version you support is API level 11 or higher, then you can use a regular Activity.
    说到这就出现了下面
  2. 导包要一致,若用V4的Fragment那么一定全要用V4,否则全不用V4,混合搭配就会出现找不到方法等等的错误,其获得Manager的方式也有不同
    3.0以下:getSupportFragmentManager()
    3.0以上:getFragmentManager()

好,继续
这一次先介绍一下金山词霸api http://open.iciba.com/?c=api
点击文档

点击查词接口 总结起来就是 将http://dict-co.iciba.com/api/dictionary.php?w=go&key=**这样一个地址的XML文件解析,就会有

'word_name':'' #单词
'exchange': '' #单词的各种时态
'symbols':'' #单词各种信息 下面字段都是这个字段下面的
'ph_en': '' #英式音标
'ph_am': '' #美式音标
'ph_en_mp3':'' #英式发音
'ph_am_mp3': '' #美式发音
'ph_tts_mp3': '' #TTS发音
'parts':'' #词的各种意思

这样的数据出来(地址中go就是要查的词,*就是一会要申请的KEY).

再点击每日一句,下载http://open.iciba.com/dsapi/?地址的json文件(这里为了在练习一下json解析就与查词区分开,实际也可用xml)就会有

    JSON 字段解释{'sid':'' #每日一句ID'tts': '' #音频地址'content':'' #英文内容'note': '' #中文内容'love': '' #每日一句喜欢个数'translation':'' #词霸小编'picture': '' #图片地址'picture2': '' #大图片地址'caption':'' #标题'dateline':'' #时间's_pv':'' #浏览数'sp_pv':'' #语音评测浏览数'tags':'' #相关标签'fenxiang_img':'' #合成图片,建议分享微博用的}

那么总结起来就是两步

  1. 申请key
  2. 解析XML


写上邮箱,剩下两个没有多大意义,然后就会有一个key发到你的邮箱里,之后代替之前的**就可以了.

XML解析常用dom,sax,pull…根据熟练度我选择了sax,而且这个文件非常简单,也不用去做循环之类的操作.

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;import com.entity.WordValue;public class JinShanContentHandler extends DefaultHandler {public WordValue wordValue = null;private String tagName = null;private String interpret = ""; // 防止空指针异常private String orig = "";private boolean isChinese = false;public JinShanContentHandler() {wordValue = new WordValue();isChinese = false;}public WordValue getWordValue() {return wordValue;}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {super.characters(ch, start, length);if (length <= 0)return;for (int i = start; i < start + length; i++) {if (ch[i] == '\n')return;}// 去除莫名其妙的换行!String str = new String(ch, start, length);if (tagName == "key") {wordValue.setWord(str);} else if (tagName == "ps") {if (wordValue.getPsE().length() <= 0) {wordValue.setPsE(str);} else {wordValue.setPsA(str);}} else if (tagName == "pron") {if (wordValue.getPronE().length() <= 0) {wordValue.setPronE(str);} else {wordValue.setPronA(str);}} else if (tagName == "pos") {isChinese = false;interpret = interpret + str + " ";} else if (tagName == "acceptation") {interpret = interpret + str + "\n";interpret = wordValue.getInterpret() + interpret;wordValue.setInterpret(interpret);interpret = ""; // 初始化操作,预防有多个释义} else if (tagName == "orig") {orig = wordValue.getSentOrig();wordValue.setSentOrig(orig + str + "\n");} else if (tagName == "trans") {String temp = wordValue.getSentTrans() + str + "\n";wordValue.setSentTrans(temp);} else if (tagName == "fy") {isChinese = true;wordValue.setInterpret(str);}}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {super.endElement(uri, localName, qName);tagName = null;}@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {super.startElement(uri, localName, qName, attributes);tagName = localName;}@Overridepublic void endDocument() throws SAXException {super.endDocument();if (isChinese)return;String interpret = wordValue.getInterpret();if (interpret != null && interpret.length() > 0) {char[] strArray = interpret.toCharArray();wordValue.setInterpret(new String(strArray, 0, interpret.length() - 1));// 去掉解释的最后一个换行符}}}

XMLParser类

import javax.xml.parsers.SAXParserFactory;import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;public class XMLParser {public SAXParserFactory factory = null;public XMLReader reader = null;public XMLParser() {try {factory = SAXParserFactory.newInstance();reader = factory.newSAXParser().getXMLReader();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void parseJinShanXml(DefaultHandler content, InputSource inSource) {if (inSource == null)return;try {reader.setContentHandler(content);reader.parse(inSource);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

接下就是NetOperate,关于网络的操作类

public class NetOperator {public final static String iCiBaURL1 = "http://dict-co.iciba.com/api/dictionary.php?w=";public final static String iCiBaURL2 = "&key=1A107615BE5622161FF987B90758D04B"; // keypublic static boolean IsHaveInternet(Context context) {try {ConnectivityManager manger = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo info = manger.getActiveNetworkInfo();return (info != null && info.isConnected());} catch (Exception e) {return false;}}public static InputStream getInputStreamByUrl(String urlStr) {InputStream tempInput = null;URL url = null;HttpURLConnection connection = null;// 设置超时时间try {url = new URL(urlStr);connection = (HttpURLConnection) url.openConnection(); // 别忘了强制类型转换connection.setConnectTimeout(8000);connection.setReadTimeout(10000);tempInput = connection.getInputStream();} catch (Exception e) {e.printStackTrace();}return tempInput;}@SuppressWarnings("deprecation")public static WordValue getWordFromInternet(String searchedWord) {WordValue wordValue = null;String tempWord = searchedWord;if (tempWord.equals(""))return null;char[] array = tempWord.toCharArray();if (array[0] > 256) // 是中文,或其他语言的的简略判断tempWord = "_" + URLEncoder.encode(tempWord);InputStream in = null;try {String tempUrl = NetOperator.iCiBaURL1 + tempWord + NetOperator.iCiBaURL2;in = NetOperator.getInputStreamByUrl(tempUrl); // 从网络获得输入流if (in != null) {// new FileUtils().saveInputStreamToFile(in, "", "gfdgf.txt");XMLParser xmlParser = new XMLParser();InputStreamReader reader = new InputStreamReader(in, "utf-8"); // 最终目的获得一个InputSource对象用于传入形参JinShanContentHandler contentHandler = new JinShanContentHandler();xmlParser.parseJinShanXml(contentHandler, new InputSource(reader));wordValue = contentHandler.getWordValue();wordValue.setWord(searchedWord);}} catch (Exception e) {e.printStackTrace();}return wordValue;}}

再来一个单词MP3的播放类

package com.search;import java.io.InputStream;import com.entity.WordValue;
import com.internet.NetOperator;
import com.util.Dict;
import com.util.FileUtils;import android.content.Context;
import android.media.MediaPlayer;
import android.net.Uri;public class Mp3Player {public final static String MUSIC_ENG_RELATIVE_PATH = "CET4/sounds/sounds_EN/";public final static String MUSIC_USA_RELATIVE_PATH = "CET4/sounds/sounds_US/";public final static int ENGLISH_ACCENT = 0;public final static int USA_ACCENT = 1;public Context context = null;public String tableName = null;public MediaPlayer mediaPlayer = null;FileUtils fileU = null;Dict dict = null;public boolean isMusicPermitted = true; // 用于对是否播放音乐进行保护性设置,当该变量为false时,可以阻止一次音乐播放public Mp3Player(Context context, String tableName) {this.context = context;this.tableName = tableName;fileU = new FileUtils();dict = new Dict(context, tableName);isMusicPermitted = true;}/*** 首先先看一下SD卡上有没有,若有则播放,没有执行下一步* 看一下dict表中有没有单词的记录,若有,看一下发音字段是不是有美式发音或英式发音,若无则退出 若没有字段记录,访问网络下载Mp3然后播放* 一个Activity中一般只能有一个Voice成员变量,对应的也就只有一个MediaPlayer对象,这样才能对播放 状态进行有效控制* 该方法原则上只能在线程中调用* * @param word* @param accent*/public void playMusicByWord(String word, int accent, boolean isAllowedToUseInternet, boolean isPlayRightNow) {if (word == null || word.length() <= 0)return;char[] wordArray = word.toCharArray();char initialCharacter = wordArray[0];String path = null;String pronUrl = null;WordValue w = null;if (accent == ENGLISH_ACCENT) {path = MUSIC_ENG_RELATIVE_PATH;} else {path = MUSIC_USA_RELATIVE_PATH;}if (fileU.isFileExist(path + initialCharacter + "/", "-$-" + word + ".mp3") == false) {if (isAllowedToUseInternet == false)return;// 为了避免多次多个线程同时访问网络下载同一个文件,这里加了这么一个控制变量if (dict.isWordExist(word) == false) { // 数据库中没有单词记录,从网络上进行同步if ((w = dict.getWordFromInternet(word)) == null) {return;}dict.insertWordToDict(w, true);} // 能走到这一步说明从网上同步成功,数据库中一定存在单词记录if (accent == ENGLISH_ACCENT) {pronUrl = dict.getPronEngUrl(word);} else {pronUrl = dict.getPronUSAUrl(word);}if (pronUrl == null || pronUrl == "null" || pronUrl.length() <= 0)return; // 这说明网络上也没有对应发音,故退出// 得到了Mp3地址后下载到文件夹中然后进行播放InputStream in = null;in = NetOperator.getInputStreamByUrl(pronUrl);if (in == null)return;if (fileU.saveInputStreamToFile(in, path + initialCharacter + "/", "-$-" + word + ".mp3") == false)return;}// 走到这里说明文件夹里一定有响应的音乐文件,故在这里播放if (isPlayRightNow == false)return;/*** 这个方法存在缺点,可能因为同时new 了多个MediaPlayer对象,导致start方法失效,* 因此解决的方法是,使用同一个MediaPlayer对象,若一次播放时发现对象非空,那么先* 调用release()方法释放资源,再重新create*/if (isMusicPermitted == false) {return;}try {if (mediaPlayer != null) {if (mediaPlayer.isPlaying())mediaPlayer.stop();mediaPlayer.release();mediaPlayer = null; // 为了防止mediaPlayer多次调用stop release,这里置空还是有必要}mediaPlayer = MediaPlayer.create(context,Uri.parse("file://" + fileU.getSDRootPath() + path + initialCharacter + "/-$-" + word + ".mp3"));mediaPlayer.start();} catch (Exception e) {mediaPlayer.release();e.printStackTrace();}}}

有了以上类就可以得到数据了,之后将数据存入数据库中..上面每一个类都有判断在数据库的表中是否存在,数据库在上一篇中已经完成,至此下载数据就已经完成,接下来就是显示.

首先布局文件

activity_search.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><LinearLayout
        android:id="@+id/adLayout"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal" ></LinearLayout><ScrollView
        android:id="@+id/sv_intercept"android:layout_width="match_parent"android:layout_height="wrap_content" ><LinearLayout
            android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical" ><include layout="@layout/search_record" /><include layout="@layout/search_search" /><View
                android:id="@+id/view_scroll_flag"android:layout_width="match_parent"android:layout_height="1dp" /><include layout="@layout/search_pronounce" /><include layout="@layout/search_meaning" /><include layout="@layout/search_eg" /></LinearLayout></ScrollView></LinearLayout>

我在其中用了很多include,这样可以让布局文件变得更清晰.

有关流式查询记录的布局(下一篇会介绍)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" ><com.search.FlowLayout
        android:id="@+id/id_flowlayout"android:layout_width="fill_parent"android:layout_height="wrap_content"android:background="@drawable/record_bg"android:padding="20dp" ></com.search.FlowLayout></RelativeLayout>

查询块:
search_search.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="42dp"android:layout_marginLeft="40dp"android:layout_marginRight="30dp"android:layout_marginTop="40dp"android:focusable="true"android:focusableInTouchMode="true" ><ImageButton
        android:id="@+id/image_btn_search"android:layout_width="45dp"android:layout_height="match_parent"android:layout_alignParentRight="true"android:background="@android:color/transparent"android:src="@android:drawable/ic_menu_search" /><EditText
        android:id="@+id/edit_text_search"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_toLeftOf="@id/image_btn_search"android:layout_weight="1"android:gravity="center_vertical"android:hint="请在此输入单词"android:imeOptions="actionSearch"android:inputType="text"android:maxLines="1"android:paddingLeft="10dp"/></RelativeLayout>

发音块:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical" ><LinearLayout
        android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><TextView
            android:id="@+id/tv_word"android:layout_width="0dp"android:layout_height="40dp"android:layout_marginBottom="3dp"android:layout_marginLeft="22dp"android:layout_marginRight="22dp"android:layout_marginTop="36dp"android:layout_weight="1"android:gravity="bottom"android:textColor="#3B3C3D"android:textSize="24sp"android:textStyle="bold" /><Button
            android:id="@+id/image_btn_add_to_wordlist"android:layout_width="30dp"android:layout_height="30dp"android:layout_marginRight="30dp"android:layout_marginTop="10dp"android:background="@android:color/transparent"android:scaleType="fitXY"android:text="☆" /></LinearLayout><RelativeLayout
        android:id="@+id/phonetic_bar"android:layout_width="match_parent"android:layout_height="40dp"android:layout_below="@id/tv_word"android:layout_marginLeft="22dp" ><ImageButton
            android:id="@+id/image_btn_pronounce_eng"android:layout_width="30dp"android:layout_height="match_parent"android:layout_marginBottom="7dp"android:layout_marginTop="7dp"android:background="@android:color/transparent"android:scaleType="fitCenter"android:src="@drawable/pronounce" /><TextView
            android:id="@+id/tv_phosymbol_eng"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_toRightOf="@id/image_btn_pronounce_eng"android:gravity="center_vertical"android:text="英[]"android:textColor="#6C6C6C"android:textSize="14sp" /><TextView
            android:id="@+id/text_dict_phosymbol_divider"android:layout_width="50dp"android:layout_height="match_parent"android:layout_toRightOf="@id/tv_phosymbol_eng"android:gravity="center"android:text="/"android:textColor="#6C6C6C"android:textSize="14sp" /><ImageButton
            android:id="@+id/image_btn_pronounce_usa"android:layout_width="50dp"android:layout_height="match_parent"android:layout_marginBottom="7dp"android:layout_marginTop="7dp"android:layout_toRightOf="@id/text_dict_phosymbol_divider"android:background="@android:color/transparent"android:scaleType="fitCenter"android:src="@drawable/pronounce" /><TextView
            android:id="@+id/tv_phosymbol_usa"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_toRightOf="@id/image_btn_pronounce_usa"android:gravity="center_vertical"android:text="美[]"android:textColor="#6C6C6C"android:textSize="14sp" /></RelativeLayout></LinearLayout>

发音块:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical" ><LinearLayout
        android:id="@+id/dict_interpret_divider"android:layout_width="match_parent"android:layout_height="20dp"android:layout_marginLeft="10dp"android:orientation="horizontal" ><TextView
            android:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center_vertical"android:text="基本释义"android:textColor="#00A2DC"android:textSize="14sp" /></LinearLayout><TextView
        android:id="@+id/tv_meaning"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/dict_interpret_divider"android:layout_margin="10dp"android:background="@drawable/layer_list_dict_item_back"android:lineSpacingMultiplier="1.2"android:padding="12dp"android:text=""android:textColor="#3C3C3C"android:textSize="14sp" /></LinearLayout>

例句块:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical" ><LinearLayout
        android:id="@+id/dict_sentence_divider"android:layout_width="match_parent"android:layout_height="20dp"android:layout_marginLeft="10dp"android:orientation="horizontal" ><LinearLayout
            android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="2" ><TextView
                android:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center_vertical"android:text="例句"android:textColor="#00A2DC"android:textSize="14sp" /></LinearLayout><RelativeLayout
            android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1" ><TextView
                android:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="bottom"android:text="supported by iCIBA"android:textColor="#6C6C6C"android:textSize="10sp" /></RelativeLayout></LinearLayout><com.search.EgListView
        android:id="@+id/listview_eg"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:layout_marginTop="10dp"android:divider="#8C8C8C"android:dividerHeight="0px"android:padding="12dp" ></com.search.EgListView></LinearLayout>

布局文件中并没有特殊之处,整体就是一个scrollview上面放了乱七八糟一堆控件和一个自定义Listview.
下一章:自定义listview和历史记录的流式自定义布局

天天背单词--的设计与实现(四)相关推荐

  1. 天天背单词--的设计与实现(一)

    博客第一天,就用这个背单词软件探探路,经过二十天左右的努力,终于一个还算bug少一点的版本完成了,现在这款应用已在百度91安卓市场上架,毕竟开发者只有我,苦逼到图片都要现学ps自己做,所以维护也并不会 ...

  2. c语言背单词系统刘小飞,C语言背单词课程设计报告(软件工程).doc

    C语言背单词课程设计报告(软件工程) 三亚学院 <C语言程序设计>课程设计 题 目 背单词 专 业 软件工程 班 级 1101 学 生 龚方盛 周艺冠 学 号 1110750064 111 ...

  3. 背单词软件-设计与实现

    背单词软件-设计与实现 2014-08-28 源代码下载:Code-ReciteWord.zip 三层结构 数据访问层 业务逻辑层 表现层 数据结构 永久层 业务逻辑层 难点与解决方案 Recite的 ...

  4. 基于tkinter库python背单词GUI设计——单词越背越开心

    根据本人背单词的习惯开发的小程序 复制单词信息:格式参考输入栏自带的内容 读取单词,按键1,按此顺序显示在LABEL上 剩下的自己探索吧 每次背单词都要打开编译软件很麻烦,可以试试tkinker打包直 ...

  5. 利用Python设计一个简易的背单词软件

    设计背单词软件 设计背单词软件,功能如下: 1.可录入单词,输入英文单词及相应的汉语意思,如: China 中国 pencil 铅笔 可查找单词的汉语或者英语含义(输入中文查英文含义,输入英文查汉语含 ...

  6. C语言实现背单词软件(系统级别)

    目录 一.软件需求说明书 1 引言 2 任务概述 二.可行性研究报告 1 编写目的 2 所建议的系统(技术可行性) 3 使用方面的可行性 4 结论 三.系统设计说明书 1.面向对象设计 1.1前提说明 ...

  7. Android的背单词软件

    基于Android的背单词软件设计与实现 emmmm 本系统带程序说明书   有需要的可以去我上传的资源里面找,找不到的话,评论我,或者站内私信留下邮箱, 我看到机会给你发,也可以主动联系我博客名. ...

  8. C++课程设计——背单词程序

    C++课程设计--背单词程序 设计要求 设计一背单词程序,程序以菜单方式工作,字典使用文本文件存放就可以了.使之能提供以下功能:添加新词 支持顺序测验和随机测验 记录没背过的单词 查找单词的汉语或英语 ...

  9. 【英语四六级-必背单词】高中英语单词 (F)-MP3试听与下载

    [英语四六级-必背单词] F 单词试听与下载:高中英语单词(F) MP3试听与下载 Female n. 女(的) face [feɪs]n. 脸 vt. 面向:面对 facial [ˈfeɪʃ(ə)l ...

  10. 微信小程序| 打造ChatGPT英语四六级背单词小程序

    一.需求背景 学英语,最大的痛苦莫过于背单词! 不知道你平时都是用什么方式在背单词呢?硬啃单词书?字典?还是说各类的背单词APP来回跳转? 不可否认的是,单词一两遍完全记不住,没有个三四五六七八遍,都 ...

最新文章

  1. 畅捷通携手易后台,专注小微企业财税服务
  2. 【C++】20. const char *str[]、指针的字节长度等 分析
  3. Spring学习(三)Spring AOP 简介
  4. js将时间戳格式化为HH:ii:ss的格式
  5. like左匹配索引失效_Mysql索引失效的情况
  6. python数字排序 循环_【python-leetcode448-循环排序】找到所有数组中消失的数字
  7. 大数据平台之初体验 | 网易猛犸 | 数据仓库、调度系统、数据质量、离线与实时计算应有尽有。
  8. gdb 打印所有线程堆栈
  9. 在安卓模拟器(mumu为例)上联调app并且用Charles抓包
  10. 解决base64解码乱码问题
  11. 游戏手柄(JoyStick)的延时处理
  12. ChemDraw教程之怎么连接ChemDraw结构
  13. Python 实现分离GIF图片,-pillow
  14. 使用移动云MAS HTTP接口发送短信BASE64加密中文乱码
  15. 自监督学习在计算机视觉中的应用
  16. Python编程PTA题解——一帮一学习小组
  17. 电子制造业如何快速回复客户订单交期?
  18. 创建多线程有几种方法?如何创建线程?
  19. WordArt怎样生成中文词云?
  20. Java 根据时间戳计算星座

热门文章

  1. Docker Redis远程主机强迫关闭了一个现有的连接
  2. ASML公司Q3季度营收27.9亿欧元
  3. FPGA 名词解释(FPGA WORD EXPLANATION )
  4. 中国标准时间、标准时间、时间戳时间格式转换
  5. c#拼图碎片形状_1-3拼图碎片
  6. web开发网页嵌入flash
  7. “枪型思维”产品设计新探索 | 基金持仓诊断
  8. 任天堂游戏 html5,任天堂Switch游戏销量排行Top40,赶快收藏跟着买就对啦!
  9. Unity3D中隐藏与显示物体的方法
  10. 【转】鼠标右键多余菜单清理