Android新闻APP的设计与开发
一、需求分析
1.1项目概述
我做的新闻APP是基于Eclipse安卓开发系统的一款可以查看,添加和删除关注新闻的一款安卓APP,它拥有注册界面,可根据提示注册新用户,点击确定之后会跳转到登录界面并将用户名传到登录界面上,在输入正确的密码后进入新闻界面,可以查看新闻,在查看时可以在查看新闻中点击加关注,添加到关注页面,其中用到了SQList数据库。
1.2用例分析
(1) 用例名称:注册页面
执行者是用户
说明:用户注册一个账号
(2) 用例名称:登录页面
执行者是用户
说明:用户登录成功
请求结果是跳转到新闻主页
(3) 用例名称:新闻主页
执行者是用户
说明:显示新闻列表
请求结果是进入新闻详情页面
(4) 用例名称:详情页面
执行者是用户
说明:一条新闻的详细信息
请求结果可以是加入关注
(5) 用例名称:关注页面
执行者是用户
说明:查看关注的新闻
请求结果是清除关注的新闻
1.3数据库设计
字段名 |
数据类型 |
长度 |
主键 |
索引 |
外键 |
自增 |
说明 |
_id |
Integer |
|
是 |
|
否 |
是 |
数据的id属性 |
text |
Varchar |
80 |
否 |
|
否 |
否 |
新闻的标题 |
image |
Integer |
50 |
否 |
|
否 |
否 |
新闻的图片 |
二、系统设计
2.1注册页面
功能:通过对输入的用户名和密码进行判断,直到满足条件注册成功。成功后通过 DataFile.saveUserInfo();将注册的用户名存储到DataFile.txt文件中,以键值对的形式存储。再利用if语句对输入的字符串进行判断,满足条件后存到响应的txt文件中。
2.2登录页面
功能:注册时将用户名和密码以键值对的形式存到了DataFile.txt中,通过Map<String, String> userInfo = DataFile.getUserInfo(this);
userInfo.get("username");
userInfo.get("password");
获取到用户名和密码,与登录页面填写的进行比较,一致则进入到新闻主页面。
2.3新闻主页
功能:在主页可以通过listview列表查看新闻的要闻,点击列表中的某一项新闻进入该新闻的详情页,其中难点是listview的点击事件:
onItemClick(AdapterView<?> parent, View view, int position,long id)
通过重写这个方法来实现该功能,position表示列表的索引,从0开始,0表示第一列,listview中的内容需要建个类并继承BaseAdapter中的方法。将新闻写入列表中。
2.4新闻详情页
功能:主要是在点击列表进入某一特定新闻是跳转的页面,它展现的是新闻的详细内容,包括图片,出处和具体内容。其中有加入关注按钮,点击按钮就可以将该新闻加入到SQList数据库中,保存到我们建的数据表中,有具体的标题和相关的图片,标题是正常存储,而图片需要将它转换为字节流再进行存储到相应的数据表中,之后统一在关注页面查询。
2.5关注页面
功能:它展现的是加入关注的新闻,也就是在详情页添加到数据库中的数据,通过查看到数据库表和SQLiteDatabase db = helper.getReadableDatabase();语句对数据库的操作,下方加入清除按钮,可以将加入到数据库中的数据清空,通过db.delete("information", null, null);语句完成对数据库的操作。
三、系统测试
3.1注册页面测试
注册页面需要输入用户名和密码,还需要再次确认密码,用户名要求是2-14位的字符,密码是4-16位的字母和数字组成且数字不能是第一位,输入确认的密码必须与密码输入一致。
3.2登录页面测试
用户名在注册后自动获取到的,密码不能为空且与之前输入的密码一致,才可以进入新闻主页
3.3主页面测试
主页面主要展示新闻列表,实现listview的点击事件
3.4新闻详情页面测试
显示主要内容,标题和图片,加入关注按钮的成功使用。
3.5关注页面测试
它展现关注的新闻标题和图片,在数据库中获取到数据并展现到列表中。清空按钮的成功使用,在没有内容时候的提示弹窗。
四、系统实现
4.1 注册页面的实现
String s = yhm.getText().toString();// 输入的用户名和密码的规则 String b = mm.getText().toString(); String a = nmm.getText().toString(); boolean isSaveSuccess = DataFile.saveUserInfo(this, s, b); if (!s.equals("") && !b.equals("") && !a.equals("")) { if (s.length() <= 16 && s.length() >= 2) { if (b.length() >= 4 && b.length() <= 14) { if (a.equals(b)) { if (isSaveSuccess) { Toast.makeText(this, "保存成功", 0).show(); } else { Toast.makeText(this, "保存失败", 0).show(); } Intent intent = new Intent(this, MainActivity.class); startActivity(intent); } else { Toast.makeText(this, "两次密码不一致", 0).show(); } } else { Toast.makeText(this, "密码长度为4到14位", 0).show(); } } else { Toast.makeText(this, "用户名过长或过短", 0).show(); } } else { Toast.makeText(this, "用户名或密码不能为空", 0).show(); }
4.2 登录页面的实现
public void denglu(View veiw) {// 判断是否登录 Map<String, String> userInfo = DataFile.getUserInfo(this); if (userInfo != null) { if (!mm.getText().toString().equals("")) { if (userInfo.get("password").equals(mm.getText().toString())) { Intent intent = new Intent(MainActivity.this, HomePage.class); startActivity(intent); } else { Toast.makeText(this, "密码输入错误", 0).show(); } } else { Toast.makeText(this, "请输入密码", 0).show(); } } }
// 注册完之后将用户名写到登录页面 Map<String, String> userInfo = DataFile.getUserInfo(this); if (userInfo != null) { yhm.setText(userInfo.get("account"));
4.3 新闻主页的实现
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {// listview的点击事件 switch (position) { case 0: Intent intent0 = new Intent(HomePage.this, Details.class); startActivity(intent0); break; default: break; } }
class MyBaseAdapter extends BaseAdapter {// listview添加内容 @Override public int getCount() { return Names.length; } @Override public Object getItem(int position) { return Names[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = View.inflate(HomePage.this, R.layout.news, null); TextView tv = (TextView) view.findViewById(R.id.jianjie); ImageView iv = (ImageView) view.findViewById(R.id.tupian); tv.setText(Names[position]); iv.setBackgroundResource(tps[position]); return view; } }
4.4 详情页面的实现
// 关注按钮 public void guanzhu(View v) { tv1 = (TextView) findViewById(R.id.textView1); String s = tv1.getText().toString(); insert(s, R.id.logo); // insert方法 Toast.makeText(this, "成功关注", 0).show(); }
// 数据添加到数据库 public void insert(String text, Integer it) { MyHelper helper = new MyHelper(this, "xinwen", null, 1); SQLiteDatabase db = helper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("text", text); values.put("image", it); long id = db.insert("information", null, values); db.close(); }
4.5 关注页面的实现
// 查询数据 MyHelper helper = new MyHelper(this, "xinwen", null, 1); SQLiteDatabase db = helper.getReadableDatabase(); Cursor cursor = db.query("information", null, null, null, null, null, null); if (cursor.getCount() != 0) { gztv = (TextView) findViewById(R.id.gz_nr); lv = (ImageView) findViewById(R.id.gz_tp); cursor.moveToFirst(); gztv.setText(cursor.getString(cursor.getColumnIndex("text"))); gztv.append("/n" + cursor.getColumnIndex("text")); lv.setBackgroundResource(R.drawable.f);
// 清除按钮 public void clear(View v) { // 删除数据 MyHelper helper = new MyHelper(this, "xinwen", null, 1); SQLiteDatabase db = helper.getWritableDatabase(); Cursor cursor = db.query("information", null, null, null, null, null,null); if (cursor.getCount() != 0) { int number = db.delete("information", null, null); gztv.setText(""); lv.setBackgroundColor(0); db.close(); } else { Toast.makeText(this, "您还没有关注", 0).show(); } }
五、心得体会
刚开始做课设的时候,是一头雾水,虽然我要设计的app不是很复杂,但是面临的问题还是很多的,给一直很自信的我也带来了压力。开始就做好了挑灯夜战的准备,并给自己做了各方面的计划。开始从网上了解需要的知识,不断的学习,慢慢的开始进入了状态。在做新闻APP期间问题很多。面对这些问题我就心里想一定要解决这些问题,把成果拿出来。对于当时遇到的问题,我都认真分析了一篇,针对某个问题,我都自己预定出一个解决方案,对于遇到问题根本没有人帮你,所以我遇到的问题几乎都是在网上找的答案。主要是解决问题的能力,遇到问题要分析清楚试图找到最优的解决方案。
通过这次的Android课程设计让我更加了解Android开发,了解它的结构、语法和相关知识。让我更加自主的去完成任务,在面临问题的时候去网上寻找答案,我一般遇到问题就会在网上搜答案,一般对于我喜欢在博客和相关技术论坛上搜,当然有时间也在国外的网站随便看看。搜问题其实也讲究方法,对于搜索其实也算是一种经验。