我的Android案例—电子词典

2015年的Android案例之旅

案例七:电子词典

知识点:

1.自动完成文本框(AutoCompleteTextView)

AutoCompleteTextView是从EditText派生出来的,当用户输入一定字符之后,AutoCompleteTextView会显示一个下拉菜单,供用户选择,当用户选择某个菜单之后,内容会被填充到该文本中。

使用AutoCompleteTextView需要设置一个Adapter,该Adapter封装了预设的提示文本

2.SQLiteDataBase数据库

3.Adapter适配器

涉及文件:

res->layout->activity_main.xml 布局文件

res->layout->word_list_item.xml 布局文件

res->raw-> dictionary.db 词典数据库

res->values->strings 资源文件之字符串资源

res->values->color 资源文件之颜色资源

res->AndroidManifest.xml 系统清单文件
主要添加SD卡相关权限

src->package->MainActivity.java java文件

activity_main.xml
<!-- 线性布局 -->
<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="#ff808080">
    <!-- 相对布局
    	用于设置搜索框和搜索按钮 -->
    <RelativeLayout android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <!-- 定义自动完成文本框,供用户输入单词 -->
        <AutoCompleteTextView
            android:id="@+id/word"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:ems="20"
            android:layout_toLeftOf="@+id/searchWord"/>
        <!-- 搜索按钮,供用户点击查询单词 -->
        <Button
            android:id="@+id/searchWord"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_alignParentRight="true"
            android:text="@string/search"/>
    </RelativeLayout>
    <!-- 查询结果 -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/result"/>
     <!-- 用户显示查询的结果 -->
    <TextView
        android:id="@+id/show"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"
        android:textColor="@color/blue"/>
</LinearLayout>
word_list_item.xml
<?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:gravity="center_vertical"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:paddingLeft="6dip"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:textColor="@color/gray" />
MainActivity.java
package com.example.mydicitonary;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;

import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v4.widget.CursorAdapter;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
	//定义Log标签
	private static final String TAG = "DICITONARY";
	//声明控件对象
	private Button search;
	private TextView show;
	private AutoCompleteTextView actv;

	//用到SQLiteDateBase
	//定义数据库的存放路径
	private static final String DATEBASE_PATH = android.os.Environment
			.getExternalStorageDirectory().getAbsolutePath()
			+ "/dictionary";
	//定义数据库的名字
	private static final String DATEBASE_NAME = "dictionary.db";
	private SQLiteDatabase database;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Log.i(TAG, "DICITONARY is onCreate");

		//获取布局中的控件
		init();
		//打开数据库
		database = openDateBase();

		//监听事件处理
		listener();
	}

	/**
	 * @oaram 初始化控件
	 */
	private void init(){
		search = (Button)this.findViewById(R.id.searchWord);
		show = (TextView)this.findViewById(R.id.show);
		actv = (AutoCompleteTextView)this.findViewById(R.id.word);
	}

	/**
	 * @param 处理监听事件
	 */
	private void listener(){
		//按钮点击事件
		search.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				String result = "未查到该单词信息";
				//查询指定的单词
				String sql = "select chinese from t_words where english=?";
				Cursor cursor = database.rawQuery(sql, new String[]{
						actv.getText().toString()
				});
				if(cursor.getCount()>0){
					// 必须使用moveToFirst方法将记录指针移动到第1条记录的位置
					cursor.moveToFirst();
					result = cursor.getString(cursor.getColumnIndex("chinese")).replace("&", "&");
				}
				//将结果显示到TextView中
				show.setText(actv.getText().toString() +"\n"+result);
			}
		});

		//文本变动事件
		actv.addTextChangedListener(new TextWatcher() {

			@Override
			public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
				// TODO Auto-generated method stub

			}

			@Override
			public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
					int arg3) {
				// TODO Auto-generated method stub

			}

			@Override
			public void afterTextChanged(Editable s) {
				Cursor cursor = database.rawQuery(
						"select english as _id from t_words where english like ?",
						new String[]
						{ s.toString() + "%" });
				//新建新的Adapter
				DictionaryAdapter dictionaryAdapter = new DictionaryAdapter(MainActivity.this,
						cursor, true);
				//绑定适配器
				actv.setAdapter(dictionaryAdapter);

			}
		});
	}

	//自定义Adapter类
	public class DictionaryAdapter extends CursorAdapter{
		//对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;
		//对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。
		private LayoutInflater layoutInflater;

		public DictionaryAdapter(Context context, Cursor c, boolean autoRequery)
		{
			super(context, c, autoRequery);
			layoutInflater = (LayoutInflater) context
					.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		}

		@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 arg2) {
			View view = layoutInflater.inflate(R.layout.word_list_item, null);
			setView(view, cursor);
			return view;
		}

	}

	/**
	 * @param	返回一个SQLiteDatabase对象
	 * @return
	 */
	private SQLiteDatabase openDateBase(){
		try {
			// 获得dictionary.db文件的绝对路径
			String databaseFileName = DATEBASE_PATH + "/" + DATEBASE_NAME;
			File dir = new File(DATEBASE_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[9128];
				int count = 0;
				// 开始复制dictionary.db文件
				while((count = is.read(buffer))!=-1){
					fos.write(buffer, 0, count);
				}
				//关闭文件流
				is.close();
				fos.close();
			}
			// 打开/sdcard/dictionary目录中的dictionary.db文件
			SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(
					databaseFileName, null);
			return database;
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}

}
时间: 2024-11-05 15:52:06

我的Android案例—电子词典的相关文章

使用Android简单实现有道电子词典

前言: 毕业设计的内容,仅仅有Java基础.没学过Android. 本着用到什么学什么.花费了10多个晚上完毕毕业设计. 当然,仅仅是简单的实线了电子词典功能,自始至终没有考虑过性能等问题. 本电子词典的数据文件是不错的,有道的API是分析有道电子词典的日志文件得到的,离线的柯林斯词典是Mdict词典的MDX文件转换(https://bitbucket.org/xwang/mdict-analysis)来的.这个是本电子词典的唯一亮点吧.由于我一直认为数据比界面更重要. 文件布局: waterm

实现基于Android的英文电子词典

英文词典是手机中经常使用的应用.因此,在本文将结合Android来讨论如何实现一个Android版的英文词典.实现英文词典的方法很多.在本文使用了SQLite数据库来保存英文单词信息.系统通过SQLite数据库中保存的单词信息来查找到与指定英文对应的中文信息.当然,实现这样一个英文词典需要解决一系列技术问题.例如,如何将保存英文单词信息的数据库文件随程序(apk文件)一起发布:发布后如何打开数据库:如何在输入前几个字母后,在AutoCompleteTextView组件提示列表中显示以所输入字符串

C++第15周(春)项目3 - OOP版电子词典(二)

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目3-OOP版电子词典](本程序须要的相关文件,请到http://pan.baidu.com/s/1qW59HTi下载.) 做一个简单的电子词典. 在文件dictionary.txt中.保存的是英汉对比的一个词典.词汇量近8000个,英文.中文释义与词性间用'\t'隔开. 编程序,由用户输入英文词,显示词性和中文释义. 提示1:假设要用OO

电子词典--两次扫描文件发/链表法

二次扫描文件法实现的电子词典 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> struct dict { char *key; char *content; }; int get_dict_size(FILE *pfile)//得到字典文件中词条总数 { if (pfile == NULL)

第十七周项目7 电子词典(还有疑问,求解答)

要求: 做一个简单的电子词典.在文件dictionary.txt中,保存的是英汉对照的一个词典,词汇量近8000 个,英文.中文释义与词性间用'\t'隔开. 编程序,由用户输入英文词,显示词性和中文释义. 提示1:定义一个Word结构体表示一个词条,其中的数据成员stringenglish; 表示英文单词,stringchinese;表示 对应中文意思,stringword_class;表示该词的词性:定义Wordwords[8000]存放所有词条成员,intwordsNum;表示词 典中的词条

第14周上机实践项目3——电子词典

做一个简单的电子词典.在文件dictionary.txt中,保存的是英汉对照的一个词典,词汇量近8000个,英文.中文释义与词性间用'\t'隔开. 代码 #include <iostream> #include <fstream> #include <cstdlib> using namespace std; class dictionary; class Word { public: Word(){} void set(string e,string c,string

我的Android案例—签到日历

2015年的Android案例之旅 案例八:签到日历 知识点: GridView的使用 SQLite的使用 涉及文件: res->layout->activity_main.xml 主布局文件 res->layout->date.xml 布局文件 src->db->DBHelper.java java文件 src->db->SignDAO.java java文件 src->activity->MainActivity.java java文件 ac

第十四周 项目三 电子词典

/* *Copyright (c)2014,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:d.cpp *作 者:张旺华 *完成日期:2015年6月3日 *版 本 号:v1.0 */ /*项目3-OOP版电子词典] 做一个简单的电子词典.在文件dictionary.txt中,保存的是英汉对照的一个词典,词汇量近8000个, 英文.中文释义与词性间用'\t'隔开. (1)编程序,由用户输入英文词,显示词性和中文释义. 提示1:如果要用OOP完成这个词典(当然也

第十四周项目3-OOP版电子词典

做一个简单的电子词典.在文件dictionary.txt中,保存的是英汉对照的一个词典,词汇量近8000个,英文.中文释义与词性间用'\t'隔开. (1)编程序,由用户输入英文词,显示词性和中文释义. 提示1:如果要用OOP完成这个词典(当然也可以用OO方法实现),可以定义一个Word类表示一个词条,其中的数据成员string english; 表示英文单词,string chinese;表示对应中文意思,string word_class;表示该词的词性:还可以定义一个Dictionary类,