单词本设计与实现.docx
- 文档编号:6348315
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:19
- 大小:639.41KB
单词本设计与实现.docx
《单词本设计与实现.docx》由会员分享,可在线阅读,更多相关《单词本设计与实现.docx(19页珍藏版)》请在冰豆网上搜索。
单词本设计与实现
实验报告
课程名称移动应用开发________
实验项目单词本实现
实验仪器___________________________
系别
专业
班级/学号
学生姓名
实验日期_______________________
成绩_______________________
指导教师_______________________
一、实验目的
1.了解Android数据存储的基本概念;
2.理解并掌握SQLite数据库的使用方法;
3.进一步熟悉与掌握Fragment使用。
4.进一步熟悉各组件、适配器、菜单、对话框等相关概念和技术等。
5.掌握ContentProvider相关概念和技术。
6.掌握Handler相关概念和技术。
二、实验要求
1.课前预习实验内容,并查找相关资料。
2.按照实验步骤完成各个相关内容。
3.撰写实验报告。
a)实验报告格式必须符合学校要求(例如必须采用学校规定的实验封面);
b)写出实验详细步骤,包括主要采用的技术方案、相关分析和核心代码。
注意:
不要简单地近包括截屏和代码,完整代码可以作为附录放在实验报告结尾;
c)总结实验中遇到的问题、分析和解决方法。
d)写出心得体会与收获等。
三、实验内容
1.文件构成:
1)Java文件:
对应功能:
2)资源文件
包括:
Asset下的本地词库文件
背景定义文件
各个Activity和Fragment的Layout
对话框界面
各个List的Item定义
不同的菜单文件
数组、边界值、颜色值等
2.功能实现分析:
主界面:
侧滑:
主界面采用三个Fragment利用FragmentManager进行切换管理,默认的单词本Fragment是一个经过扩展的RecyclerView,可以实现左滑删除编辑,并且通过对Adapter的修改可以实现隐藏解释达到背单词的效果,也可以通过对数据加载的管理实现按字母或者按新旧排序。
搜索Fragment:
在App第一次进入时会对本地的txt进行加载,并放到Sqlite数据库中,在获取搜索的关键字后对数据库进行搜索并返回给ListView,点击ListViewde的item后根据单词链接有道API进行查询,并返回其读音和解释,点击添加则可以添加到单词列表。
翻译Fragment:
翻译功能利用有道Api提供的翻译接口进行翻译,可以实现中文和任意语言的互相转化。
新闻名言打开今日一句和BBC新闻
今日一句和BBC新闻两个都是获取Json解析得到,并放入对应的数据中。
3.核心代码:
1)修改对话框:
privatevoidInsertDialog(){
finalTableLayouttableLayout=(TableLayout)getActivity().getLayoutInflater().inflate(R.layout.insert,null);
newAlertDialog.Builder(context)
.setTitle("新增单词")//标题
.setView(tableLayout)//设置视图
//确定按钮及其动作
.setPositiveButton("确定",newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialogInterface,inti){
StringstrWord=((EditText)tableLayout.findViewById(R.id.txtWord)).getText().toString();
StringstrMeaning=((EditText)tableLayout.findViewById(R.id.txtMeaning)).getText().toString();
//既可以使用Sql语句插入,也可以使用使用insert方法插入
operate.Insert(strWord,strMeaning);
refreshList();
}
})
//取消按钮及其动作
.setNegativeButton("取消",newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialogInterface,inti){
}
})
.create()//创建对话框
.show();//显示对话框
}
2)Frgament切换:
privatevoidsetSelect(inti){
clearImageView();
manager=getSupportFragmentManager();
transaction=manager.beginTransaction();
hideFragment(transaction);
switch(i){
case0:
System.out.println("searchpressed");
search.setImageResource(R.mipmap.search_button_pressed);
if(search_fragment==null){
search_fragment=newSearchWord();
transaction.add(R.id.fragment_ui,search_fragment);
}else{
transaction.show(search_fragment);
}
break;
case1:
System.out.println("listpressed");
main.setImageResource(R.mipmap.list_button_pressed);
if(main_fragment==null){
main_fragment=newWordList();
transaction.add(R.id.fragment_ui,main_fragment);
}else{
transaction.show(main_fragment);
}
break;
case2:
System.out.println("bookpressed");
settings.setImageResource(R.mipmap.book_pressed);
if(setting_fragment==null){
setting_fragment=newTranslateFragment();
transaction.add(R.id.fragment_ui,setting_fragment);
}else{
transaction.show(setting_fragment);
}
break;
default:
break;
}
mit();
}
privatevoidhideFragment(FragmentTransactiontransaction2){
//TODOAuto-generatedmethodstub
if(search_fragment!
=null){
transaction2.hide(search_fragment);
}
if(main_fragment!
=null){
transaction2.hide(main_fragment);
}
if(setting_fragment!
=null){
transaction2.hide(setting_fragment);
}
}
3)JSON解析:
JSONObjectobject=newJSONObject(String.valueOf(jsonText));
JSONArrayrootArray=(JSONArray)object.get("data");
for(inti=0;i<7;i++){
Newsnews=newNews();
JSONObjectnow=rootArray.getJSONObject(i);
news.setTime(now.getString("publishDateStr"));
news.setContent(now.getString("content"));
news.setUrl(now.getString("url"));
news.setTitle(now.getString("title"));
if(now.getString("imageUrls")!
=null){
JSONArraypicarray=now.getJSONArray("imageUrls");
List
for(intj=0;j<1;j++){
Stringpic=(String)picarray.get(j);
Stringb="http:
//ichef.bbci.co.uk/news/500/";
pic=b+pic.substring(50,pic.length());
piclist.add(pic);
}
news.setPic_s((String)picarray.get(0));
news.setPics_url(piclist);
}
System.out.println("第"+i+"条新闻:
"+news.getTitle());
list.add(news);
4)获取JSON字符串:
Threadthread=newThread(newRunnable(){
@Override
publicvoidrun(){
BufferedReaderreader=null;
StringBuffersbf=newStringBuffer();
try{
SSLContextcontext=SSLContext.getInstance("SSL");
TrustManager[]trustManager={newmyX509TrustManager()};
context.init(null,trustManager,newSecureRandom());
SSLSocketFactoryssf=context.getSocketFactory();
URLurl=newURL(String.valueOf(urlstring));
HttpsURLConnectionconnection=(HttpsURLConnection)url.openConnection();
connection.setHostnameVerifier(newTrustAnyHostNameVerifier());
connection.setSSLSocketFactory(ssf);
connection.setRequestMethod("GET");
connection.connect();
InputStreamis=connection.getInputStream();
reader=newBufferedReader(newInputStreamReader(is,"UTF-8"));
StringstrRead=null;
while((strRead=reader.readLine())!
=null){
sbf.append(strRead);
sbf.append("\r\n");
}
reader.close();
result=sbf.toString();
}catch(Exceptione){
e.printStackTrace();
}
}
});
thread.start();
//等待上述线程完成执行后再返回jsonText。
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
5)Worlist的侧滑功能
privateSwipeMenuCreatorswipeMenuCreator=newSwipeMenuCreator(){
@Override
publicvoidonCreateMenu(SwipeMenuswipeLeftMenu,SwipeMenuswipeRightMenu,intviewType){
intwidth=getResources().getDimensionPixelSize(R.dimen.dp_70);
//1.MATCH_PARENT自适应高度,保持和Item一样高;
//2.指定具体的高,比如80;
//3.WRAP_CONTENT,自身高度,不推荐;
intheight=ViewGroup.LayoutParams.MATCH_PARENT;
//根据ViewType来决定哪一个item该如何添加菜单。
//这里模拟业务,实际开发根据自己的业务计算。
if(viewType%3==0){
SwipeMenuItemdeleteItem=newSwipeMenuItem(context)
.setBackground(R.drawable.selector_red)
.setText("删除")
.setTextColor(Color.WHITE)
.setWidth(width)
.setHeight(height);
swipeRightMenu.addMenuItem(deleteItem);//添加菜单到右侧。
SwipeMenuItemaddItem=newSwipeMenuItem(context)
.setBackground(R.drawable.selector_green)
.setText("编辑")
.setTextColor(Color.WHITE)
.setWidth(width)
.setHeight(height);
swipeRightMenu.addMenuItem(addItem);//添加菜单到右侧。
}
}
};
/**
*RecyclerView的Item的Menu点击监听。
*/
privateSwipeMenuItemClickListenermMenuItemClickListener=newSwipeMenuItemClickListener(){
@Override
publicvoidonItemClick(SwipeMenuBridgemenuBridge){
menuBridge.closeMenu();
intdirection=menuBridge.getDirection();//左侧还是右侧菜单。
intadapterPosition=menuBridge.getAdapterPosition();//RecyclerView的Item的position。
intmenuPosition=menuBridge.getPosition();//菜单在RecyclerView的Item中的Position。
if(direction==SwipeMenuRecyclerView.RIGHT_DIRECTION){
//Toast.makeText(MainActivity.this,"list第"+adapterPosition+";右侧菜单第"+menuPosition,Toast.LENGTH_SHORT).show();
if(menuPosition==1){
System.out.println("xiugai");
Toast.makeText(context,"修改",Toast.LENGTH_SHORT).show();
UpdatetDialog(String.valueOf(list.get(adapterPosition).getId()),list.get(adapterPosition).getWord_name(),list.get(adapterPosition).getWord_meaning());
//refreshList();
}
elseif(menuPosition==0){
System.out.println("shanchu");
Toast.makeText(context,"删除",Toast.LENGTH_SHORT).show();
operate.DeleteUseSql(String.valueOf(list.get(adapterPosition).getId()));
refreshList();
}
}
}
};
6)搜索中有道Api的调用:
privatevoidquery(Stringquery){
LanguagelangFrom=LanguageUtils.getLangByName("英文");
LanguagelangTo=LanguageUtils.getLangByName("中文");
TranslateParameterstps=newTranslateParameters.Builder()
.source("wordtest").from(langFrom).to(langTo).timeout(3000).build();//appkey可以省略
translator=Translator.getInstance(tps);
//showLoadingView("正在查询");
System.out.println("query"+query);
translator.lookup(query,newTranslateListener(){
@Override
publicvoidonResult(finalTranslateresult,Stringinput){
System.out.println("Result"+result.getQuery());
List
StringBuildersb=newStringBuilder();
sb.append("网络释义:
");
sb.append("\n");
if(explains!
=null){
for(WebExplains:
explains){
sb.append(s.getKey()).append(listStr(s.getMeans())).append("\n");
}
}
System.out.println("resu"+sb);
word_meaning.setText(sb);
word_voice.setVisibility(View.VISIBLE);
add_word.setVisibility(View.VISIBLE);
word_voice_text.setText(result.getUkPhonetic());
add_word.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
operate.Insert(word_name.getText().toString(),word_meaning_dict.getText().toString());
Toast.makeText(context,"添加:
"+word_name.getText().toString(),Toast.LENGTH_SHORT);
}
});
word_voice.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
MediaPlayermp=newMediaPlayer();
try{
createVoice();
System.out.println("loading.");
while(!
isfilefinish){
System.out.print(".");
}
mp.setDataSource("/sdcard/audio.mp3");
mediaPlayer=mp;
mediaPlayer.prepare();
mediaPlayer.start();
isfilefinish=false;
mediaPlayer.setOnCompletionListener(newMediaPlayer.OnCompletionListener(){
@Override
publicvoidonCompletion(MediaPlayermediaPlayer){
mediaPlayer.release();
System.out.println(DeleteVoice());
}
});
}
catch(Exceptione){
System.out.println(e);
}
}
});
}
@Override
publicvoidonError(TranslateErrorCodeerror){
Toast.makeText(context,"查询错误:
"+error.name().toString(),Toast.LENGTH_SHORT);
}
});
}
7)初始单词数据内容:
publicvoidcreate_word()throwsException{
SQLiteDatabasedb=mDbHelper.getWritableDatabase();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单词 设计 实现