Android之离线词典

1. 首先在res/raw中导入文件dictionary.db/Files/lee0oo0/dictionary.rar

2. main.xml文件的布局

<? xml version="1.0" encoding="utf-8" ?>
< LinearLayout  xmlns:android ="http://schemas.android.com/apk/res/android"
    android:orientation
="vertical"  android:layout_width ="fill_parent"
    android:layout_height
="fill_parent" >

     < AutoCompleteTextView  android:id ="@+id/actvWord"
        android:layout_width
="fill_parent"  android:layout_height ="wrap_content"
        android:layout_marginTop
="10dp"  android:singleLine ="true"   />
     < Button  android:id ="@+id/btnSelectWord"  android:layout_width ="wrap_content"
        android:layout_height
="wrap_content"  android:text ="查单词"   />

3. AutoCompleteTextView的每个textview下拉布局

<? xml version="1.0" encoding="utf-8" ?>
< TextView  xmlns:android ="http://schemas.android.com/apk/res/android"
    android:id
="@+id/tvWordItem"
    android:layout_width
="fill_parent"
    android:layout_height
="wrap_content"
    android:textAppearance
="?android:attr/textAppearanceLarge"
    android:gravity
="center_vertical"
    android:paddingLeft
="6dip"
    android:textColor
="#000"     
    android:minHeight
="?android:attr/listPreferredItemHeight" /> 
 

 

4. 主程序,都几乎带有注释

 package net.blogjava.mobile;


import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.CursorAdapter;
import android.widget.TextView;

public  class Main  extends Activity  implements OnClickListener, TextWatcher
{
     // dictionary.db的储存目录
     private  final String DATABASE_PATH = android.os.Environment
            .getExternalStorageDirectory().getAbsolutePath()
            + "/dictionary";
     private AutoCompleteTextView actvWord;
     private  final String DATABASE_FILENAME = "dictionary.db";
     private SQLiteDatabase database;
     private Button btnSelectWord;

    @Override
     public  void onCreate(Bundle savedInstanceState)
    {
         super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
         // 打开Database
        database = openDatabase();
        btnSelectWord = (Button) findViewById(R.id.btnSelectWord);
        actvWord = (AutoCompleteTextView) findViewById(R.id.actvWord);
         // 设置按钮监听
        btnSelectWord.setOnClickListener( this);
         // 设施字符改变监听
        actvWord.addTextChangedListener( this);
    }



     public  class DictionaryAdapter  extends CursorAdapter
    {
         private LayoutInflater layoutInflater;
        @Override
         public CharSequence convertToString(Cursor cursor)
        {
             return cursor ==  null ? "" : cursor.getString(cursor
                    .getColumnIndex("_id"));
        }

         private  void setView(View view, Cursor cursor)
        {
            TextView tvWordItem = (TextView) view;
            tvWordItem.setText(cursor.getString(cursor.getColumnIndex("_id")));
        }

        @Override
         public  void bindView(View view, Context context, Cursor cursor)
        {
            setView(view, cursor);
        }

        @Override
         public View newView(Context context, Cursor cursor, ViewGroup parent)
        {
             // 把布局文件转换为View对象
            View view = layoutInflater.inflate(R.layout.word_list_item,  null);
            setView(view, cursor);
             return view;
        }

         public DictionaryAdapter(Context context, Cursor c,  boolean autoRequery)
        {
             super(context, c, autoRequery);
             // 通过系统服务获得该上下文的LayoutInflater对象
            layoutInflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
    }

     public  void afterTextChanged(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.setAdapter(dictionaryAdapter);

    }

     public  void beforeTextChanged(CharSequence s,  int start,  int count,
             int after)
    {
         //  TODO Auto-generated method stub

    }

     public  void onTextChanged(CharSequence s,  int start,  int before,  int count)
    {
         //  TODO Auto-generated method stub

    }

     public  void onClick(View view)
    {
         // 从t_words的表中搜索english为输入框中的中文
        String sql = "select chinese from t_words where english=?";        
        Cursor cursor = database.rawQuery(sql,  new String[]
        { actvWord.getText().toString() });
        String result = "未找到该单词.";
         //   如果查找单词,显示其中文的意思
         if (cursor.getCount() > 0)
        {
             //   必须使用moveToFirst方法将记录指针移动到第1条记录的位置
            cursor.moveToFirst();
            result = cursor.getString(cursor.getColumnIndex("chinese"));
        }
         //   显示查询结果对话框
         new AlertDialog.Builder( this).setTitle("查询结果").setMessage(result)
                .setPositiveButton("关闭",  null).show();

    }

     private SQLiteDatabase openDatabase()
    {
         try
        {
             //  获得dictionary.db文件的绝对路径
            String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME;
            File dir =  new File(DATABASE_PATH);
             //  如果/sdcard/dictionary目录中存在,创建这个目录
             if (!dir.exists())
                dir.mkdir();
             //  如果在/sdcard/dictionary目录中不存在
            
//  dictionary.db文件,则从res\raw目录中复制这个文件到
            
//  SD卡的目录(/sdcard/dictionary)
             if (!( new File(databaseFilename)).exists())
            {
                 //  获得封装dictionary.db文件的InputStream对象
                InputStream is = getResources().openRawResource(
                        R.raw.dictionary);
                FileOutputStream fos =  new FileOutputStream(databaseFilename);
                 byte[] buffer =  new  byte[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);
             return database;
        }
         catch (Exception e)
        {
        }
         return  null;
    }

}

转载于:https://www.cnblogs.com/lee0oo0/archive/2012/03/29/2422992.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值