一.功能需求及技術可行性分析
在開始編碼之前,需要先對程序進行需求分析,思考項目應該具備哪些功能
1.成語分類學習:用戶可根據自己喜歡的分類(動物類,人物類,季節類,自然類,數字類,寓言類,其他類)來進行選擇性學習。
2.成語查詢:用戶可聯網來獲取網絡釋義。
分析完功能需求後,接下來進行技術可行性分析,考慮字庫來源問題,以及如何獲得每個成語的讀音,解釋,近義詞,反義詞等信息。
數據提供如下:https://www.juhe.cn/docs/api/id/157
在線成語如下:http://cy.5156edu.com/
二.主要實現的功能
基礎功能:文檔中示範的基礎功能全部完成
1.使用TabHost進行標籤顯示主頁
2.使用listview顯示學習列表
3.顯示本地數據庫中的成語學習資料
擴展功能:
1.添加滑動歡迎頁面(擴展功能)
2.添加網絡釋義(擴展功能)
三.主要功能實現代碼解析
1.建立數據庫文件,加載數據庫到項目中,在res目錄下建立一個raw文件夾,
新建DBOpenHelper實現將數據庫文件從raw目錄拷貝到手機裏存放數據庫的位置
public class DBOpenHelper {
private final int BuFFWER_SIZE=400000;//緩衝區大小
public static final String DB_NAME="idioms.db";//保存的數據庫文件名
public static final StringPACKAGE_Name="cn.deu.bztc.happyidiom.activity";
//應用的包名
public static final String DB_PATH="/data"
+Environment.getDataDirectory().getAbsolutePath()+"/"
+PACKAGE_Name+"/databases";//在手機裏存放數據庫的位置
private Context context;
public DBOpenHelper(Context context) {
super();
this.context = context;
}
public SQLiteDatabase openDatabase(){
try{
File myDataPath=new File(DB_PATH);
if(!myDataPath.exists()){
myDataPath.mkdirs(); //如果沒有這個目錄則創建
}
String dbfile=myDataPath+"/"+DB_NAME;
if(!(new File(dbfile).exists())){
//判斷數據庫文件是否存在,若不存在則執行導入,否則直接打開數據庫
InputStreamis=context.getResources().openRawResource(R.raw.idioms);
FileOutputStream fos=newFileOutputStream(dbfile);
byte[] buffer=newbyte[BuFFWER_SIZE];
int count=0;
while((count=is.read(buffer))>0){
fos.write(buffer, 0,count);
}
fos.close();
is.close();
}
SQLiteDatabase db=SQLiteDatabase.openOrCreateDatabase(dbfile, null);
return db;
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return null;
}
}
2.org.gerrysu.happyidiom.entity建立實體類
3.在org.gerrysu.happyidiom.Dao下建立操作類AnimalDao,完成對數據庫的創建。
4.可進行單元測試測試數據庫是否導入成功
5.編寫activity_main.xml
,定義TabHost
6.建立MainActivity,使用TabHost組件,在這個onCreate方法中,通過調用getTabHost()方法來獲取整個TabHost組件
public class MainActivity extendsTabActivity{
privateTabHost tabHost;
protectedvoid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//取消標題欄
setContentView(R.layout.activity_main);
tabHost= getTabHost();
addTab("study",R.string.title_study,R.drawable.study,StudyActivity.class);
addTab("study",R.string.title_search,R.drawable.search,StudyActivity.class); addTab("study",R.string.title_game,R.drawable.game,StudyActivity.class);
addTab("study",R.string.title_save,R.drawable.save,StudyActivity.class);
addTab("study",R.string.title_help,R.drawable.help,StudyActivity.class);
}
privatevoid addTab(String tag, int title_introduction,int title_icon, ClassActivityClass) {
//TODO Auto-generated method stub
tabHost.addTab(tabHost.newTabSpec(tag)
.setIndicator(getString(title_introduction),
getResources().getDrawable(title_icon))
.setContent(newIntent(this,ActivityClass)));}
7.在AndroidManifest下注冊MainActivity,此時可運行程序查看效果
8.對LisyView進行定製,顯示學習列表
修改Values下的strings,定義列表的文字內容,新建Category實體類,用來封裝列表中的文字和圖片。新建activity_study.xml,定義一個ListView控件,然後爲ListView自定義一個佈局文件category_item.xml。
9.新建CategoryAdapter創建自定義適配器,繼承自ArrayAdapter
通過getItem()方法得到當前項的Category的實例,然後使用LayoutInflater來爲這個子項加載傳入的佈局。
public class CategoryAdapter extendsArrayAdapter<Category>{
privateint resourceId;
publicCategoryAdapter(Context context, int resource,List<Category>objects) {
super(context,resource,objects);
resourceId = resource;
//TODO Auto-generated constructor stub
}
publicView getView(int position,View convertView,ViewGroup parent){
Categorycategory = getItem(position);//獲取當前項的Category實例
Viewview;
ViewHolderviewHolder;
if(convertView== null){
view= LayoutInflater.from(getContext()).inflate(resourceId, null);
viewHolder= new ViewHolder();
viewHolder.categoryImage= (ImageView)view.findViewById(R.id.category_image);
viewHolder.categoryName= (TextView)view.findViewById(R.id.category_name);
view.setTag(viewHolder);//將ViewHolder存儲在View中
}else{
view= convertView;
viewHolder= (ViewHolder)view.getTag();//重新拾取ViewHolder
}
viewHolder.categoryImage.setImageResource(category.getImageId());
viewHolder.categoryName.setText(category.getName());
returnview;
}
classViewHolder{
ImageViewcategoryImage;
TextViewcategoryName;
}
}
10.下面新建study活動
添加一個initCategories方法,用於初始化所有類別的數據
使用setOnItemClickListener()方法來爲ListView註冊監聽器,當用戶點擊就會回調onItemClick()方法,在這個方法中可以通過position參數判斷出用戶點擊的是哪一子項,然後獲取到相應的類別,並通過Toast將類別的名字顯示出來。
/* 定製ListView頁面
*/
public class StudyActivity extendsActivity{
privateList<Category> categoryList;
privateString[] category_names;
privateint[] category_images;
protectedvoid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_study);
initCategories();//初始化類別
CategoryAdapteradapter =new CategoryAdapter(this, R.layout.category_item, categoryList);
ListViewlistView = (ListView)findViewById(R.id.ivCategories);
listView.setAdapter(adapter);
listView.setOnItemClickListener(newOnItemClickListener() {
@Override
publicvoid onItemClick(AdapterView<?> adapterView, View view, int posotion,
longid) {
switch(posotion) {
case0:
Intentintent = new
Intent(StudyActivity.this,StudyAnimalActivity.class);
startActivity(intent);
break;
default:
break;
}
}
});
}
privatevoid initCategories() {
//TODO Auto-generated method stub
categoryList= new ArrayList<Category>();
Resourcesresoures = getResources();
category_names= resoures.getStringArray(R.array.category);
category_images=new int[]{R.drawable.category_animal,
R.drawable.category_nature,R.drawable.category_human,
R.drawable.category_season,R.drawable.category_number,
R.drawable.category_fable,R.drawable.category_other};
for(int i=0; i<category_names.length;i++){
categoryList.add(new Category(category_names[i],category_images[i]));
}
}
}
11.去掉點擊出現的橙色的背景色,在activity_study.xml中添加代碼:android:listSelevtor=”#00000000”
12.增加界面淡入淡出的動畫效果。在res目錄下新建anim目錄, 新建anim_listview.xml設置動畫效果,再在study_activity.xml中引用
<?xml version="1.0"encoding="utf-8"?>
<alphaxmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromAlpha="0.0"
android:toAlpha="1.0"></alpha>
13.將學習界面與之前建立的主界面連起來,再通過intent將選項卡和studyactivity關聯起來。
private void addTab(String tag, inttitle_introduction,int title_icon, Class ActivityClass) {
//TODO Auto-generated method stub
tabHost.addTab(tabHost.newTabSpec(tag)
.setIndicator(getString(title_introduction),
getResources().getDrawable(title_icon))
.setContent(newIntent(this,ActivityClass)));
}
14.顯示所有動物類成語的列表
在layout下新建activity_animal.xml,主要添加一個ListView控件,然後爲ListView的子項指定自定義佈局animal_item.xml
15.新建AnimalAdater 並將泛型指向Animal類,實現過程與CategoryAdapter類似。
16顯示每條成語的詳情信息,新建dialog_info.xml,修改StudyAnimalActivity,增加點擊事件處理
17,修改圖標名字,打包完成。
四.擴展功能
1.增加滑動歡迎界面
新建AndyViewPagerActivity,使用ViewPager控件實現
2.擴展功能,網絡釋義
新建activity_search.xml,定義一個WebView,然後新建SearchActivity
public void searchWord(View view) {
Stringword = etWord.getText().toString();
if(TextUtils.isEmpty(word)) {
Toast.makeText(this,"查詢內容不能爲空!", Toast.LENGTH_LONG).show();
}else {
finalString strUrl =
"http://dict.baidu.com/s?wd="+word+"&ptype=idiom";
wvResult.loadUrl(strUrl);
}
}
五.參考文獻
1. Android綜合項目樂學成語
2.Android移動開發項目式教程
六附上源代碼
鏈接:https://pan.baidu.com/s/1qZzyojU 密碼:mhhh