Android開發筆記(十三)樂學成語代碼實現

一.功能需求及技術可行性分析

在開始編碼之前,需要先對程序進行需求分析,思考項目應該具備哪些功能

1.成語分類學習:用戶可根據自己喜歡的分類(動物類,人物類,季節類,自然類,數字類,寓言類,其他類)來進行選擇性學習。

2.成語查詢:用戶可聯網來獲取網絡釋義。

分析完功能需求後,接下來進行技術可行性分析,考慮字庫來源問題,以及如何獲得每個成語的讀音,解釋,近義詞,反義詞等信息。

數據提供如下:https://www.juhe.cn/docs/api/id/157

在線成語如下:http://cy.5156edu.com/

              http://chengyu.t086.com/miyu

 

二.主要實現的功能

基礎功能:文檔中示範的基礎功能全部完成

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章