现在,我们再来看一个比较简单一点的记单词的软件,这个软件的名字叫iWord,只含有BUPT的记单词软件的一小部分的功能,不过,作为一个简易的记单词软件,这样已经足够了。
工程目录展开如下:
Src里面装载的是逻辑实现的文件,layout里面装载的是工程文件,AndroidManifest里面放置的是注册信息,而values里面放置的是字符串的信息,资源文件里面放置图片,raw文件夹里面放置单词和单词的翻译,导出的文件有自动生成的R文件和apk安装包。
(1) 主菜单(iWord.java+home.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"
android:background="@drawable/homebg"
android:gravity="center_horizontal">
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:layout_weight="1">
//起始的一个按钮,将其文字与按钮分开
<TextView android:id="@+id/ListName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="40sp"
android:textColor="#FFFFFF"
android:paddingTop="40dip"/>
<ImageButton android:id="@+id/SelectListButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@anim/homebtn_select"/>
</LinearLayout>
//竖直放置的一个线性布局
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
//设置重力感应为横着的
android:gravity="center_horizontal"
android:layout_weight="1">
<ImageButton android:id="@+id/StartRecite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@anim/homebtn_recite"/>
<ImageButton android:id="@+id/MeaningTest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@anim/homebtn_meaning" />
<ImageButton android:id="@+id/SpellTest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@anim/homebtn_spell" />
</LinearLayout>
</LinearLayout>
其内部逻辑的实现:
package com.fduandroid.iword;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.*;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
public class iWord extends Activity {
//设置各种静态变量,选择列表的词库的时候,对话框参数设置为0,否则设置为1
static final int DIALOG_SELECT_LIST = 0;
static final int PROGRESS_DIALOG = 1;
public static final String PREFS_NAME = "PrefsFile";
public static final String LIST_NAME="ListName";
public static final String LIST_FULL_NAME="ListFullName";
public static final String IS_RANDOM="IsRandom";
//将四个按钮声明,定义TextView,表示当前词库的名称
private ImageButton selectListButton;
private ImageButton startRecite;
private ImageButton meaningTest;
private ImageButton spellTest;
private TextView listName;
private ProgressDialog progressDialog;
static public ArrayList<Word> wordList;
static public String nowListName;
static public String myListName;
//这个设置持久存储的一个键值
public void setPref(String PrefName,String key,String value) {
SharedPreferences settings=getSharedPreferences(PrefName,0);
SharedPreferences.Editor editor = settings.edit();
editor.putString(key, value);
editor.commit();
}
//这里得到持久存储的一个键值
public String getPref(String PrefName,String key,String defValue) {
SharedPreferences settings=getSharedPreferences(PrefName,0);
String ln=settings.getString(key, defValue);
return ln;
}
//这里的功能应该是更新词库的list,但是我现在并不知道其详
private void updateListName(String listFullName,String listname) {
setPref(PREFS_NAME,LIST_FULL_NAME,listFullName);
setPref(PREFS_NAME,LIST_NAME,listname);
listName.setText(listFullName);
myListName=listname;
}
//显示对话框的时候,根据传入参数的不同,分为两种情况讨论
protected Dialog onCreateDialog(int id) {
Dialog dialog;
switch(id) {
case DIALOG_SELECT_LIST:
final CharSequence[] items = getResources().getStringArray(R.array.VListFullName);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(true)
.setTitle(getResources().getString(R.string.PleaseSelectAList))
//对于取消按钮的选择
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
})
//对于更新词库的名字
.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
updateListName(items[item].toString(),getResources().getStringArray(R.array.VListName)[item].toString());
}
});
dialog = (AlertDialog) builder.create();
break;
case PROGRESS_DIALOG:
progressDialog = new ProgressDialog(iWord.this);
//将对话框设置为SPINNER这种样式的
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
//传递“正在载入消息”的字符串
progressDialog.setMessage(getResources().getString(R.string.Loading));
progressDialog.setCancelable(false);
return progressDialog;
default:
dialog = null;
}
return dialog;
}
//初始化布局函数,
private void initLayout() {
//这里默认是大学英语四级
listName=(TextView)findViewById(R.id.ListName);
listName.setText(getPref(PREFS_NAME,LIST_FULL_NAME,"大学英语四级"));
selectListButton = (ImageButton) findViewById(R.id.SelectListButton);
//绑定列表选择按钮的监听,点击之后进入对话框
selectListButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showDialog(DIALOG_SELECT_LIST);
}
});
//为图形按钮startRecite设置监听,
startRecite=(ImageButton)findViewById(R.id.StartRecite);
startRecite.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//在缓冲对话框中缓冲一段时间
showDialog(PROGRESS_DIALOG);
//执行线程,当得到该词库的所有list而且将缓冲对话框消失掉之后,停止刷线程,利用Intent将主界面转为背单词的界面,也就是将iWord这个Activity转为Vocabulary这个Activity
Thread getListThread=new Thread() {
public void run() {
getWordList();
progressDialog.dismiss();
}
};
getListThread.start();
Intent it=new Intent();
it.setClass(iWord.this, Vocabulary.class);
startActivity(it);
iWord.this.finish();
}
});
//同理,得到图形按钮meaningTest的id并且绑定监听
meaningTest=(ImageButton)findViewById(R.id.MeaningTest);
meaningTest.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showDialog(PROGRESS_DIALOG);
Thread getListThread=new Thread() {
public void run() {
getWordList();
progressDialog.dismiss();
}
};
getListThread.start();
Intent it=new Intent();
//跳转Activity
it.setClass(iWord.this, MeaningTest.class);
startActivity(it);
iWord.this.finish();
}
});
//这个也是一样的,对三个按钮进行同等的处理
spellTest=(ImageButton)findViewById(R.id.SpellTest);
spellTest.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showDialog(PROGRESS_DIALOG);
Thread getListThread=new Thread() {
public void run() {
getWordList();
progressDialog.dismiss();
}
};
getListThread.start();
Intent it=new Intent();
it.setClass(iWord.this, SpellTest.class);
startActivity(it);
iWord.this.finish();
}
});
}
//从这里开始,初次跳转到home这个布局,并初始化布局(利用函数initLayout)
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.home);
initLayout();
}
//定义一个公有的单词类,并设置一个构造函数将其初始化
public class Word {
public String Word;
public String Meaning;
public Word() {
Word="";
Meaning="";
}
//重载这个函数,将两赋予这两个字符串的值
public Word(String word,String meaning) {
Word=word;
Meaning=meaning;
}
}
//得到列表的id值,如果是0的话,就将返回R文件中的raw文件夹的cet4的地址,其余的,返回相应的列表的地址
private int getListId() {
String ln=getPref(iWord.PREFS_NAME,iWord.LIST_NAME,"cet4");
int listId=getResources().getIdentifier(ln,"raw",getPackageName());
System.out.print(listId);
if (listId==0) return R.raw.cet4;
else return listId;
}
//这里得到编号为一个id的单词库中的所有单词
private void getWordList() {
if (nowListName==listName.getText()) return;
if (wordList==null) wordList=new ArrayList<Word>();
else wordList.clear();
nowListName=listName.getText().toString();
InputStream is = getResources().openRawResource(getListId());
//这里读缓冲,并定义三个字符串,开始读文件了
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String line,word,meaning;
try {
String[] lines;
while((line = br.readLine()) != null) {
line=line.trim();
if (line.length()>0) {
lines=line.split("#");
word=lines[0];
meaning=lines[1];
//每次读入两个字符串,将其载入到wordList中
wordList.add(new Word(word,meaning));
}
}
}
catch (IOException e) {
e.printStackTrace();
}
}
}
(2)读入开始背按钮之后所显示的功能
界面布局:
<?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"
//背景还是选择为主界面的背景
android:background="@drawable/homebg">
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
//返回主界面的按钮
<ImageButton android:id="@+id/backToHome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@anim/backbtn"/>
//利用TextView组件来显示背单词的列表的名字
<TextView android:id="@+id/reciteListName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:textColor="#FFFFFF" />
</LinearLayout>
<LinearLayout android:layout_width="fill_parent"
android:layout_height="250dip"
android:orientation="vertical"
android:background="@drawable/recite_word_bg"
android:layout_marginTop="35dip"
android:layout_marginBottom="35dip">
//这里有两段TextView,其中一段为单词的字母,下面(这里利用精确的布局)为单词的意思
<TextView android:id="@+id/reciteWord"
android:layout_width="300dip"
android:layout_height="wrap_content"
android:paddingTop="35dip"
android:paddingLeft="35dip"
android:textColor="#000000"
android:textSize="40sp"/>
<TextView android:id="@+id/reciteMeaning"
android:layout_width="300dip"
android:layout_height="wrap_content"
android:paddingLeft="35dip"
android:textColor="#888"
android:textSize="30sp" />
</LinearLayout>
//在最下面的线性布局设置一个“下一个”按钮
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:gravity="center_horizontal"
android:layout_marginTop="10dip"
android:orientation="vertical">
<ImageButton android:id="@+id/reciteNext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="bottom"
android:background="@anim/nextbtn" />
</LinearLayout>
</LinearLayout>
(如图所示,此为背诵按钮点进入的Activity)
逻辑实现:
package com.fduandroid.iword;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import com.fduandroid.iword.iWord.Word;
public class Vocabulary extends Activity {
static final int PROGRESS_DIALOG = 0;
//这里与布局相同,定义三个TextView和两个ImageButton
private TextView reciteListName;
private TextView reciteWord;
private TextView reciteMeaning;
private ImageButton reciteNext;
private ImageButton backToHome;
//设置随机数实例,并且为这里list中的单词加上编号
private java.util.Random random=new java.util.Random();
private int wordId;
//编辑键值对,保存编辑的结果
public void setPref(String PrefName,String key,String value) {
SharedPreferences settings=getSharedPreferences(PrefName,0);
SharedPreferences.Editor editor = settings.edit();
editor.putString(key, value);
editor.commit();
}
//得到那个单词的键值对
public String getPref(String PrefName,String key,String defValue) {
SharedPreferences settings=getSharedPreferences(PrefName,0);
String ln=settings.getString(key, defValue);
return ln;
}
//如果那个单词可以得到的话,那么得到List中的那个单词
public Word getNextWord() {
String isRan=getPref(iWord.PREFS_NAME,iWord.IS_RANDOM,"true");
if (isRan=="true") return iWord.wordList.get(random.nextInt(iWord.wordList.size()));
//如果不行的话,根据线性探测法,查找后面一个,这里注意要取模
else return iWord.wordList.get((wordId++)%iWord.wordList.size());
}
//更新显示函数
protected void updateDisplay(iWord.Word word) {
reciteWord.setText(word.Word);
reciteMeaning.setText(word.Meaning);
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//弹出界面内容,并且初始化布局
setContentView(R.layout.recite);
initLayout();
//初始时为第一个单词,每次取下一个单词之后,更新一下两个显示的TextView
Word word=getNextWord();
updateDisplay(word);
}
//初始化布局
private void initLayout() {
reciteListName=(TextView)findViewById(R.id.reciteListName);
reciteListName.setText(getPref(iWord.PREFS_NAME,iWord.LIST_FULL_NAME,"大学英语四级"));
reciteWord=(TextView)findViewById(R.id.reciteWord);
reciteMeaning=(TextView)findViewById(R.id.reciteMeaning);
reciteNext=(ImageButton)findViewById(R.id.reciteNext);
//得到下一个按钮的监听器
reciteNext.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//这里再换一个list中的单词,并且更新一次界面
Word word=getNextWord();
updateDisplay(word);
}
});
//现在来处理返回按钮
backToHome=(ImageButton)findViewById(R.id.backToHome);
backToHome.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent it=new Intent();
//这里将背单词的Activity转为主界面
it.setClass(Vocabulary.this, iWord.class);
startActivity(it);
Vocabulary.this.finish();
}
});
}
}
(3)读入拼写测试之后显示的功能(这里我再一次地声明,这三个按钮的效力是同等的)
布局界面:(布局和前面的大同小异,这里就不说了,颜色的改动以及插入的@anim图片是亮点)
<?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"
android:background="@drawable/homebg">
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageButton android:id="@+id/spellBackToHome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@anim/backbtn"/>
<TextView android:id="@+id/spellListName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:textColor="#FFFFFF" />
</LinearLayout>
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/meaning_word_bg"
android:orientation="vertical"
android:layout_marginTop="35dip">
<TextView android:id="@+id/spellMeaning"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:layout_marginTop="10dip"
android:layout_marginLeft="35dip"
android:textColor="#888"/>
<TextView android:id="@+id/spellWord"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="35sp"
android:layout_marginLeft="35dip"
android:textColor="#000000"/>
</LinearLayout>
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="35dip">
<TextView android:id="@+id/spellHint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="35dip"
android:textSize="15sp"
android:textColor="#FFFFFF"/>
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginLeft="35dip">
<EditText android:id="@+id/spellText"
android:layout_width="200dip"
android:layout_height="wrap_content"
android:freezesText="false" />
<Button android:id="@+id/spellShowAns"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="答案"/>
</LinearLayout>
</LinearLayout>
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="bottom"
android:gravity="center_horizontal"
android:orientation="vertical"
android:layout_marginTop="82dip">
<ImageButton android:id="@+id/spellNext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="bottom"
android:background="@anim/nextbtn" />
</LinearLayout>
</LinearLayout>
逻辑实现:
package com.fduandroid.iword;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.Editable;
import android.text.InputFilter;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
import com.fduandroid.iword.iWord.Word;
public class SpellTest extends Activity {
//声明各种组件
private TextView spellListName;
private TextView spellMeaning;
private TextView spellWord;
private TextView spellHint;
private EditText spellText;
private Button spellShowAns;
private ImageButton spellNext;
private ImageButton spellBackToHome;
private java.util.Random random=new java.util.Random();
private int wordId;
//产生一个单词的实例
private Word word;
//设置数据库中的键值对
public void setPref(String PrefName,String key,String value) {
SharedPreferences settings=getSharedPreferences(PrefName,0);
SharedPreferences.Editor editor = settings.edit();
editor.putString(key, value);
editor.commit();
}
//获得一个数据库中的键值对
public String getPref(String PrefName,String key,String defValue) {
SharedPreferences settings=getSharedPreferences(PrefName,0);
String ln=settings.getString(key, defValue);
return ln;
}
//这个和上面的类似,如果键值对存在的话,随机选择一个单词,如果不存在的话,搜查其下一个单词
public Word getNextWord() {
String isRan=getPref(iWord.PREFS_NAME,iWord.IS_RANDOM,"true");
if (isRan=="true") return iWord.wordList.get(random.nextInt(iWord.wordList.size()));
else return iWord.wordList.get((wordId++)%iWord.wordList.size());
}
//刷新显示的界面,
protected void updateDisplay(Word word) {
spellMeaning.setText(word.Meaning);
spellWord.setText("");
spellHint.setText("单词长度为"+word.Word.length()+"位,已输入0位");
spellText.setText("");
spellText.append(word.Word.subSequence(0, 1));
spellText.requestFocus();
InputFilter[] filters = new InputFilter[1];
filters[0] = new InputFilter.LengthFilter(word.Word.length());
spellText.setFilters(filters);
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.spelltest);
try {
initLayout();
} catch (Exception e) {
System.out.println(e);
}
//得到显示在界面上的第一个单词
word=getNextWord();
updateDisplay(word);
}
//初始化界面
private void initLayout() {
spellListName=(TextView)findViewById(R.id.spellListName);
spellListName.setText(getPref(iWord.PREFS_NAME,iWord.LIST_FULL_NAME,"大学英语四级"));
spellMeaning=(TextView)findViewById(R.id.spellMeaning);
spellWord=(TextView)findViewById(R.id.spellWord);
//点击下一个的时候,和“开始背”按钮进行一样的处理
spellNext=(ImageButton)findViewById(R.id.spellNext);
spellNext.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
word=getNextWord();
updateDisplay(word);
}
});
//绑定得到答案的按钮
spellShowAns=(Button)findViewById(R.id.spellShowAns);
spellShowAns.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//这里给出答案
spellWord.setText(word.Word.toString());
}
});
spellHint=(TextView)findViewById(R.id.spellHint);
spellText=(EditText)findViewById(R.id.spellText);
spellText.setSingleLine();
spellText.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
//当你输入的文本有变动的时候,hint会进行响应的提示
spellHint.setText("单词长度为"+word.Word.length()+"位,已输入"+s.length()+"位");
//如果单词就是回答的那个单词的话,用一个hint显示回答正确,并且显示出这个单词
if (s.length()==word.Word.length()){
if (word.Word.contentEquals(s)) {
spellHint.setText("回答正确!");
spellWord.setText(word.Word.toString());
}
//否则,利用hint显示出拼写错误
else {
spellHint.setText("单词长度为"+word.Word.length()+"位,拼写错误");
}
}
}
public void afterTextChanged(Editable s) {
}
public void beforeTextChanged(CharSequence s, int start,int count, int after) {
}
});
//这里通过返回按钮跳转到主菜单,并且将这个Activity撤销
spellBackToHome=(ImageButton)findViewById(R.id.spellBackToHome);
spellBackToHome.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent it=new Intent();
it.setClass(SpellTest.this, iWord.class);
startActivity(it);
SpellTest.this.finish();
}
});
}
}
(4)读入词义测试之后显示的功能:
这里同样略去布局文件的解释,但是,给出源代码:
<?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"
android:background="@drawable/homebg"
android:gravity="center_horizontal">
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageButton android:id="@+id/meaningbackToHome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@anim/backbtn"/>
<TextView android:id="@+id/meaningListName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:textColor="#FFFFFF" />
</LinearLayout>
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/meaning_word_bg"
android:orientation="vertical"
android:layout_marginTop="20dip"
>
<TextView android:id="@+id/meaningWord"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="35sp"
android:layout_marginLeft="35dip"
android:layout_marginTop="10dip"
android:textColor="#000000"/>
<TextView android:id="@+id/meaning"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:layout_marginLeft="35dip"
android:textColor="#888"/>
</LinearLayout>
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal"
>
<Button android:id="@+id/meaning1"
android:layout_height="50dip"
android:layout_width="240dip"/>
<Button android:id="@+id/meaning2"
android:layout_height="50dip"
android:layout_width="240dip"/>
<Button android:id="@+id/meaning3"
android:layout_height="50dip"
android:layout_width="240dip"/>
<Button android:id="@+id/meaning4"
android:layout_height="50dip"
android:layout_width="240dip"/>
</LinearLayout>
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_gravity="bottom"
android:gravity="center_horizontal" >
<ImageButton android:id="@+id/meaningNext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="bottom"
android:background="@anim/nextbtn" />
</LinearLayout>
</LinearLayout>
其内部逻辑功能的实现:
package com.fduandroid.iword;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import com.fduandroid.iword.iWord.Word;
public class MeaningTest extends Activity {
//定义一些TextView和Button组件
private TextView meaningListName;
private TextView meaningWord;
private TextView meaning;
private ImageButton meaningNext;
private Button meaning1;
private Button meaning2;
private Button meaning3;
private Button meaning4;
private ImageButton meaningbackToHome;
private java.util.Random random=new java.util.Random();
private int wordId;
//静态整型变量rightId,初始值设置为0,将每一个问题的四个选项设置为0到3之间
static int rightId=0;
static String rightMeaning;
//同上,这里设置键值对
public void setPref(String PrefName,String key,String value) {
SharedPreferences settings=getSharedPreferences(PrefName,0);
SharedPreferences.Editor editor = settings.edit();
editor.putString(key, value);
editor.commit();
}
//同上,这里获取键值对
public String getPref(String PrefName,String key,String defValue) {
SharedPreferences settings=getSharedPreferences(PrefName,0);
String ln=settings.getString(key, defValue);
return ln;
}
//针对下一个按钮的设置,这里也同上
public Word getNextWord() {
String isRan=getPref(iWord.PREFS_NAME,iWord.IS_RANDOM,"true");
if (isRan=="true") return iWord.wordList.get(random.nextInt(iWord.wordList.size()));
else return iWord.wordList.get((wordId++)%iWord.wordList.size());
}
//得到随机选择的单词的词义
public String getRandomMeaning() {
return iWord.wordList.get(random.nextInt(iWord.wordList.size())).Meaning;
}
//这里刷新显示,显示单词,将该单词的意思先隐藏,获得四个选项的单词的词义,这四个单词都是随机出现的
protected void updateDisplay(iWord.Word word) {
meaningWord.setText(word.Word);
meaning.setText("");
meaning1.setText(getRandomMeaning());
meaning2.setText(getRandomMeaning());
meaning3.setText(getRandomMeaning());
meaning4.setText(getRandomMeaning());
//将每一个按钮设置背景
meaning1.setBackgroundDrawable(getResources().getDrawable(R.drawable.meaningbtn));
meaning2.setBackgroundDrawable(getResources().getDrawable(R.drawable.meaningbtn));
meaning3.setBackgroundDrawable(getResources().getDrawable(R.drawable.meaningbtn));
meaning4.setBackgroundDrawable(getResources().getDrawable(R.drawable.meaningbtn));
//在没有选择选项之前,是无权选择下一个的,所以按钮设置为不可见
meaningNext.setVisibility(View.INVISIBLE);
//随机确定一个正确选择的编号,并将该单词的词义显示在这个按钮之中,接下来,将单词的意思传递给rightMeaning
rightId=random.nextInt(4)+1;
switch (rightId) {
case 1:meaning1.setText(word.Meaning); break;
case 2:meaning2.setText(word.Meaning); break;
case 3:meaning3.setText(word.Meaning); break;
case 4:meaning4.setText(word.Meaning); break;
default:
}
rightMeaning=word.Meaning;
}
//开启界面之后,初始化界面,并显示第一个单词
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.meaningtest);
initLayout();
Word word=getNextWord();
updateDisplay(word);
}
//初始化界面
private void initLayout() {
meaningListName=(TextView)findViewById(R.id.meaningListName);
meaningListName.setText(getPref(iWord.PREFS_NAME,iWord.LIST_FULL_NAME,"大学英语四级"));
meaningWord=(TextView)findViewById(R.id.meaningWord);
meaning=(TextView)findViewById(R.id.meaning);
meaningNext=(ImageButton)findViewById(R.id.meaningNext);
meaningNext.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Word word=getNextWord();
updateDisplay(word);
}
});
//这里是本功能的核心算法,对于每一个按钮设置监听,如果为正确答案的话,就显示正确的按钮背景图标,并且将最上面的图框中的词义给出,并且将下一个设置为可见状态,否则,显示选择错误的图片
meaning1=(Button)findViewById(R.id.meaning1);
meaning1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (rightId==1) {
meaning1.setBackgroundDrawable(getResources().getDrawable(R.drawable.meaningbtn_correct));
meaning.setText(rightMeaning);
meaningNext.setVisibility(View.VISIBLE);
}
else {
meaning1.setBackgroundDrawable(getResources().getDrawable(R.drawable.meaningbtn_wrong));
}
}
});
meaning2=(Button)findViewById(R.id.meaning2);
meaning2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (rightId==2) {
meaning2.setBackgroundDrawable(getResources().getDrawable(R.drawable.meaningbtn_correct));
meaning.setText(rightMeaning);
meaningNext.setVisibility(View.VISIBLE);
}
else {
meaning2.setBackgroundDrawable(getResources().getDrawable(R.drawable.meaningbtn_wrong));
}
}
});
meaning3=(Button)findViewById(R.id.meaning3);
meaning3.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (rightId==3) {
meaning3.setBackgroundDrawable(getResources().getDrawable(R.drawable.meaningbtn_correct));
meaning.setText(rightMeaning);
meaningNext.setVisibility(View.VISIBLE);
}
else {
meaning3.setBackgroundDrawable(getResources().getDrawable(R.drawable.meaningbtn_wrong));
}
}
});
meaning4=(Button)findViewById(R.id.meaning4);
meaning4.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (rightId==4) {
meaning4.setBackgroundDrawable(getResources().getDrawable(R.drawable.meaningbtn_correct));
meaning.setText(rightMeaning);
meaningNext.setVisibility(View.VISIBLE);
}
else {
meaning4.setBackgroundDrawable(getResources().getDrawable(R.drawable.meaningbtn_wrong));
}
}
});
//这里同理,退回到主菜单
meaningbackToHome=(ImageButton)findViewById(R.id.meaningbackToHome);
meaningbackToHome.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent it=new Intent();
it.setClass(MeaningTest.this, iWord.class);
startActivity(it);
MeaningTest.this.finish();
}
});
}
}
UI交互的一些好想法(这里的想法很不错的,点击按钮之后,会显示出两种不同的图片,其实现也非常简单,这里只说明六个按钮的其中一种就可以了)
载入两个图片,分别为按下和具备焦点的状态下产生的
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/homebtn_meaning_active" />
<item android:state_focused="true" android:drawable="@drawable/homebtn_meaning_hover" />
<item android:drawable="@drawable/homebtn_meaning" />
</selector>