您的位置:首页 > 其它

学习Andriod之乐学成语的实现

2016-06-10 17:42 417 查看
一.简要说明一下该小程序的功能。主要有学习、搜索、收藏和帮助四个主页面

实现过程:

 

在已有数据库的情况下,通过DBOpenHelper类实现将数据库idioms到入data/data/<package name>/databases/目录下

  public class DBOpenHelper { private final int BUFFER_SIZE=400000;//缓冲区大小
public static final String DB_NAME="idioms.db";//保存的数据库文件名
public static final String PACKAGE_NAME="cn.edu.bztc.happyidiom";//应用包名
public static final String DB_PATH = "/data"
+ Environment.getDataDirectory().getAbsolutePath() + "/"
+ PACKAGE_NAME + "/databases";//在手机里存放数据库的位置
private Context context;
public DBOpenHelper(Context context) {
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())){//判断数据库文件是否存在,若不存在则执行导入,否则直接打开数据库
InputStream is =context.getResources().openRawResource(R.raw.idioms);

FileOutputStream fos=new FileOutputStream(dbfile);
byte[]buffer=new byte[BUFFER_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 (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;

}

}
首先是初始页面:WelcomeActivity

主要代码为:
setContentView(R.layout.activity_welcome);
RelativeLayout layoutWelcome=(RelativeLayout) findViewById(R.id.layoutWelcome);
AlphaAnimation alphaAnimation=new AlphaAnimation(0.0f,1.0f);
alphaAnimation.setDuration(2000);
layoutWelcome.startAnimation(alphaAnimation);
alphaAnimation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub

}

@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub

}

@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
Intent intent=new Intent(WelcomeActivity.this,MainActivity.class);
startActivity(intent);
finish();
}
}


然后跳转到MainActivity所对应的布局

MainActivity主要代码:

requestWindowFeature(Window.FEATURE_NO_TITLE);//取消标题栏要写在setContentview();



tabHost=getTabHost();//通过getHost()方法获取整个TabHost控件
addTab("study",R.string.title_study,R.drawable.study,StudyActivity.class);//调用自定义的addTab方法添加选项卡,点击每个选项卡分别跳到不同的Activity
addTab("search",R.string.title_search,R.drawable.search,SearchActivity.class);
addTab("game",R.string.title_game,R.drawable.game,GuessActivity.class);
addTab("save",R.string.title_save,R.drawable.save,SaveActivity.class);
addTab("help",R.string.title_help,R.drawable.help,StudyActivity.class);
}



private void addTab(String tag,int title_introduction,int title_icon,Class ActivityClass) {
tabHost.addTab(tabHost
.newTabSpec(tag)
.setIndicator(getString(title_introduction),
getResources().getDrawable(title_icon))
.setContent(new Intent(this,ActivityClass)));

}
效果如下:




然后是各个功能的实现:

学习页面功能的实现:

        主要使用ListView控件,先为每一项建立适配器,显示成语类别, 相应种类的适配器与该适配器建立差不多,具体ListView适配器建法如下:

public class CategoryAdapter extends ArrayAdapter<Category>{
private int resourceId;
public CategoryAdapter(Context context, int textViewResourceId,
List<Category> objects) {
super(context, textViewResourceId, objects);
this.resourceId=textViewResourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Category category=getItem(position);//获取当前Category实例
View view;
ViewHolder viewHolder;
viewHolder=new ViewHolder();
if(convertView==null){

view=LayoutInflater.from(getContext()).i
d230
nflate(resourceId, null);
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());
return view;
}
}
class ViewHolder{
ImageView categoryImage;
TextView categoryName;
}

convertView这个参数可以将加载好的布局进行缓存,如果convertView为空,则用LayoutInflater去加载布局,

否则直接对convertView进行重用。

定义一个ViewHolder内部类,对控件实例进行缓存,当convertView为空时,创建一个ViewHolder对象,并将控件的实例都存放在ViewHolder里,

然后调用View的setTag()方法存储ViewHolder对象。当convertView不为空时,调用View的getTag()方法去除ViewHolder对象。

在StudyActivity里通过findviewById获取ListView控件,通过setOnItemClickListener()方法来监听,当用户点击ListView的任何一个子项时会回调OnItemClick()方法,在这个方法中可通过参数position判断用户点击哪一个子项,利用switch-case-defalut实现跳转到相应类成语Activity

主要代码如下

initCategories();
CategoryAdapter categoryAdapter=new CategoryAdapter(this, R.layout.category_item, categoryList);
ListView listView=(ListView) findViewById(R.id.lvCategories);
listView.setAdapter(categoryAdapter);//将categoryAdapter作为适配器传递给ListView
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position,
long id) {
switch(position){
case 0:
Intent intent=
new Intent(StudyActivity.this,StudyAnimalActivity.class);
startActivity(intent);
break;
case 1:
Intent intent1=
new Intent(StudyActivity.this,StudyNatureActivity.class);
startActivity(intent1);
break;

default:
break;

}

}

});
}


在res目录下建立anim目录,分别建立anim_listview.xml文件和anim_layout_listview.xml使得载入页面出现淡入淡出效果。

anim_listview.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"//动画时间
android:fromAlpha="0.0"
android:toAlpha="1.0">
</alpha>
anim_layout_listview.xml

<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/anim_listview"
android:animationOrder="random"
android:delay="0.2">
</layoutAnimation>


StudyActivity对应xml文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_ling"
tools:content=".StudyActivity" >

<ListView
android:id="@+id/lvCategories"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layoutAnimation="@anim/anim_layout_listview"//使得页面出现淡入淡出效果
android:listSelector="#00000000"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" >
</ListView>

</RelativeLayout>


相应Activity里主要功能是每一项当点击时会显示该成语详细信息的出对话框

AnimalActivity的主要代码

public class StudyAnimalActivity extends Activity{
private List<Animal> animalList;
private AnimalDao animalDao;
private ListView lvAnimalList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_animal);
lvAnimalList=(ListView) findViewById(R.id.lvAnimalList);
initAnimals();
AnimalAdapter animalAdapter=new AnimalAdapter(this, R.layout.animal_item, animalList);
lvAnimalList.setAdapter(animalAdapter);
lvAnimalList.setOnItemClickListener(new OnItemClickListener() {
               @Override
public void onItemClick(AdapterView<?> adapterView, View view, int position,
long id) {
Animal animal=animalList.get(position);
String result=animal.getName()+"\n"+animal.getPronounce()+
"\n【解释】"+animal.getExplain()+
"\n【近义词】"+animal.getHomoionym()+
"\n【反义词】"+animal.getAntonym()+
"\n【出处】"+animal.getDerivation()+
"\n【示例】"+animal.getExamples();
DialogUtil.showDialog(result, StudyAnimalActivity.this);

}
});
}
private void initAnimals() {
animalDao=AnimalDao.getInstance(this);
animalList=animalDao.getAllAnimals();

}






对话框的实现:

public class DialogUtil {
public static void showDialog(String result,Context context){
AlertDialog.Builder builder=new AlertDialog.Builder(context);
LayoutInflater layoutInflater=LayoutInflater.from(context);
View view=layoutInflater.inflate(R.layout.dialog_info, null);
builder.setView(view);
TextView tvIdiomInfo= (TextView) view.findViewById(R.id.tvIdiomInfo);
tvIdiomInfo.setText(result);
builder.setPositiveButton("确定",new OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();

}
});
builder.create().show();
}
}

搜索功能的实现:

SearchActivity

setContentView(R.layout.search);
search_edit=(AutoClearEditText) findViewById(R.id.search_edit);
search=(ImageButton) findViewById(R.id.search);
myWebView1=(WebView) findViewById(R.id.myWebView1);
search.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
String strURI = (search_edit.getText().toString());
strURI = strURI.trim();
if(strURI.length()==0)
{
Toast.makeText(SearchActivity.this, "查询内容不能为空!", Toast.LENGTH_LONG).show();
}
else
{
String strURL = "http://dict.youdao.com/m/search?keyfrom=dict.mindex&q="+strURI;
myWebView1.loadUrl(strURL);
}

}
});

}


GuessActivity主要实现猜谜语功能:
</pre><p></p><p><span style="font-size:14px;">Guess.xml文件主要还是利用ListView控件</span></p><p><span style="font-size:14px;">实现该功能Activity里主要还是和StudyActivity里的代码相同</span></p><p><span style="font-size:18px;">GuessAdapter 主要代码</span></p><p><span style="font-size:18px;"></span></p><pre name="code" class="html">viewHolder4.btnSee.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
toast=Toast.makeText(context, "答案是:" + guess.getName(),Toast.LENGTH_LONG);
toast.setGravity(Gravity.BOTTOM, 0, -300);
LinearLayout toastView =(LinearLayout) toast.getView();
ImageView image=new ImageView(context);
image.setImageResource(R.drawable.dialog_icon);
toastView.addView(image, 0);
toast.show();

}
});

其余代码与其他Adapter相同

点击查看答案:利用Toast显示答案



实现收藏功能

建立OpenHelper类继承SQLiteOpenHelper通过它的onCreate()方法创建saveWordListTable表和自定义方法

主要代码如下:

<pre name="code" class="html">public class DBHelper extends SQLiteOpenHelper {//直接在Andriod中创建数据库和表
public static final String saveWordListTable = "saveWordListTable";
public static final String wordID = "wordID";
public static final String wordName = "wordName";
public static final String wordPronunciation = "wordPronunciation";
public static final String wordExplain = "explain";
public static final String CREATE_SAVE="create table saveWordListTable(" +
"wordID integer ," +
"wordName text," +
"wordPronunciation varchar)";

public DBHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_SAVE);//创建数据库的同时创建表
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub

}
public void addAttentionWord(int wordId,String wordName,String wordPronunciation) {
ContentValues values = new ContentValues();
values.put(DBHelper.wordID ,wordId);
values.put(DBHelper.wordName ,wordName);
values.put(DBHelper.wordPronunciation ,wordPronunciation);
this.getWritableDatabase().insert(
DBHelper.saveWordListTable, null, values);
}
public ArrayList<Word> QueryAllAttentionWord(){
SQLiteDatabase db = this.getReadableDatabase();
ArrayList<Word> List= new ArrayList<Word>();
Cursor cursor =db.rawQuery("select * from saveWordListTable",null);
if (cursor.moveToFirst()){

do{
Word word=new Word();
word.setWordId(cursor.getInt(0));
word.setWordName(cursor.getString(1));
word.setWordPronunciation(cursor.getString(2));
List.add(word);
}
while(cursor.moveToNext());
}
cursor.close();
db.close();

return List;
}
public void deleteAttentionWord(int wordId) {
SQLiteDatabase db = this.getReadableDatabase();

String sql = "delete from saveWordListTable" +
" where wordID="+"'"+wordId+"'";

db.execSQL(sql);

db.close();

}
}



主要功能是当点击

时显示

可加入收藏夹
主要实现代码:在AnimalAdapter中加入该段代码

viewHolder1.btnSave.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Dialog dialog = new AlertDialog.Builder(context)
.setTitle("收藏")
.setMessage("确定要将该成语添加入收藏夹吗?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
/* User clicked OK so do some stuff */

dbHelper.addAttentionWord(list.get(position).getId()//将数据保存在表里
, list.get(position).getName()
, list.get(position).getPronounce());

}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
/* User clicked OK so do some stuff */
}
}).create();
dialog.show();
SaveActivity中实现代码为:

public class SaveActivity extends ListActivity{
    private DBHelper dbHelper;
    private ArrayList<Word> list=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setTitle("收藏夹");
        this.setContentView(R.layout.save);
        setAdapter();
    }
   private void setAdapter() {
        dbHelper=new DBHelper(SaveActivity.this, "saveidioms.db", null, 1);
        list=dbHelper.QueryAllAttentionWord();
        ArrayList<String> showlist=new ArrayList<String>();
        for(int i=0;i<list.size();i++){
            showlist.add((i+1)+"."+list.get(i).getWordName()+"\n"+list.get(i).getWordPronunciation());
        }
        this.setListAdapter(new ArrayAdapter<String>(this, R.layout.save_item, showlist));
    }
   @Override
   protected void onListItemClick(ListView l, View v, final int position, long id) {
    super.onListItemClick(l, v, position, id);
    Dialog dialog = new AlertDialog.Builder(SaveActivity.this)
    .setTitle("操作")
    .setItems(new String[]{"成语删除"}, new DialogInterface.OnClickListener() {
        
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Word word = list.get(position);
            DBHelper md = new DBHelper(SaveActivity.this, "saveidioms.db", null, 1);
            Log.e("成语", "id = "+word.getWordId()+" name =  "+word.getWordName()+" meaning = "+ word.getWordPronunciation());                    
            md.deleteAttentionWord(word.getWordId());
            setAdapter();
        }
    })
    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
        
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // TODO Auto-generated method stub
            
        }
    })
    .create();
    dialog.show();
}

}

注意:继承ListActivity时相对应的save.xml文件里id要用andriod系统自带id

SaveActivity对应的xml文件


<pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#ffffff" >
<TextView
android:id="@+id/tv_Title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25sp"
android:text="收藏夹"
android:background="@drawable/header"

/>

<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>

实现的收藏效果是:




实现该项目是出现的错误:http://blog.csdn.net/lyanyun_520/article/details/51627556
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: