android实现单词翻译的功能
思路:
1.布局界面,一个添加生词的界面一个主界面输入要翻译的内容,一个显示翻译结果的界面。
2. java代码:首先实现生词的添加:add_Activity;然后添加数据库存储数据;最后在Main_Activity中实现翻译功能。
涉及知识点及拓展知识:
1.什么是api:
百度上说API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
从技术角度来说,API指的是应用程序编程接口。API并不完全等同于远程服务器——它其实是服务器的一部分,负责接收请求并发送响应。API是一种为客户提供服务的方式。
2.activity的生命周期:
本次用到了onDestroy():Activity的销毁,为了让下一次查询单词的时候上一次查询的结果不再显示。
activity的生命周期就是从创建到销毁的一个过程,在这个过程中Activity从创建到销毁,从可见到不可见会因为应用场景的不断变化而改变。
这个过程中运用到的七个函数如下:
onCreate():Activity创建调用
onStart():Activity启动调用
onRestart():Activity再次启动调用
onResume():Activity获取焦点
onPause():Activity失去焦点
onStop():Activity暂停调用
onDestroy():Activity销毁调用
3.SQLiteOpenHelper
SQLiteOpenHelper类 常用方法:
/**
* 创建数据库
*/
// 1. 创建 or 打开 可读/写的数据库(通过 返回的SQLiteDatabase对象 进行操作)
getWritableDatabase()
// 2. 创建 or 打开 可读的数据库(通过 返回的SQLiteDatabase对象 进行操作)
getReadableDatabase()
// 3. 数据库第1次创建时 则会调用,即 第1次调用 getWritableDatabase() / getReadableDatabase()时调用
// 在继承SQLiteOpenHelper类的子类中复写
onCreate(SQLiteDatabase db)
// 4. 数据库升级时自动调用
// 在继承SQLiteOpenHelper类的子类中复写
onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
// 5. 关闭数据库
close()
/**
* 数据库操作(增、删、减、查)
*/
// 1. 查询数据
(Cursor) query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
// 查询指定的数据表返回一个带游标的数据集。
// 各参数说明:
// table:表名称
// colums:列名称数组
// selection:条件子句,相当于where
// selectionArgs:条件语句的参数数组
// groupBy:分组
// having:分组条件
// orderBy:排序类
// limit:分页查询的限制
// Cursor:返回值,相当于结果集ResultSet
(Cursor) rawQuery(String sql, String[] selectionArgs)
//运行一个预置的SQL语句,返回带游标的数据集(与上面的语句最大的区别 = 防止SQL注入)
// 2. 删除数据行
(int) delete(String table,String whereClause,String[] whereArgs)
// 3. 添加数据行
(long) insert(String table,String nullColumnHack,ContentValues values)
// 4. 更新数据行
(int) update(String table, ContentValues values, String whereClause, String[] whereArgs)
// 5. 执行一个SQL语句,可以是一个select or 其他sql语句
// 即 直接使用String类型传入sql语句 & 执行
(void) execSQL(String sql)
————————————————
版权声明:本文为CSDN博主「Carson_Ho」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/carson_ho/article/details/53241633
4.ArrayList
1.ArrayList:动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处:
动态的增加和减少元素;实现了ICollection和IList接口;灵活的设置数组的大小。
2、如何使用ArrayList
最简单的例子:
ArrayList List = new ArrayList();
for( int i=0;i<10;i++ ) //给数组增加10个Int元素
List.Add(i);
//…程序做一些处理
List.RemoveAt(5);//将第6个元素移除
for( int i=0;i<3;i++ ) //再增加3个元素
List.Add(i+20);
Int32[] values = (Int32[])List.ToArray(typeof(Int32));//返回ArrayList包含的数组
-
Array与ArrayList区别:
(1)Array类型的变量在声明的同时必须进行实例化(至少得初始化数组的大小),而ArrayList可以只是先声明.
(2)Array只能存储同构的对象,而ArrayList可以存储异构的对象。
同构的对象是指类型相同的对象,若声明为int[]的数组就只能存放整形数据,string[]只能存放字符型数据,但声明为object[]的数组除外。
而ArrayList可以存放任何不同类型的数据(因为它里面存放的都是被装箱了的Object型对象,实际上ArrayList内部就是使用"object[] _items;"这样一个私有字段来封装对象的)
(3)在CLR托管对中的存放方式
Array是始终是连续存放的,而ArrayList的存放不一定连续。
(4) 初始化大小
Array对象的初始化必须只定指定大小,且创建后的数组大小是固定的,而ArrayList的大小可以动态指定,其大小可以在初始化时指定,也可以不指定,也就是说该对象的空间可以任意增加。
(5)Array不能够随意添加和删除其中的项,而ArrayList可以在任意位置插入和删除项。 -
Array和ArrayList的相似点
#1 都具有索引(index),即可以通过index来直接获取和修改任意项。
#2 他们所创建的对象都放在托管堆中。
#3 都能够对自身进行枚举(因为都实现了IEnumerable接口)。
注:
在C#2.0中,建议大家尽量使用范型版的ArrayList,即System.Collection.Generics命名空间下的List,这样不但保证了类型安全,而且由于没有了装箱和拆箱的过程,从而提高了对象处理的效率。
5.安卓存储数据的五钟方式
6.SQLite
7.Adapter
Adapter:适配器。 适配器的作用是数据和视图之间的桥梁。是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。如下图直观的表达了Data、Adapter、View三者的关系:
SimpleAdapter:不仅可以处理列表项全是文本的情况,当列表项中还有其他控件时,同样可以处理。
ArrayAdapter:只能处理列表全是文本的情况。
自定义的Adapter:根据xml文件中定义的样式惊醒列表项的填充,适用性最强。
SimpleCursorAdapter:专门用于把游标中的数据映像到列表中 -
声明Adapter对象,根据构造方法实例化此对象。具体如下:
(1)ArrayAdapter<数据类型> adapter = new ArrayAdapter<数据类型>(context:一般指当前Activity对象,layout:每个列表项显示的布局,data:数据源变量);
(2)SimpleAdapter adapter = new SimpleAdapter(context:一般指当前Activity对象,data:数据源变量,layout:每个列表项显示的布局,new String[]{}:数据源中的“键”,new int[]{}:显示数据源的控件ID);
(3)自定义Adapter类 adapter = new 自定义Adapter类构造方法;
绑定Adapter对象到Adapter上:AdapterView对象.setAdapter(Adapter对象);
总结:
1.代码编写的时候按钮,编辑框什么命名要符合逻辑思维,不要随便命名,不然后期代码多了自己任意乱。
2.优雅的代码!!!要格式化注意书写的格式
运行结果:首先需要添加生词手动输入单词和词意思。之后开始输入查询单词解释。
项目目录:
布局文件:仅供参考有点难看重要是代码的理解。
1.activity_main.xml
代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/transport"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="300dp"
android:layout_marginTop="16dp"
android:text="翻译"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</LinearLayout>
<EditText
android:id="@+id/search"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="194dp"
android:layout_marginBottom="1dp"
android:hint="请输入要查询的单词"
android:textSize="20dp"
android:padding="20dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"></EditText>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:padding="10dp"
android:text="单词及解释如下:"></TextView>
<Button
android:id="@+id/btn_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="300dp"
android:text="添加生词"
/>
<ListView
android:id="@+id/resylt_listView"
android:layout_width="391dp"
android:layout_height="200dp"
android:layout_marginStart="4dp"
android:layout_marginLeft="4dp"
android:layout_marginBottom="264dp"
android:background="#27A78570"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/search" />
</LinearLayout>
add_main.xml:添加单词的界面
代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
tools:context=".addActivity">
<EditText
android:id="@+id/dc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="单词"
android:padding="20dp"
android:layout_marginTop="100dp"></EditText>
<EditText
android:id="@+id/fy"
android:padding="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="翻译">
</EditText>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/bc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="180dp"
android:text="保存">
</Button>
<Button
android:id="@+id/qx"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取消">
</Button>
</LinearLayout>
</LinearLayout>
result_main.xml:用来显示查询的结果的然后显示在activity_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="200dp"
android:layout_height="200dp"
android:layout_marginTop="320dp"
>
<TextView
android:id="@+id/result_word"
android:layout_width="wrap_content"
android:layout_height="73dp"
android:textSize="30sp"
android:text="单词" />
<TextView
android:id="@+id/result_interpret"
android:layout_width="wrap_content"
android:layout_height="73dp"
android:text="解释"
android:textSize="30sp" />
</LinearLayout>
java代码:
- 实现生词的添加:add_Activity
package com.example.acer.danci;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
//第一步:
//实现生词的添加
public class addActivity extends AppCompatActivity {
private DBOpenHelper dbOpenHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);
dbOpenHelper = new DBOpenHelper(addActivity.this, "db_dict", null, 1);//实例化DBOpenHelper对象,用来创建数据库(四个参数:MainActivity.this上下文对象,名字,游标工厂,版本号)
final EditText etWord=findViewById(R.id.dc);//获取单词编辑框
final EditText etInterpret=findViewById(R.id.fy);//获取翻译编辑框
Button save=findViewById(R.id.bc);//获取保存按钮
Button back=findViewById(R.id.qx); //获取取消按钮
save.setOnClickListener(new View.OnClickListener() { //实现将添加的单词解释存储到数据库中
@Override
public void onClick(View v) {
String word=etWord.getText().toString(); //获取输入的单词
String interpret=etInterpret.getText().toString(); //获取填写的解释
if (word.equals("")||interpret.equals("")){ //判断输入的单词和解释是否是空
Toast.makeText(addActivity.this,"输入的单词或解释为空",Toast.LENGTH_LONG).show();
}else {
insertData(dbOpenHelper.getReadableDatabase(),word,interpret); //插入生词
Toast.makeText(addActivity.this,"添加生词成功",Toast.LENGTH_LONG).show();
}
}
});
back.setOnClickListener(new View.OnClickListener() { //实现返回查询界面
@Override
public void onClick(View v) {
Intent intent=new Intent(addActivity.this,MainActivity.class); //通过intent跳转到查询页面
startActivity(intent);
}
});
}
//插入数据的方法
private void insertData(SQLiteDatabase sqLiteDatabase,String word,String interpret){
ContentValues values=new ContentValues();
values.put("word",word); //保存单词
values.put("detail",interpret); //保存解释
sqLiteDatabase.insert("tb_dict",null,values); //执行插入操作
}
@Override //关闭数据库连接
protected void onDestroy(){
super.onDestroy();
if (dbOpenHelper!=null){
dbOpenHelper.close();
}
};
}
- 创建数据库实现储存数据的功能:DBOpenHelper.java
package com.example.acer.danci;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import androidx.annotation.Nullable;
public class DBOpenHelper extends SQLiteOpenHelper {
final String CREATE_TABLE_SQL="create table tb_dict (id integer primary key autoincrement,word,detail)";//创建数据表的SQL语句。自动编号,数据类型采用默认
public DBOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) { //创建数据表
db.execSQL(CREATE_TABLE_SQL); //创建单词的数据表
}
@Override //版本更新
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i("词典","--版本更新"+"oldVersion"+"-->"+newVersion);
}
}
3.实现翻译的功能 Activity_main.java
package com.example.acer.danci;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
//实现翻译功能
public class MainActivity extends AppCompatActivity {
private DBOpenHelper dbOpenHelper; //声明DBOpenHelper对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbOpenHelper = new DBOpenHelper(MainActivity.this, "db_dict", null, 1);//实例化DBOpenHelper对象,用来创建数据库(四个参数:MainActivity.this上下文对象,名字,游标工厂,版本号)
final ListView listView = findViewById(R.id.resylt_listView); //获取显示结果的ListView
final EditText etSearch = findViewById(R.id.search); //获取查询内容的编辑框
final Button add = findViewById(R.id.btn_add); //获取添加单词的按钮
Button search = findViewById(R.id.transport); //获取查询按钮
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, addActivity.class);
startActivity(intent);
}
});
search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String key = etSearch.getText().toString(); //获取查询的单词
Cursor cursor = dbOpenHelper.getReadableDatabase().query("tb_dict", null, "word=?", new String[]{key}, null, null, null); //指定要查询的表,要查询的列,不指定就查询所有的,指定查询条件使用占位符,指定占位符的值
//处理查询结果 查询结果保存到arrayList当中
ArrayList<Map<String, String>> resultList = new ArrayList<Map<String, String>>(); //结果保存在ArrayList对象当中
while (cursor.moveToNext()) {
Map<String, String> map = new HashMap<String, String>();
map.put("word", cursor.getString(1));
map.put("interpret", cursor.getString(2));
resultList.add(map);
}
if (resultList == null || resultList.size() == 0) { //判断数据库中有没有数据
//显示提示信息,没有相关记录
Toast.makeText(MainActivity.this, "没有记录", Toast.LENGTH_LONG).show();
} else {
//否则将查询的结果显示到ListView中
SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, resultList, R.layout.result_main,
new String[]{"word", "interpret"}, new int[]{
R.id.result_word, R.id.result_interpret});
listView.setAdapter(simpleAdapter);
}
}
});
}
@Override //关闭数据库连接
protected void onDestroy(){
super.onDestroy();
if (dbOpenHelper!=null){
dbOpenHelper.close();
}
};
}