ANDROID 开发一个新闻阅读器 7章 功能补充
在上一讲中,我们介绍了 如何创建一个书签,并在数据库中添加了一张专门存放书签内容的表。
这一章内容中 我们将最后介绍下上方工具栏里的 返回 和 收藏按钮的实现,布局上不会有社么变化,主要是添加后台的逻辑代码。
界面样式:

2.
返回按钮
(关闭当前页,返回上一页)
2.1 后台代码
在MyNewsReaderConstant 下,我们添加如下几个常量:
1 public static String MAIN_NEWS_MARK = "fromMark";
2 public static String MAIN_NEWS_TITLE = "newsTitle";
3 public static String MAIN_NEWS_CONTENT = "newsContent";
修改之前的displayBookShelf(final boolean saveIn) 方法, 添加参数判断 要显示的新闻内容是否为书签中保存的内容
1 public void displayBookShelf(final boolean saveIn){
2
3 bookmark01 = new AlertDialog.Builder(mContext);
4 Cursor cursor2 = null;
5 cursor2 = dbHelper.getStoreInfoByAll();
6 startManagingCursor(cursor2);
7 cursor2.moveToFirst();
8
9 bookmark01.setTitle("我的书签")
10 .setAdapter(new MyStoreAdapter(this,
11 R.layout.popview_news_store,
12 cursor2,
13 new String[]{"_id","NEWSID","NEWSTITLE","NEWSCONTENT"},
14 new int[]{R.id.pop_text}), new DialogInterface.OnClickListener(){
15
16 public void onClick(DialogInterface dialog, int which){
17
18 if(saveIn){
19 //将新闻内容存入书签
20 for(int i = 0; i < 10; i++){
21 if(i == which){
22 Log.v("sssss", "--------------- which : " + which);
23 hm = new HashMap();
24 hm.put("NEWSID", String.valueOf(newsId));
25 hm.put("NEWSTITLE", newsTitle);
26 hm.put("NEWSCONTENT", newsContent);
27 dbHelper.updateStoreInfoById(Long.valueOf(i+1), hm);
28 Toast.makeText(mContext, "添加新书签", Toast.LENGTH_SHORT).show();
29 }
30 }
31 }else{
32 // 通过 dbhelper 操作数据库,根据新闻编号从书签保存表中获取新闻的内容
33 Cursor cursor3 = null;
34 cursor3 = dbHelper.getStoreInfoById(which + 1);
35 cursor3.moveToFirst();
36
37 // cursor 管理方法,控制cursor 的资源释放
38 startManagingCursor(cursor3);
39
40 newsTitle = cursor3.getString(cursor3.getColumnIndex("NEWSTITLE"));
41 newsContent = cursor3.getString(cursor3.getColumnIndex("NEWSCONTENT"));
42
43 if (newsContent == null || "".equals(newsContent)) {
44 Toast.makeText(mContext, "该书签内无内容",
45 Toast.LENGTH_SHORT).show();
46 } else {
47
48 // 读取书签内记录的新闻内容
49 Intent dIntent = new Intent(
50 newsReaderActivity.this,
51 newsReaderActivity.class);
52 Bundle dBundle = new Bundle();
53 // 书签对应的新闻编号
54 dBundle.putLong(
55 MyNewsReaderConstant.MAIN_NEWS_ID,
56 which + 1);
57 // 说明是从书签页进入该页面的
58 dBundle.putString(
59 MyNewsReaderConstant.MAIN_NEWS_MARK,
60 "Y");
61 dBundle.putString(
62 MyNewsReaderConstant.MAIN_NEWS_TITLE,
63 newsTitle);
64 dBundle.putString(
65 MyNewsReaderConstant.MAIN_NEWS_CONTENT,
66 newsContent);
67 dIntent.putExtras(dBundle);
68
69 startActivity(dIntent);
70 }
71
72 }
73
74 }
75 }).show();
76
77 }
给这两个按钮添加监听事件方法:
1 public void setListener(){
2 //添加返回按钮事件
3 detail_back.setOnClickListener(new OnClickListener(){
4
5 @Override
6 public void onClick(View v) {
7 onDestroy();
8 }
9
10 });
11
12 //添加收藏书签按钮事件
13 detail_collection.setOnClickListener(new OnClickListener(){
14
15 @Override
16 public void onClick(View v) {
17 displayBookShelf(false);
18
19 }
20
21 });
22
23 }
24
25
26 同时,每次进入 阅读Activity 后,在调用 onCreate 时候加入一些新的判断:
27 @Override
28 public void onCreate(Bundle savedInstanceState) {
29 super.onCreate(savedInstanceState);
30 setContentView(R.layout.news_detail_reader);
31
32 mContext = this;
33
34 //获取页面上定义的控件资源,包括listview
35 findView();
36
37 //添加按钮监听
38 setListener();
39
40 //获取一个数据库资源,并open
41 dbHelper = new newsDbHelper(mContext);
42 dbHelper.open();
43
44 Intent aIntent = getIntent();
45 Bundle aBundle = aIntent.getExtras();
46 if(aBundle != null){
47 //获取上一个Activity 传递过来的新闻编号
48 newsId = aBundle.getLong(MyNewsReaderConstant.MAIN_NEWS_ID);
49 //检查是不是从书签页跳转过来的
50 fromMark = aBundle.getString(MyNewsReaderConstant.MAIN_NEWS_MARK);
51 }
52
53 if (fromMark != null && "Y".equals(fromMark)) {
54
55 newsTitle = aBundle.getString(MyNewsReaderConstant.MAIN_NEWS_TITLE);
56 newsContent = aBundle.getString(MyNewsReaderConstant.MAIN_NEWS_CONTENT);
57
58 // 页面控件对应布局显示新闻内容
59 news_title.setText(newsTitle);
60 news_content.setText(formatNewsContent(newsContent));
61
62 } else {
63 // 通过 dbhelper 操作数据库,根据新闻编号获取新闻的内容, cursor 是一个数据指针
64 cursor = dbHelper.getNewsDetailById(newsId);
65
66 // cursor 管理方法,控制cursor 的资源释放
67 startManagingCursor(cursor);
68
69 // 指针指向第一笔数据,如果cursor 没有数据,返回false
70 if (cursor.moveToFirst()) {
71
72 // cursor 有数据,说明该新闻之前阅读过,可以直接从数据路获取
73 newsTitle = cursor
74 .getString(cursor.getColumnIndex("NEWSTITLE"));
75 newsContent = cursor.getString(cursor
76 .getColumnIndex("NEWSCONTENT"));
77
78 // 页面控件对应布局显示新闻内容
79 news_title.setText(newsTitle);
80 news_content.setText(formatNewsContent(newsContent));
81 } else {
82 // 显示一个loading框
83 startLoadingDialog();
84
85 // cursor 无数据,从网络获取新闻具体内容
86 // 开启一个线程用来获取网络新闻数据
87 Thread webThread = new Thread(new getWebData());
88 webThread.start();
89 }
90 }
91
92 }
点击收藏按钮, 弹出书签栏:

当点击内容为空的书签,则提示无新闻内容:


点击书签栏内的第一笔记录则,直接显示该笔新闻:

下面贴出完整的 newsReaderActivity.java
newsReaderActivity
1 import java.util.ArrayList;
2 import java.util.HashMap;
3 import java.util.List;
4 import java.util.Map;
5
6 import com.thinkland.demo.mnr.common.ActivitySetting;
7 import com.thinkland.demo.mnr.common.MyNewsReaderConstant;
8 import com.thinkland.demo.mnr.data.newsDataTO;
9 import com.thinkland.demo.mnr.data.newsDbHelper;
10 import com.thinkland.demo.mnr.helper.MyStoreAdapter;
11 import com.thinkland.demo.mnr.net.getWebDataHelperI;
12 import com.thinkland.demo.mnr.net.getWebDataHelperImpl;
13 import com.thinkland.demo.mnr.newsResultListActivity.getWebData;
14
15 import android.app.Activity;
16 import android.app.AlertDialog;
17 import android.app.ProgressDialog;
18 import android.content.Context;
19 import android.content.DialogInterface;
20 import android.content.Intent;
21 import android.database.Cursor;
22 import android.os.Bundle;
23 import android.os.Handler;
24 import android.os.Message;
25 import android.util.Log;
26 import android.view.Menu;
27 import android.view.MenuInflater;
28 import android.view.MenuItem;
29 import android.view.View;
30 import android.view.View.OnClickListener;
31 import android.widget.Button;
32 import android.widget.ListView;
33 import android.widget.TextView;
34 import android.widget.Toast;
35
36 public class newsReaderActivity extends Activity{
37
38 protected static final int threadS1 = 0x2311;
39 protected static final int threadF1 = 0x2312;
40
41 public long newsId;
42 public String fromMark = "N";
43
44 public List<newsDataTO> dataList;
45 public newsDbHelper dbHelper;
46 public Cursor cursor;
47 public ProgressDialog pd;
48 public Button detail_back, detail_collection;
49 public TextView news_title, news_content;
50
51 public Context mContext;
52 public getWebDataHelperI gwdhI;
53
54 String newsTitle;
55 String newsContent;
56
57 AlertDialog.Builder bookmark01;
58
59 @Override
60 public void onCreate(Bundle savedInstanceState) {
61 super.onCreate(savedInstanceState);
62 setContentView(R.layout.news_detail_reader);
63
64 mContext = this;
65
66 //获取页面上定义的控件资源,包括listview
67 findView();
68
69 //添加按钮监听
70 setListener();
71
72 //获取一个数据库资源,并open
73 dbHelper = new newsDbHelper(mContext);
74 dbHelper.open();
75
76 Intent aIntent = getIntent();
77 Bundle aBundle = aIntent.getExtras();
78 if(aBundle != null){
79 //获取上一个Activity 传递过来的新闻编号
80 newsId = aBundle.getLong(MyNewsReaderConstant.MAIN_NEWS_ID);
81 //检查是不是从书签页跳转过来的
82 fromMark = aBundle.getString(MyNewsReaderConstant.MAIN_NEWS_MARK);
83 }
84
85 if (fromMark != null && "Y".equals(fromMark)) {
86
87 newsTitle = aBundle.getString(MyNewsReaderConstant.MAIN_NEWS_TITLE);
88 newsContent = aBundle.getString(MyNewsReaderConstant.MAIN_NEWS_CONTENT);
89
90 // 页面控件对应布局显示新闻内容
91 news_title.setText(newsTitle);
92 news_content.setText(formatNewsContent(newsContent));
93
94 } else {
95 // 通过 dbhelper 操作数据库,根据新闻编号获取新闻的内容, cursor 是一个数据指针
96 cursor = dbHelper.getNewsDetailById(newsId);
97
98 // cursor 管理方法,控制cursor 的资源释放
99 startManagingCursor(cursor);
100
101 // 指针指向第一笔数据,如果cursor 没有数据,返回false
102 if (cursor.moveToFirst()) {
103
104 // cursor 有数据,说明该新闻之前阅读过,可以直接从数据路获取
105 newsTitle = cursor
106 .getString(cursor.getColumnIndex("NEWSTITLE"));
107 newsContent = cursor.getString(cursor
108 .getColumnIndex("NEWSCONTENT"));
109
110 // 页面控件对应布局显示新闻内容
111 news_title.setText(newsTitle);
112 news_content.setText(formatNewsContent(newsContent));
113 } else {
114 // 显示一个loading框
115 startLoadingDialog();
116
117 // cursor 无数据,从网络获取新闻具体内容
118 // 开启一个线程用来获取网络新闻数据
119 Thread webThread = new Thread(new getWebData());
120 webThread.start();
121 }
122 }
123
124 }
125
126 public void findView(){
127 detail_back = (Button)this.findViewById(R.id.detail_back);
128 detail_collection = (Button)this.findViewById(R.id.detail_collection);
129 news_title = (TextView)this.findViewById(R.id.news_title);
130 news_content = (TextView)this.findViewById(R.id.news_content);
131 }
132
133 public void setListener(){
134 //添加返回按钮事件
135 detail_back.setOnClickListener(new OnClickListener(){
136
137 @Override
138 public void onClick(View v) {
139 onDestroy();
140 }
141
142 });
143
144 //添加收藏书签按钮事件
145 detail_collection.setOnClickListener(new OnClickListener(){
146
147 @Override
148 public void onClick(View v) {
149 displayBookShelf(false);
150
151 }
152
153 });
154 }
155
156 /**
157 * 显示一个loading 的弹出框
158 */
159 public void startLoadingDialog(){
160
161 pd = ProgressDialog.show(newsReaderActivity.this, null, MyNewsReaderConstant.PROGRESS_ALERT_LOADING, true,true);
162 }
163
164 /**
165 * 子线程, 用来获取网络新闻数据
166 */
167 public class getWebData implements Runnable{
168
169 @Override
170 public void run() {
171 Message m1 = new Message();
172 Message m2 = new Message();
173 m1.what = threadS1;
174 m2.what = threadF1;
175
176 dataList = new ArrayList<newsDataTO>();
177 boolean sendErrorMsg = false;
178
179 //searchValues 数组,用来存放网络查询参数
180 String[] searchColumns = {"id"};
181 String[] searchValues = {String.valueOf(newsId)};
182 String netUrl = "http://pic.think-land.com/xml.php?";
183
184 gwdhI = new getWebDataHelperImpl();
185 dataList = gwdhI.getNewsDetailByNewsId(searchColumns, searchValues, netUrl);
186
187 if(dataList == null || dataList.size() == 0){
188 messageListener.sendMessage(m2);
189 return;
190 }
191
192 messageListener.sendMessage(m1);
193 }
194
195 }
196
197 Handler messageListener = new Handler(){
198
199 public void handleMessage(Message msg){
200 switch(msg.what){
201 case threadS1:
202 pd.dismiss(); //关闭loading框
203 displayNewsDetail(); //显示新闻阅读页
204 break;
205 case threadF1:
206 pd.dismiss(); //关闭loading框
207 //todo 显示未能查询到记录的信息
208 news_content.setText(getResources().getString(R.string.serverConnectErrorMsg));
209 break;
210 }
211 }
212 };
213
214 public void displayNewsDetail(){
215
216 newsDataTO ndto = (newsDataTO)dataList.get(0);
217
218 //页面控件对应布局显示新闻内容
219 news_title.setText(ndto.getNewsTitle());
220 news_content.setText(formatNewsContent(ndto.getNewsContent()));
221
222 //建立一个存放数据的 HashMap
223 Map hm = new HashMap();
224 hm.put("NEWSID", String.valueOf(ndto.getNewsId()));
225 hm.put("NEWSTYPE", ndto.getNewsType());
226 hm.put("NEWSTITLE", ndto.getNewsTitle());
227 hm.put("NEWSCONTENT", ndto.getNewsContent());
228
229 //插入数据库
230 dbHelper.insertNewsDataFromWeb(newsId, hm);
231 }
232
233 public String formatNewsContent(String newsContent){
234
235 String v1Str = "";
236
237 int loopCount = 0;
238 char[] charArray = newsContent.toCharArray();
239 for(int i=0;i<charArray.length;i++){
240
241 if(charArray[i]== 0x3000 || charArray[i] == ' '){
242 loopCount = loopCount + 1;
243 }else{
244 if(loopCount > 1){
245 v1Str = v1Str + "\n\n" +" ";
246 }else if(loopCount == 1){
247 v1Str = v1Str + " ";
248 }
249
250 v1Str = v1Str + String.valueOf(charArray[i]);
251 loopCount = 0;
252 }
253
254 // if ((charArray[i] >= 0x4e00)&&(charArray[i] <= 0x9fbb))
255 }
256
257 return v1Str;
258 }
259
260 Menu myMenu;
261
262 /*
263 * 重载方法, 创建menu
264 */
265 @Override
266 public boolean onCreateOptionsMenu(Menu menu) {
267
268 MenuInflater inflater = getMenuInflater();
269 inflater.inflate(R.menu.menu, menu);
270 myMenu = menu;
271 return true;
272 }
273
274 @Override
275 public boolean onOptionsItemSelected(MenuItem item) {
276
277 int item_id = item.getItemId();
278 switch (item_id) {
279 case R.id.menu_store:
280 displayBookShelf(true);
281 break;
282 case R.id.menu_share:
283 String text = newsTitle;
284
285 Intent it = new Intent(Intent.ACTION_SEND);
286 it.setType("text/plain");
287 it.putExtra(Intent.EXTRA_TEXT, text);
288 startActivity(Intent.createChooser(it,"选择分享方式"));
289 break;
290 case R.id.menu_close:
291 ActivitySetting.isCloseAll = true;
292 finish();
293 break;
294 }
295 return true;
296 }
297
298
299 HashMap<String, String> hm;
300
301 public void displayBookShelf(final boolean saveIn){
302
303 bookmark01 = new AlertDialog.Builder(mContext);
304 Cursor cursor2 = null;
305 cursor2 = dbHelper.getStoreInfoByAll();
306 startManagingCursor(cursor2);
307 cursor2.moveToFirst();
308
309 bookmark01.setTitle("我的书签")
310 .setAdapter(new MyStoreAdapter(this,
311 R.layout.popview_news_store,
312 cursor2,
313 new String[]{"_id","NEWSID","NEWSTITLE","NEWSCONTENT"},
314 new int[]{R.id.pop_text}), new DialogInterface.OnClickListener(){
315
316 public void onClick(DialogInterface dialog, int which){
317
318 if(saveIn){
319 //将新闻内容存入书签
320 for(int i = 0; i < 10; i++){
321 if(i == which){
322 Log.v("sssss", "--------------- which : " + which);
323 hm = new HashMap();
324 hm.put("NEWSID", String.valueOf(newsId));
325 hm.put("NEWSTITLE", newsTitle);
326 hm.put("NEWSCONTENT", newsContent);
327 dbHelper.updateStoreInfoById(Long.valueOf(i+1), hm);
328 Toast.makeText(mContext, "添加新书签", Toast.LENGTH_SHORT).show();
329 }
330 }
331 }else{
332 // 通过 dbhelper 操作数据库,根据新闻编号从书签保存表中获取新闻的内容
333 Cursor cursor3 = null;
334 cursor3 = dbHelper.getStoreInfoById(which + 1);
335 cursor3.moveToFirst();
336
337 // cursor 管理方法,控制cursor 的资源释放
338 startManagingCursor(cursor3);
339
340 newsTitle = cursor3.getString(cursor3.getColumnIndex("NEWSTITLE"));
341 newsContent = cursor3.getString(cursor3.getColumnIndex("NEWSCONTENT"));
342
343 if (newsContent == null || "".equals(newsContent)) {
344 Toast.makeText(mContext, "该书签内无内容",
345 Toast.LENGTH_SHORT).show();
346 } else {
347
348 // 读取书签内记录的新闻内容
349 Intent dIntent = new Intent(
350 newsReaderActivity.this,
351 newsReaderActivity.class);
352 Bundle dBundle = new Bundle();
353 // 书签对应的新闻编号
354 dBundle.putLong(
355 MyNewsReaderConstant.MAIN_NEWS_ID,
356 which + 1);
357 // 说明是从书签页进入该页面的
358 dBundle.putString(
359 MyNewsReaderConstant.MAIN_NEWS_MARK,
360 "Y");
361 dBundle.putString(
362 MyNewsReaderConstant.MAIN_NEWS_TITLE,
363 newsTitle);
364 dBundle.putString(
365 MyNewsReaderConstant.MAIN_NEWS_CONTENT,
366 newsContent);
367 dIntent.putExtras(dBundle);
368
369 startActivity(dIntent);
370 }
371
372 }
373
374 }
375 }).show();
376
377 }
378
379 @Override
380 public void onResume() {
381 super.onResume();
382 if(ActivitySetting.isCloseAll) {
383 finish();
384 }
385 }
386
387 @Override
388 protected void onDestroy() {
389 super.onDestroy();
390 dbHelper.close();
391 this.finish();
392 }
393 }
posted on 2011-04-07 14:53 thinkland001 阅读(274) 评论(0) 收藏 举报

浙公网安备 33010602011771号