Android-数据存储与访问:快乐动物成语
2017-05-05 20:43
239 查看
本次任务是完成一款成语介绍的app,界面为成语选择,点击想要明白的成语,会出现此成语的解释
![](https://img-blog.csdn.net/20170505200944494?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTWlzQ29kZXI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20170505200958525?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTWlzQ29kZXI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
首先先将已经得到的成语数据库存入手机内存中,即在db包下建立一个DBOpenHelper类
搭建单元测试环境,测试数据库有没有创建到指定路径下
接下来新建一个DBOpenHelperTest类,继承AndroidTestCase,封装一个test方法,调用了DBOpenHelper类的openDatabase方法
构建Animal实体类,以及AnimalDao类,将一些常用的数据库操作封装起来,将他的构造方法私有化
接下来呢,我们开始写主界面,将数据库中所有的动物类成语显示在界面上activity_animal.xml和animal_item.xml。
为了使界面载入过程生动形象,我们可以增加淡入淡出的动画效果
在res目录下新建anim目录,在下面创建anim_listview.xml文件
设置了一个Alpha动画,从无到有的过程。
创建anim_layout_listview.xml文件,
上述代码主要是设置了布局动画,引用了之前的Alpha动画,设置每一项出现的时间间隔和出现的顺序。
接下来,我们创建一个自定义的适配器,这个适配器继承自ArrayAdapter,泛型指定为Animal类
下面在activity包下新建StudyAnimalActivity继承自Activity
可以看出来,这里添加了一个initAnimal()方法,用于初始化所有动物数据。
这里DialogUtil.showDialog()方法是自定义的方法。
然后获取ListView控件,建立AnimalAdapter关联子布局及数据,调用ListView控件的setAdapter()方法与关联数据,这样定制ListView界面的任务就完成了。
接下来,该做实现点击每条成语以对话框的形式显示该成语的详细信息:dialog_info.xml
可以看到,最外层是ScrollView组件,当内容较多时会自动出现垂直滚动条。
这样这个快乐动物成语app就完成了,步骤很复杂,连环实现一套程序,才能达到需要的结果,做程序的就是不能怕麻烦,一点一点的做下来,最后终会成功!
首先先将已经得到的成语数据库存入手机内存中,即在db包下建立一个DBOpenHelper类
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.bzu.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 openDatabases(){ 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){ Log.e("Database","Filenotfound"); e.printStackTrace(); }catch (IOException e){ Log.e("Database","IOexception"); e.printStackTrace(); } return null; } }
搭建单元测试环境,测试数据库有没有创建到指定路径下
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.edu.bzu.happyidiom" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="18"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <uses-library android:name="android.test.runner"/> <activity android:name=".activity.StudyAnimalActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="cn.edu.bzu.happyidiom"></instrumentation> </manifest>
接下来新建一个DBOpenHelperTest类,继承AndroidTestCase,封装一个test方法,调用了DBOpenHelper类的openDatabase方法
public class DBOpenHelperTest extends AndroidTestCase { public void testDBCopy(){ DBOpenHelper dbOpenHelper=new DBOpenHelper(getContext()); dbOpenHelper.openDatabases(); } }
构建Animal实体类,以及AnimalDao类,将一些常用的数据库操作封装起来,将他的构造方法私有化
public class AnimalDao { private static AnimalDao animalDao; private SQLiteDatabase db; private AnimalDao(Context context){ DBOpenHelper dbHelper=new DBOpenHelper(context); db=dbHelper.openDatabases(); } public synchronized static AnimalDao getInstance(Context context){ if (animalDao==null){ animalDao=new AnimalDao(context); } return animalDao; } public List<Animal> getAllAnimals() { List<Animal> list = new ArrayList<Animal>(); Cursor cursor = db.query("animal", null, null, null, null, null, null); if (cursor.moveToFirst()) { do { Animal animal = new Animal(); animal.setId(cursor.getInt(cursor.getColumnInd ce71 ex("_id"))); animal.setName(cursor.getString(cursor .getColumnIndex("name"))); animal.setPronounce(cursor.getString(cursor .getColumnIndex("pronounce"))); animal.setAntonym(cursor.getString(cursor .getColumnIndex("antonym"))); animal.setHomoionym(cursor.getString(cursor .getColumnIndex("homoionym"))); animal.setDerivation(cursor.getString (cursor.getColumnIndex("derivation"))); animal.setExamples(cursor.getString (cursor.getColumnIndex("examples"))); list.add(animal); } while (cursor.moveToNext()); } return list; } }
接下来呢,我们开始写主界面,将数据库中所有的动物类成语显示在界面上activity_animal.xml和animal_item.xml。
为了使界面载入过程生动形象,我们可以增加淡入淡出的动画效果
在res目录下新建anim目录,在下面创建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>
设置了一个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>
上述代码主要是设置了布局动画,引用了之前的Alpha动画,设置每一项出现的时间间隔和出现的顺序。
接下来,我们创建一个自定义的适配器,这个适配器继承自ArrayAdapter,泛型指定为Animal类
public class AnimalAdapter extends ArrayAdapter<Animal> { private int resourceId; public AnimalAdapter(Context context, int resource, List<Animal>objects) { super(context, resource, objects); resourceId=resource; } public View getView(int position, View convertView, ViewGroup parent){ Animal animal=getItem(position); View view; ViewHolder viewHolder; if (convertView==null){ view= LayoutInflater.from(getContext()).inflate(resourceId,null); viewHolder=new ViewHolder(); viewHolder.tvName=(TextView)view.findViewById(R.id.tvName); viewHolder.btnSave=(ImageButton)view.findViewById(R.id.btnSave); view.setTag(viewHolder); }else{ view=convertView; viewHolder=(ViewHolder)view.getTag(); } viewHolder.tvName.setText(animal.getName()); //取消获取焦点的组件,为了实现点击每个成语从而弹出对话框 viewHolder.btnSave.setFocusable(false); viewHolder.btnSave.setFocusableInTouchMode(false); return view; } class ViewHolder { TextView tvName; ImageButton btnSave; } }
下面在activity包下新建StudyAnimalActivity继承自Activity
public class StudyAnimalActivity extends Activity { private List<Animal>animalList; private AnimalDao animalDao; private ListView lvAnimalList; protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_animal); initAnimals(); lvAnimalList=(ListView)findViewById(R.id.lvAnimalList); AnimalAdapter animalAdapter=new AnimalAdapter(this,R.layout.animal_item,animalList); lvAnimalList.setAdapter(animalAdapter); //增加点击事件处理 lvAnimalList.setOnItemClickListener(new AdapterView.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(); } }
可以看出来,这里添加了一个initAnimal()方法,用于初始化所有动物数据。
这里DialogUtil.showDialog()方法是自定义的方法。
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 DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.create().show(); } }
然后获取ListView控件,建立AnimalAdapter关联子布局及数据,调用ListView控件的setAdapter()方法与关联数据,这样定制ListView界面的任务就完成了。
接下来,该做实现点击每条成语以对话框的形式显示该成语的详细信息:dialog_info.xml
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/bg_ling" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tvIdiomInfo" android:text="MediumText" android:textAppearance="?android:attr/textAppearanceMedium"/> </LinearLayout> </ScrollView>
可以看到,最外层是ScrollView组件,当内容较多时会自动出现垂直滚动条。
这样这个快乐动物成语app就完成了,步骤很复杂,连环实现一套程序,才能达到需要的结果,做程序的就是不能怕麻烦,一点一点的做下来,最后终会成功!
相关文章推荐
- android 数据存储和访问方式五:网络详解
- android 数据存储和访问方式二:SharedPreferences(共享参数)详解
- Android数据存储与访问操作——存放在SDCard
- Android数据存储与访问
- Android学习 —— 数据的存储与访问方式三: SQLite数据库
- android 数据存储和访问方式一:文件详解
- android数据存储与访问之使用pull解析器
- Android中数据的存储与访问方式汇总教程(细分为6种方式)
- android数据存储与访问之使用ContentProvider
- [120_移动开发Android]006_android开发之数据存储之sdcard访问
- android 数据存储和访问方式四:ContentProvider(内容提供者、数据共享)详解
- android数据存储与访问之使用普通文件
- android 数据的存储和访问以及单元测试的引入
- Android学习 —— 数据的存储与访问方式三: SQLite数据库
- android数据存储与访问
- Android数据存储与访问
- Android 学习笔记7---数据存储与访问
- Android 数据存储与访问 SharedPreferences
- Android入门(4) 布局、JUnit、日志与数据存储访问方式
- Android(二)数据存储和访问 之文件