吴昊品工程级别软件项目 Round 4(特别篇) —— iWord项目全解析(另外一个记单词软件)

现在,我们再来看一个比较简单一点的记单词的软件,这个软件的名字叫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();

            }

        });

        //同理,得到图形按钮meaningTestid并且绑定监听

        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 {

    //定义一些TextViewButton组件

 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,将每一个问题的四个选项设置为03之间

 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>

你可能感兴趣的:(round)