android英语字典(源代码),android英语字典(内含源码哦)英⽂词典是⼿机中经常使⽤的应⽤。因此,在本⽂将结合Android来讨论如何实现⼀个Android版的英⽂词典。实现英⽂词典的⽅法很多。在本⽂使⽤了SQLite数据库来保存英⽂单词信息。系统通过SQLite数据库中保存的单词信息来查到与指定英⽂对应的中⽂信息。
实现电⼦词典要解决的技术问题及初步的解答。
在本节将给出实现电⼦词典需要解决的主要技术问题,并给出这些技术问题的初步答案或提⽰。关于详细的答案和代码请读者参阅本⽂后⾯的内容。
主要技术问题及解答如下:
1.如何将SQLite数据库(dictionary.db⽂件)与apk⽂件⼀起发布?
解答:可以将dictionary.db⽂件复制到Eclipse Android⼯程中的resraw⽬录中,
2. 如何将打开resraw⽬录中的数据库⽂件?
解答:在Android中不能直接打开resraw⽬录中的数据库⽂件,⽽需要在程序第⼀次启动时将该⽂件复制到⼿机内存或SD卡的某个⽬录中,然后再打开该数据库⽂件。复制的基本⽅法是使⽤getResources().o
penRawResource⽅法获得resraw⽬录中资源的InputStream 对象,然后将该InputStream对象中的数据写⼊其他的⽬录中相应⽂件中。在Android SDK中可以使⽤
SQLiteDatabase.openOrCreateDatabase⽅法来打开任意⽬录中的SQLite数据库⽂件。
3.如果在AutoCompleteTextView组件中输⼊两个及以上字母时显⽰以所输⼊字符串开头的所有单词列表?
解答:AutoCompleteTextView所使⽤的Adapter是⼀个⾃定义的Adapter类,要注意的是,不能将整个数据库中的单词都查出,然后⽣成⼀个Adapter对象再使⽤setAdapter⽅法来设置AutoCompleteTextView组件的Adapter对象。AutoCompleteTextView组件不会为我们筛选以某个字符串开头的单词。这些⼯作需要开发⼈员通过编码来实现。基本思路是在AutoCompleteTextView类的afterTextChanged事件中监视AutoCompleteTextView组件中字符的输⼊情况,每当输⼊⼀个字符时就⽣成⼀个Adapter对象,然后将新⽣成的Adapter对象与AutoCompleteTextView关联。显⽰以输⼊字符串开头的单词列表的效果.
在本⽂实现的英⽂词典中使⽤openDatabase⽅法来打开数据库⽂件(该⽂件在SD卡的dictionary⽬录中,因此,要想运⾏本⽂实现的英⽂词典,需要在⼿机或模拟器中需要安装SD卡)。如果该⽂件不存在,系统会⾃动创建/sdcard/dictionary⽬录,并将resraw⽬录中的dictionary.db⽂件复制到/sdcard/dict
ionary⽬录中。openDatabase⽅法的实现代码如下:
privateSQLiteDatabase openDatabase() {try{//获得dictionary.db⽂件的绝对路径String databaseFilename= DATABASE_PATH + "/" +DATABASE_FILENAME; File dir= newFile(DATABASE_PATH);//如果/sdcard/dictionary⽬录中存在,创建这个⽬录 if
(!ists()) dir.mkdir();//如果在/sdcard/dictionary⽬录中不存在//dictionary.db⽂件,则从resraw⽬录中复制这个⽂件到//SD卡的⽬录(/sdcard/dictionary) if (!(newFile(databaseFilename)).exists()) {//获得封装dictionary.db⽂件的InputStream对象InputStream is=getResources().openRawResource(R.raw.dictionary); FileOutputStream fos=
newFileOutputStream(databaseFilename);byte[] buffer = newbyte[8192];int count = 0;//开始复制dictionary.db⽂件 while ((count = is.read(buffer)) > 0) { fos.write(buffer,0, count); } fos.close(); is.close(); }//打开/sdcard/dictionary⽬录中的dictionary.db⽂件SQLiteDatabase database=SQLiteDatabase.openOrCreateDatabase( databaseFilename,null);returndatabase; }catch(Exception e) { }returnnull; }在openDatabase⽅法中使⽤了⼏个常量,这些常量是在程序的主类(Main)中定义的,代码如下:publicclass Main extends Activity implementsOnClickListener, TextWatcher{privatefinal String DATABASE_PATH
=android.os.Environment .getExternalStorageDirectory().getAbsolutePath()+ "/dictionary";privatefinal String
DATABASE_FILENAME = "dictionary.db";... ...}
查询单词
英⽂词典的核⼼就是查英⽂单词的中⽂意思。在查中⽂意思之前,⾸先需要使⽤openDatabase⽅法在Main类的onCreate⽅法中打开SQLite数据库,代码如下:database = openDatabase();其中database是在Main类中定义的SQLiteDatabase类型变量。然后在查按钮的单击事件中添加如下的代码来查英⽂单词,并显⽰中⽂意思。
publicvoidonClick(View view) { String sql= "select chinese from t_words where english=?"; Cursor cursor=
database.rawQuery(sql, newString[] { Text().toString() }); String result= "未到该单词.";//如果查单词,显⽰其中⽂信息if (Count() > 0) {//必须使⽤moveToFirst⽅法将记录指针移动到第1条记录的位置 veToFirst(); result= ColumnIndex("chinese")); }//显⽰查询结果对话框 new AlertDialog.Builder(t
his).setTitle("查询结果").setMessage(result) .setPositiveButton("关闭", null).show(); }
讲到这⾥我们应该了解⼀个dictionary.db中的t_words表的结果,该表只有两个字段:english和chinese。分别表⽰单词的英⽂和中⽂描述。如果要获得单词的中⽂描述,只需要查chinese字段即可。如onClick⽅法中的代码所⽰。查询单词的效果如图3所⽰。如果显⽰以输⼊字符串开头的单词列表虽然到⽬前为⽌,我们的英⽂词典已经可以正常⼯作了,但为了⽅便读者使⽤,在本节将添加单词输⼊的⾃动提⽰功能。也就是说,如果读者在AutoCompleteTextView组件中输⼊单词的前⼏个字母,该组件就会⾃动列出数据库中所有以该字符串开头的单词。效果如图2所⽰。拥有这样的功能就可以使⽤户在只知道单词的前⼏个字母时也可以查到相应的单词。由于AutoCompleteTextView组件使⽤了⾃定义的Adapter类,下⾯先给出这个⾃定义的Adapter类的完整代码。
publicclass DictionaryAdapter extendsCursorAdapter {privateLayoutInflater layoutInflater; @OverridepublicCharSequence convertToString(Cursor cursor) {return cursor == null ? "": String(cursor .getColumnIndex("_id")); }//⽤于将_id字段(也就是english字段)的值设置TextView组件的⽂本//view参数表⽰⽤于显⽰列表项的TextView组件privatevoidsetView(View view, Cursor cursor) { TextView tvWordItem=(TextView) view;
tvWordItem.ColumnIndex("_id"))); } @OverridepublicvoidbindView
(View view, Context context, Cursor cursor) { setView(view, cursor); } @OverridepublicView newView(Context context, Cursor cursor, ViewGroup parent) { View view= layoutInflater.inflate(R.layout.word_list_item, null); setView(view, cursor);returnview; }public DictionaryAdapter(Context context, Cursor c, booleanautoRequery) {super(context, c, autoRequery);//通过系统服务获得LayoutInflater对象layoutInflater=(LayoutInflater) SystemService(Context.LAYOUT_INFLATER_SERVICE); } }
在编写DictionaryAdapter类时应注意如下3点:1. 为了将Cursor对象与AutoCompleteTextView组件绑定,DictionaryAdapter类必须从CursorAdapter类继承。2.由于CursorAdapter类中的convertToString⽅法直接返回了Cursor对象的地址,因此,在DictionaryAdapter类中必须覆盖convertToString⽅法,以返回当前选中的单词。CursorAdapter类中的convertToString⽅法的源代码。
public CharSequence convertToString(Cursor cursor)
{
//如果cursor不为null,返回Cursor对象的地址(String())
return cursor == null ? “” : String();}覆盖后的convertToToString⽅法的源代码如下:public CharSequence convertToString(Cursor cursor){
return cursor == null ? “” : String(cursor
.getColumnIndex(“_id”));}在这⾥要注意⼀下,当选中AutoCompleteTextView组件中单词列表中某⼀个单词后,系统会⽤convertToString⽅法的返回值来设置AutoCompleteTextView组件中的⽂本。因此,必须使⽤Cursor的getString来获得相应的字段值。3.由于将Cursor对象与Adapter绑定时必须要有⼀个叫“_id”的字段,因此,在本例中将english字段名映射成了“_id”字段。为了监视AutoCompleteTextView组件中的⽂本输⼊情况,需要实现TextWatcher接⼝。在该接⼝中只需要实现afterTextChanged⽅法即可,代码如下:
public voidafterTextChanged(Editable s) {//必须将english字段的别名设为_id Cursor cursor = database.rawQuery("select english as _id from t_words where english like ?",new String[]{ s.toString() + "%"}); DictionaryAdapter dictionaryAdapter= new DictionaryAdapter(this,cursor, true);//actvWord是在Main类中定义的AutoCompleteTextView类型的变量
actvWord.setAdapter(dictionaryAdapter); }
从上⾯的代码中可以看到,在查询SQL语句中的english字段名的别名是“_id”。4.在DictionaryAdapter类中需要使⽤bindView和newView⽅法设置每⼀个列表项。bindView⽅法负责设置已经存在的列表项,也就是该列表项已经⽣成了相应的组件对象。⽽newView⽅法负责设置新的列表项,在该⽅法中
需要创建⼀个View对象来显⽰当前的列表项。
在本例中使⽤word_l布局⽂件来显⽰每⼀个列表项,代码如下:
本⽂介绍了实现基于Android的英⽂词典的实现⽅法。实现英⽂词典主要需要解决3个问题:如何将保存英⽂单词的SQLite数据库⽂件随同apk⽂件⼀起发布;如何打开SD卡中的数据库⽂件;如何在AutoCompleteTextView组件显⽰以输⼊字符串开头的英⽂单词列表。在最后仍然要提⼀句的是在编写⾃定义DictionaryAdapter类时⼀定要覆盖contertToString⽅法,以便在⽤户选项某⼀个列表项时在AutoCompleteTextView组件中显⽰选中的单词,⽽不是Cursor对象地址。
eclipse android
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论