学习Andriod之乐学成语的实现
2016-06-10 17:42
417 查看
一.简要说明一下该小程序的功能。主要有学习、搜索、收藏和帮助四个主页面
实现过程:
在已有数据库的情况下,通过DBOpenHelper类实现将数据库idioms到入data/data/<package name>/databases/目录下
public class DBOpenHelper { private final int BUFFER_SIZE=400000;//缓冲区大小
public static final String DB_NAME="idioms.db";//保存的数据库文件名
public static final String PACKAGE_NAME="cn.edu.bztc.happyidiom";//应用包名
public static final String DB_PATH = "/data"
+ Environment.getDataDirectory().getAbsolutePath() + "/"
+ PACKAGE_NAME + "/databases";//在手机里存放数据库的位置
private Context context;
public DBOpenHelper(Context context) {
this.context=context;
}
public SQLiteDatabase openDatabase(){
try {
File myDataPath=new File(DB_PATH);
if(!myDataPath.exists()){
myDataPath.mkdirs();//如果没有这个目录则创建
}
String dbfile=myDataPath+"/"+DB_NAME;
if(!(new File(dbfile).exists())){//判断数据库文件是否存在,若不存在则执行导入,否则直接打开数据库
InputStream is =context.getResources().openRawResource(R.raw.idioms);
FileOutputStream fos=new FileOutputStream(dbfile);
byte[]buffer=new byte[BUFFER_SIZE];
int count=0;
while((count=is.read(buffer))>0){
fos.write(buffer, 0, count);
}
fos.close();
is.close();
}
SQLiteDatabase db=SQLiteDatabase.openOrCreateDatabase(dbfile, null);
return db;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
首先是初始页面:WelcomeActivity
主要代码为:
然后跳转到MainActivity所对应的布局
然后是各个功能的实现:
convertView这个参数可以将加载好的布局进行缓存,如果convertView为空,则用LayoutInflater去加载布局,
否则直接对convertView进行重用。
定义一个ViewHolder内部类,对控件实例进行缓存,当convertView为空时,创建一个ViewHolder对象,并将控件的实例都存放在ViewHolder里,
然后调用View的setTag()方法存储ViewHolder对象。当convertView不为空时,调用View的getTag()方法去除ViewHolder对象。
在StudyActivity里通过findviewById获取ListView控件,通过setOnItemClickListener()方法来监听,当用户点击ListView的任何一个子项时会回调OnItemClick()方法,在这个方法中可通过参数position判断用户点击哪一个子项,利用switch-case-defalut实现跳转到相应类成语Activity
主要代码如下
在res目录下建立anim目录,分别建立anim_listview.xml文件和anim_layout_listview.xml使得载入页面出现淡入淡出效果。
anim_listview.xml
StudyActivity对应xml文件
相应Activity里主要功能是每一项当点击时会显示该成语详细信息的出对话框
AnimalActivity的主要代码
搜索功能的实现:
SearchActivity
setContentView(R.layout.search);
search_edit=(AutoClearEditText) findViewById(R.id.search_edit);
search=(ImageButton) findViewById(R.id.search);
myWebView1=(WebView) findViewById(R.id.myWebView1);
search.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String strURI = (search_edit.getText().toString());
strURI = strURI.trim();
if(strURI.length()==0)
{
Toast.makeText(SearchActivity.this, "查询内容不能为空!", Toast.LENGTH_LONG).show();
}
else
{
String strURL = "http://dict.youdao.com/m/search?keyfrom=dict.mindex&q="+strURI;
myWebView1.loadUrl(strURL);
}
}
});
}
GuessActivity主要实现猜谜语功能:
其余代码与其他Adapter相同
点击查看答案:利用Toast显示答案
实现收藏功能
建立OpenHelper类继承SQLiteOpenHelper通过它的onCreate()方法创建saveWordListTable表和自定义方法
主要代码如下:
主要功能是当点击
时显示
可加入收藏夹
主要实现代码:在AnimalAdapter中加入该段代码
注意:继承ListActivity时相对应的save.xml文件里id要用andriod系统自带id
SaveActivity对应的xml文件
实现的收藏效果是:
实现该项目是出现的错误:http://blog.csdn.net/lyanyun_520/article/details/51627556
实现过程:
在已有数据库的情况下,通过DBOpenHelper类实现将数据库idioms到入data/data/<package name>/databases/目录下
public class DBOpenHelper { private final int BUFFER_SIZE=400000;//缓冲区大小
public static final String DB_NAME="idioms.db";//保存的数据库文件名
public static final String PACKAGE_NAME="cn.edu.bztc.happyidiom";//应用包名
public static final String DB_PATH = "/data"
+ Environment.getDataDirectory().getAbsolutePath() + "/"
+ PACKAGE_NAME + "/databases";//在手机里存放数据库的位置
private Context context;
public DBOpenHelper(Context context) {
this.context=context;
}
public SQLiteDatabase openDatabase(){
try {
File myDataPath=new File(DB_PATH);
if(!myDataPath.exists()){
myDataPath.mkdirs();//如果没有这个目录则创建
}
String dbfile=myDataPath+"/"+DB_NAME;
if(!(new File(dbfile).exists())){//判断数据库文件是否存在,若不存在则执行导入,否则直接打开数据库
InputStream is =context.getResources().openRawResource(R.raw.idioms);
FileOutputStream fos=new FileOutputStream(dbfile);
byte[]buffer=new byte[BUFFER_SIZE];
int count=0;
while((count=is.read(buffer))>0){
fos.write(buffer, 0, count);
}
fos.close();
is.close();
}
SQLiteDatabase db=SQLiteDatabase.openOrCreateDatabase(dbfile, null);
return db;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
首先是初始页面:WelcomeActivity
主要代码为:
setContentView(R.layout.activity_welcome); RelativeLayout layoutWelcome=(RelativeLayout) findViewById(R.id.layoutWelcome); AlphaAnimation alphaAnimation=new AlphaAnimation(0.0f,1.0f); alphaAnimation.setDuration(2000); layoutWelcome.startAnimation(alphaAnimation); alphaAnimation.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationRepeat(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationEnd(Animation animation) { // TODO Auto-generated method stub Intent intent=new Intent(WelcomeActivity.this,MainActivity.class); startActivity(intent); finish(); } }
然后跳转到MainActivity所对应的布局
MainActivity主要代码:
requestWindowFeature(Window.FEATURE_NO_TITLE);//取消标题栏要写在setContentview();
tabHost=getTabHost();//通过getHost()方法获取整个TabHost控件 addTab("study",R.string.title_study,R.drawable.study,StudyActivity.class);//调用自定义的addTab方法添加选项卡,点击每个选项卡分别跳到不同的Activity addTab("search",R.string.title_search,R.drawable.search,SearchActivity.class); addTab("game",R.string.title_game,R.drawable.game,GuessActivity.class); addTab("save",R.string.title_save,R.drawable.save,SaveActivity.class); addTab("help",R.string.title_help,R.drawable.help,StudyActivity.class); }
private void addTab(String tag,int title_introduction,int title_icon,Class ActivityClass) { tabHost.addTab(tabHost .newTabSpec(tag) .setIndicator(getString(title_introduction), getResources().getDrawable(title_icon)) .setContent(new Intent(this,ActivityClass))); } 效果如下:
然后是各个功能的实现:
学习页面功能的实现:
主要使用ListView控件,先为每一项建立适配器,显示成语类别, 相应种类的适配器与该适配器建立差不多,具体ListView适配器建法如下:
public class CategoryAdapter extends ArrayAdapter<Category>{ private int resourceId; public CategoryAdapter(Context context, int textViewResourceId, List<Category> objects) { super(context, textViewResourceId, objects); this.resourceId=textViewResourceId; } @Override public View getView(int position, View convertView, ViewGroup parent) { Category category=getItem(position);//获取当前Category实例 View view; ViewHolder viewHolder; viewHolder=new ViewHolder(); if(convertView==null){ view=LayoutInflater.from(getContext()).i d230 nflate(resourceId, null); viewHolder.categoryImage=(ImageView) view.findViewById(R.id.category_image); viewHolder.categoryName=(TextView) view.findViewById(R.id.category_name); view.setTag(viewHolder);//将viewHolder存储在view中 }else{ view=convertView; viewHolder= (ViewHolder) view.getTag();//重新获取viewHolder } viewHolder.categoryImage.setImageResource(category.getImageId()); viewHolder.categoryName.setText(category.getName()); return view; } } class ViewHolder{ ImageView categoryImage; TextView categoryName; }
convertView这个参数可以将加载好的布局进行缓存,如果convertView为空,则用LayoutInflater去加载布局,
否则直接对convertView进行重用。
定义一个ViewHolder内部类,对控件实例进行缓存,当convertView为空时,创建一个ViewHolder对象,并将控件的实例都存放在ViewHolder里,
然后调用View的setTag()方法存储ViewHolder对象。当convertView不为空时,调用View的getTag()方法去除ViewHolder对象。
在StudyActivity里通过findviewById获取ListView控件,通过setOnItemClickListener()方法来监听,当用户点击ListView的任何一个子项时会回调OnItemClick()方法,在这个方法中可通过参数position判断用户点击哪一个子项,利用switch-case-defalut实现跳转到相应类成语Activity
主要代码如下
initCategories(); CategoryAdapter categoryAdapter=new CategoryAdapter(this, R.layout.category_item, categoryList); ListView listView=(ListView) findViewById(R.id.lvCategories); listView.setAdapter(categoryAdapter);//将categoryAdapter作为适配器传递给ListView listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { switch(position){ case 0: Intent intent= new Intent(StudyActivity.this,StudyAnimalActivity.class); startActivity(intent); break; case 1: Intent intent1= new Intent(StudyActivity.this,StudyNatureActivity.class); startActivity(intent1); break; default: break; } } }); }
在res目录下建立anim目录,分别建立anim_listview.xml文件和anim_layout_listview.xml使得载入页面出现淡入淡出效果。
anim_listview.xml
<?xml version="1.0" encoding="utf-8"?> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000"//动画时间 android:fromAlpha="0.0" android:toAlpha="1.0"> </alpha>anim_layout_listview.xml
<?xml version="1.0" encoding="utf-8"?> <layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android" android:animation="@anim/anim_listview" android:animationOrder="random" android:delay="0.2"> </layoutAnimation>
StudyActivity对应xml文件
<?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" android:background="@drawable/bg_ling" tools:content=".StudyActivity" > <ListView android:id="@+id/lvCategories" android:layout_width="match_parent" android:layout_height="wrap_content" android:layoutAnimation="@anim/anim_layout_listview"//使得页面出现淡入淡出效果 android:listSelector="#00000000" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" > </ListView> </RelativeLayout>
相应Activity里主要功能是每一项当点击时会显示该成语详细信息的出对话框
AnimalActivity的主要代码
public class StudyAnimalActivity extends Activity{ private List<Animal> animalList; private AnimalDao animalDao; private ListView lvAnimalList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_animal); lvAnimalList=(ListView) findViewById(R.id.lvAnimalList); initAnimals(); AnimalAdapter animalAdapter=new AnimalAdapter(this, R.layout.animal_item, animalList); lvAnimalList.setAdapter(animalAdapter); lvAnimalList.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { Animal animal=animalList.get(position); String result=animal.getName()+"\n"+animal.getPronounce()+ "\n【解释】"+animal.getExplain()+ "\n【近义词】"+animal.getHomoionym()+ "\n【反义词】"+animal.getAntonym()+ "\n【出处】"+animal.getDerivation()+ "\n【示例】"+animal.getExamples(); DialogUtil.showDialog(result, StudyAnimalActivity.this); } }); } private void initAnimals() { animalDao=AnimalDao.getInstance(this); animalList=animalDao.getAllAnimals(); }
对话框的实现:
public class DialogUtil { public static void showDialog(String result,Context context){ AlertDialog.Builder builder=new AlertDialog.Builder(context); LayoutInflater layoutInflater=LayoutInflater.from(context); View view=layoutInflater.inflate(R.layout.dialog_info, null); builder.setView(view); TextView tvIdiomInfo= (TextView) view.findViewById(R.id.tvIdiomInfo); tvIdiomInfo.setText(result); builder.setPositiveButton("确定",new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.create().show(); } }
搜索功能的实现:
SearchActivity
setContentView(R.layout.search);
search_edit=(AutoClearEditText) findViewById(R.id.search_edit);
search=(ImageButton) findViewById(R.id.search);
myWebView1=(WebView) findViewById(R.id.myWebView1);
search.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String strURI = (search_edit.getText().toString());
strURI = strURI.trim();
if(strURI.length()==0)
{
Toast.makeText(SearchActivity.this, "查询内容不能为空!", Toast.LENGTH_LONG).show();
}
else
{
String strURL = "http://dict.youdao.com/m/search?keyfrom=dict.mindex&q="+strURI;
myWebView1.loadUrl(strURL);
}
}
});
}
GuessActivity主要实现猜谜语功能:
</pre><p></p><p><span style="font-size:14px;">Guess.xml文件主要还是利用ListView控件</span></p><p><span style="font-size:14px;">实现该功能Activity里主要还是和StudyActivity里的代码相同</span></p><p><span style="font-size:18px;">GuessAdapter 主要代码</span></p><p><span style="font-size:18px;"></span></p><pre name="code" class="html">viewHolder4.btnSee.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { toast=Toast.makeText(context, "答案是:" + guess.getName(),Toast.LENGTH_LONG); toast.setGravity(Gravity.BOTTOM, 0, -300); LinearLayout toastView =(LinearLayout) toast.getView(); ImageView image=new ImageView(context); image.setImageResource(R.drawable.dialog_icon); toastView.addView(image, 0); toast.show(); } });
其余代码与其他Adapter相同
点击查看答案:利用Toast显示答案
实现收藏功能
建立OpenHelper类继承SQLiteOpenHelper通过它的onCreate()方法创建saveWordListTable表和自定义方法
主要代码如下:
<pre name="code" class="html">public class DBHelper extends SQLiteOpenHelper {//直接在Andriod中创建数据库和表 public static final String saveWordListTable = "saveWordListTable"; public static final String wordID = "wordID"; public static final String wordName = "wordName"; public static final String wordPronunciation = "wordPronunciation"; public static final String wordExplain = "explain"; public static final String CREATE_SAVE="create table saveWordListTable(" + "wordID integer ," + "wordName text," + "wordPronunciation varchar)"; public DBHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); this.getWritableDatabase(); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_SAVE);//创建数据库的同时创建表 } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } public void addAttentionWord(int wordId,String wordName,String wordPronunciation) { ContentValues values = new ContentValues(); values.put(DBHelper.wordID ,wordId); values.put(DBHelper.wordName ,wordName); values.put(DBHelper.wordPronunciation ,wordPronunciation); this.getWritableDatabase().insert( DBHelper.saveWordListTable, null, values); } public ArrayList<Word> QueryAllAttentionWord(){ SQLiteDatabase db = this.getReadableDatabase(); ArrayList<Word> List= new ArrayList<Word>(); Cursor cursor =db.rawQuery("select * from saveWordListTable",null); if (cursor.moveToFirst()){ do{ Word word=new Word(); word.setWordId(cursor.getInt(0)); word.setWordName(cursor.getString(1)); word.setWordPronunciation(cursor.getString(2)); List.add(word); } while(cursor.moveToNext()); } cursor.close(); db.close(); return List; } public void deleteAttentionWord(int wordId) { SQLiteDatabase db = this.getReadableDatabase(); String sql = "delete from saveWordListTable" + " where wordID="+"'"+wordId+"'"; db.execSQL(sql); db.close(); } }
主要功能是当点击
时显示
可加入收藏夹
主要实现代码:在AnimalAdapter中加入该段代码
viewHolder1.btnSave.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Dialog dialog = new AlertDialog.Builder(context) .setTitle("收藏") .setMessage("确定要将该成语添加入收藏夹吗?") .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { /* User clicked OK so do some stuff */ dbHelper.addAttentionWord(list.get(position).getId()//将数据保存在表里 , list.get(position).getName() , list.get(position).getPronounce()); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { /* User clicked OK so do some stuff */ } }).create(); dialog.show();SaveActivity中实现代码为:
public class SaveActivity extends ListActivity{ private DBHelper dbHelper; private ArrayList<Word> list=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setTitle("收藏夹"); this.setContentView(R.layout.save); setAdapter(); } private void setAdapter() { dbHelper=new DBHelper(SaveActivity.this, "saveidioms.db", null, 1); list=dbHelper.QueryAllAttentionWord(); ArrayList<String> showlist=new ArrayList<String>(); for(int i=0;i<list.size();i++){ showlist.add((i+1)+"."+list.get(i).getWordName()+"\n"+list.get(i).getWordPronunciation()); } this.setListAdapter(new ArrayAdapter<String>(this, R.layout.save_item, showlist)); } @Override protected void onListItemClick(ListView l, View v, final int position, long id) { super.onListItemClick(l, v, position, id); Dialog dialog = new AlertDialog.Builder(SaveActivity.this) .setTitle("操作") .setItems(new String[]{"成语删除"}, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Word word = list.get(position); DBHelper md = new DBHelper(SaveActivity.this, "saveidioms.db", null, 1); Log.e("成语", "id = "+word.getWordId()+" name = "+word.getWordName()+" meaning = "+ word.getWordPronunciation()); md.deleteAttentionWord(word.getWordId()); setAdapter(); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }) .create(); dialog.show(); } }
注意:继承ListActivity时相对应的save.xml文件里id要用andriod系统自带id
SaveActivity对应的xml文件
<pre name="code" class="html"><?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" android:background="#ffffff" > <TextView android:id="@+id/tv_Title" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="25sp" android:text="收藏夹" android:background="@drawable/header" /> <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout>
实现的收藏效果是:
实现该项目是出现的错误:http://blog.csdn.net/lyanyun_520/article/details/51627556
相关文章推荐
- Ubuntu の Python-Web框架Django 环境安装 V1.1
- RxJava Hello World
- Java goto 关键字
- 桥接模式
- [线性常微分方程][10]UNDAMPED FORCING AND RESONANCE
- bzoj3339 rmq problem (range mex query)
- 迭代加深搜索 codevs 2541 幂运算
- iOS数组排列
- 上幼儿园
- 分布式一致性
- 《JavaScript DOM 编程艺术》读书笔记
- javaScript知识点总结(必看篇)
- 升级ubuntu,apt-get update出现Hash Sum mismatch
- Sql Server系统数据库的作用
- 【OC刨根问底】Runtime简单粗暴理解
- 【自定义View】01--常用工具介绍
- Java工作原理
- 有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?
- maven_创建quickstart模板时异常
- [TypeScript] Understanding Decorators