这节我们主要讨论收藏与历史记录页面的边边角角。
首先,看看他的最终的效果图了:
照例了,我们先看看他的布局文件:
1 <!-- tab布局文件 -->
2 <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
3 android:id="@android:id/tabhost"
4 android:layout_width="fill_parent"
5 android:layout_height="fill_parent">
6 <LinearLayout
7 android:orientation="vertical"
8 android:layout_width="fill_parent"
9 android:layout_height="fill_parent"
10 android:padding="5dp">
11 <TabWidget
12 android:id="@android:id/tabs"
13 android:layout_width="fill_parent"
14 android:layout_height="wrap_content" />
15 <!-- 相应桢布局 -->
16 <FrameLayout
17 android:id="@android:id/tabcontent"
18 android:layout_width="fill_parent"
19 android:layout_height="fill_parent"
20 android:padding="5dp" />
21 </LinearLayout>
22 </TabHost>
相应的布局文件说明如下:
别开这是一个布局文件其实涉及另外两个布局文件,相应布局文件是左右两边布局文件。他两个布局文件源代码又是怎么样了?一个是书签页面的布局文件,一个是历史记录的布局文件。但是布局文件共拥有一个布局文件。
相应源代码如下:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 android:layout_width="fill_parent"
3 android:layout_height="fill_parent">
4 <!-- list 控件 -->
5 <ListView
6 android:id="@+id/BookmarksListActivity.List"
7 android:layout_width="fill_parent"
8 android:layout_height="fill_parent"/>
9 <!-- 文本控件 -->
10 <TextView android:id="@+id/BookmarksListActivity.EmptyTextView"
11 android:layout_width="fill_parent"
12 android:layout_height="wrap_content"
13 android:gravity="center_horizontal"
14 android:layout_gravity="center_vertical"
15 android:text="@string/BookmarksListActivity.Empty"/>
16
17 </LinearLayout>
一个list控件加一个文本控件就ok了。
布局文件,一直都不是android工程中重头戏。java文件又是什么样子了?
我们来看看他所涉及的相应的java文件。
首先,我们看一下书签历史记录页面的java 源代码,他在这里的控制作用也只有一种抛砖引玉的作用了.
1 /**
2 * 这是一个historyactivity
3 */
4 public class BookmarksHistoryActivity extends TabActivity {
5
6 /**
7 * 创建的方法
8 */
9 @Override
10 protected void onCreate(Bundle savedInstanceState) {
11 super.onCreate(savedInstanceState);
12
13 if (Controller.getInstance().getPreferences().getBoolean(Constants.PREFERENCES_SHOW_FULL_SCREEN, false)) {
14 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
15 }
16
17 if (Controller.getInstance().getPreferences().getBoolean(Constants.PREFERENCES_GENERAL_HIDE_TITLE_BARS, true)) {
18 requestWindowFeature(Window.FEATURE_NO_TITLE);
19 }
20
21 setContentView(R.layout.bookmarks_history_activity);
22
23 setTitle(R.string.BookmarksListActivity_Title);
24
25 Resources res = getResources();
26 TabHost tabHost = getTabHost();
27 TabHost.TabSpec spec;
28 Intent intent;
29
30 // Bookmarks
31 intent = new Intent().setClass(this, BookmarksListActivity.class);
32
33 spec = tabHost.newTabSpec("bookmarks").setIndicator(res.getString(R.string.Main_MenuShowBookmarks),
34 res.getDrawable(R.drawable.ic_tab_bookmarks))
35 .setContent(intent);
36 tabHost.addTab(spec);
37
38 // History
39 intent = new Intent().setClass(this, HistoryListActivity.class);
40
41 spec = tabHost.newTabSpec("history").setIndicator(res.getString(R.string.Main_MenuShowHistory),
42 res.getDrawable(R.drawable.ic_tab_history))
43 .setContent(intent);
44 tabHost.addTab(spec);
45
46 if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(Constants.PREFERENCE_USE_WEAVE, false)) {
47 // Weave bookmarks
48 intent = new Intent().setClass(this, WeaveBookmarksListActivity.class);
49
50 spec = tabHost.newTabSpec("weave").setIndicator(res.getString(R.string.WeaveBookmarksListActivity_Title),
51 res.getDrawable(R.drawable.ic_tab_weave))
52 .setContent(intent);
53 tabHost.addTab(spec);
54 }
55
56 tabHost.setCurrentTab(0);
57
58 tabHost.setOnTabChangedListener(new OnTabChangeListener() {
59 @Override
60 public void onTabChanged(String tabId) {
61 if (tabId.equals("bookmarks")) {
62 setTitle(R.string.BookmarksListActivity_Title);
63 } else if (tabId.equals("history")) {
64 setTitle(R.string.HistoryListActivity_Title);
65 } else if (tabId.equals("weave")) {
66 setTitle(R.string.WeaveBookmarksListActivity_Title);
67 } else {
68 setTitle(R.string.ApplicationName);
69 }
70 }
71 });
72 }
73
74 /**
75 * 配置文件改变的方法
76 */
77 @Override
78 public void onConfigurationChanged(Configuration newConfig) {
79 super.onConfigurationChanged(newConfig);
80 }
81 }
我们可以总结出来以下几个结果:
①在oncreate这个方法中,能否全频,能否有标题,这些设置的配置的参数就是存在与preference这个参数中的,可以sharedpreference这个对象保存配置参数,这也是android官方推荐的一种方式。
②一看这个布局的方式,这是一个典型tab布局,因此我们要实例化相应tabhost文件,并且为相应tabhost赋值事件,进入不同的intent,并且进入不同的界面后,赋值相应的标题。
③将相应的配置文件改变以后的,父类的配置文件也进行相应的改变。
由于要跳往不同的界面,所以就需要两个文件控制。
首先看一下 BookmarksListActivity中的控制文件,相应的源代码如下:
1 public class BookmarksListActivity extends Activity {
2
3 private static final int MENU_ADD_BOOKMARK = Menu.FIRST;
4 private static final int MENU_SORT_MODE = Menu.FIRST + 1;
5
6 private static final int MENU_OPEN_IN_TAB = Menu.FIRST + 10;
7 private static final int MENU_COPY_URL = Menu.FIRST + 11;
8 private static final int MENU_SHARE = Menu.FIRST + 12;
9 private static final int MENU_EDIT_BOOKMARK = Menu.FIRST + 13;
10 private static final int MENU_DELETE_BOOKMARK = Menu.FIRST + 14;
11
12 private static final int ACTIVITY_ADD_BOOKMARK = 0;
13 private static final int ACTIVITY_EDIT_BOOKMARK = 1;
14
15 private Cursor mCursor;
16 private BookmarksCursorAdapter mCursorAdapter;
17
18 private ListView mList;
19
20 @Override
21 public void onCreate(Bundle savedInstanceState) {
22 super.onCreate(savedInstanceState);
23 setContentView(R.layout.bookmarks_list_activity);
24
25 setTitle(R.string.BookmarksListActivity_Title);
26
27 View emptyView = findViewById(R.id.BookmarksListActivity_EmptyTextView);
28 mList = (ListView) findViewById(R.id.BookmarksListActivity_List);
29
30 mList.setEmptyView(emptyView);
31
32 mList.setOnItemClickListener(new OnItemClickListener() {
33
34 @Override
35 public void onItemClick(AdapterView<?> l, View v, int position, long id) {
36 Intent result = new Intent();
37 result.putExtra(Constants.EXTRA_ID_NEW_TAB, false);
38
39 BookmarkItem item = BookmarksProviderWrapper.getStockBookmarkById(getContentResolver(), id);
40 if (item != null) {
41 result.putExtra(Constants.EXTRA_ID_URL, item.getUrl());
42 } else {
43 result.putExtra(Constants.EXTRA_ID_URL,
44 PreferenceManager.getDefaultSharedPreferences(BookmarksListActivity.this).getString(Constants.PREFERENCES_GENERAL_HOME_PAGE, Constants.URL_ABOUT_START));
45 }
46
47 if (getParent() != null) {
48 getParent().setResult(RESULT_OK, result);
49 } else {
50 setResult(RESULT_OK, result);
51 }
52
53 finish();
54 }
55 });
56
57 registerForContextMenu(mList);
58
59 fillData();
60 }
61
62 @Override
63 protected void onDestroy() {
64 mCursor.close();
65 super.onDestroy();
66 }
67
68 /**
69 * Fill the bookmark to the list UI.
70 */
71 private void fillData() {
72 mCursor = BookmarksProviderWrapper.getStockBookmarks(getContentResolver(),
73 PreferenceManager.getDefaultSharedPreferences(this).getInt(Constants.PREFERENCES_BOOKMARKS_SORT_MODE, 0));
74 startManagingCursor(mCursor);
75
76 String[] from = new String[] { Browser.BookmarkColumns.TITLE, Browser.BookmarkColumns.URL};
77 int[] to = new int[] {R.id.BookmarkRow_Title, R.id.BookmarkRow_Url};
78
79 mCursorAdapter = new BookmarksCursorAdapter(this,
80 R.layout.bookmark_row,
81 mCursor,
82 from,
83 to,
84 ApplicationUtils.getFaviconSizeForBookmarks(this));
85
86 mList.setAdapter(mCursorAdapter);
87
88 setAnimation();
89 }
90
91 /**
92 * Set the list loading animation.
93 */
94 private void setAnimation() {
95 AnimationSet set = new AnimationSet(true);
96
97 Animation animation = new AlphaAnimation(0.0f, 1.0f);
98 animation.setDuration(100);
99 set.addAnimation(animation);
100
101 animation = new TranslateAnimation(
102 Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f,
103 Animation.RELATIVE_TO_SELF, -1.0f, Animation.RELATIVE_TO_SELF, 0.0f
104 );
105 animation.setDuration(100);
106 set.addAnimation(animation);
107
108 LayoutAnimationController controller =
109 new LayoutAnimationController(set, 0.5f);
110
111 mList.setLayoutAnimation(controller);
112 }
113
114 /**
115 * Display the add bookmark dialog.
116 */
117 private void openAddBookmarkDialog() {
118 Intent i = new Intent(this, EditBookmarkActivity.class);
119
120 i.putExtra(Constants.EXTRA_ID_BOOKMARK_ID, (long) -1);
121 i.putExtra(Constants.EXTRA_ID_BOOKMARK_TITLE, "");
122 i.putExtra(Constants.EXTRA_ID_BOOKMARK_URL, "");
123
124 startActivityForResult(i, ACTIVITY_ADD_BOOKMARK);
125 }
126
127 @Override
128 public boolean onCreateOptionsMenu(Menu menu) {
129 super.onCreateOptionsMenu(menu);
130
131 MenuItem item;
132 item = menu.add(0, MENU_ADD_BOOKMARK, 0, R.string.BookmarksListActivity_MenuAddBookmark);
133 item.setIcon(R.drawable.ic_menu_add_bookmark);
134
135 item = menu.add(0, MENU_SORT_MODE, 0, R.string.BookmarksListActivity_MenuSortMode);
136 item.setIcon(R.drawable.ic_menu_sort);
137
138 return true;
139 }
140
141 @Override
142 public boolean onMenuItemSelected(int featureId, MenuItem item) {
143
144 switch(item.getItemId()) {
145 case MENU_SORT_MODE:
146 changeSortMode();
147 return true;
148
149 case MENU_ADD_BOOKMARK:
150 openAddBookmarkDialog();
151 return true;
152
153 default: return super.onMenuItemSelected(featureId, item);
154 }
155 }
156
157 @Override
158 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
159 super.onCreateContextMenu(menu, v, menuInfo);
160
161 long id = ((AdapterContextMenuInfo) menuInfo).id;
162 if (id != -1) {
163 BookmarkItem item = BookmarksProviderWrapper.getStockBookmarkById(getContentResolver(), id);
164 if (item != null) {
165 menu.setHeaderTitle(item.getTitle());
166 }
167 }
168
169 menu.add(0, MENU_OPEN_IN_TAB, 0, R.string.BookmarksListActivity_MenuOpenInTab);
170 menu.add(0, MENU_COPY_URL, 0, R.string.BookmarksHistoryActivity_MenuCopyLinkUrl);
171 menu.add(0, MENU_SHARE, 0, R.string.Main_MenuShareLinkUrl);
172 menu.add(0, MENU_EDIT_BOOKMARK, 0, R.string.BookmarksListActivity_MenuEditBookmark);
173 menu.add(0, MENU_DELETE_BOOKMARK, 0, R.string.BookmarksListActivity_MenuDeleteBookmark);
174 }
175
176 @Override
177 public boolean onContextItemSelected(MenuItem item) {
178 AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
179
180 Intent i;
181 BookmarkItem bookmarkItem = BookmarksProviderWrapper.getStockBookmarkById(getContentResolver(), info.id);
182
183 switch (item.getItemId()) {
184 case MENU_OPEN_IN_TAB:
185 i = new Intent();
186 i.putExtra(Constants.EXTRA_ID_NEW_TAB, true);
187
188 if (bookmarkItem != null) {
189 i.putExtra(Constants.EXTRA_ID_URL, bookmarkItem.getUrl());
190 } else {
191 i.putExtra(Constants.EXTRA_ID_URL,
192 PreferenceManager.getDefaultSharedPreferences(BookmarksListActivity.this).getString(Constants.PREFERENCES_GENERAL_HOME_PAGE, Constants.URL_ABOUT_START));
193 }
194
195 if (getParent() != null) {
196 getParent().setResult(RESULT_OK, i);
197 } else {
198 setResult(RESULT_OK, i);
199 }
200
201 finish();
202 return true;
203
204 case MENU_EDIT_BOOKMARK:
205 if (bookmarkItem != null) {
206 i = new Intent(this, EditBookmarkActivity.class);
207 i.putExtra(Constants.EXTRA_ID_BOOKMARK_ID, info.id);
208 i.putExtra(Constants.EXTRA_ID_BOOKMARK_TITLE, bookmarkItem.getTitle());
209 i.putExtra(Constants.EXTRA_ID_BOOKMARK_URL, bookmarkItem.getUrl());
210
211 startActivityForResult(i, ACTIVITY_EDIT_BOOKMARK);
212 }
213 return true;
214
215 case MENU_COPY_URL:
216 if (bookmarkItem != null) {
217 ApplicationUtils.copyTextToClipboard(this, bookmarkItem.getUrl(), getString(R.string.Commons_UrlCopyToastMessage));
218 }
219 return true;
220
221 case MENU_SHARE:
222 if (bookmarkItem != null) {
223 ApplicationUtils.sharePage(this, bookmarkItem.getTitle(), bookmarkItem.getUrl());
224 }
225 return true;
226
227 case MENU_DELETE_BOOKMARK:
228 //mDbAdapter.deleteBookmark(info.id);
229 BookmarksProviderWrapper.deleteStockBookmark(getContentResolver(), info.id);
230 fillData();
231 return true;
232 default: return super.onContextItemSelected(item);
233 }
234 }
235
236 /**
237 * Change list sort mode. Update list.
238 * @param sortMode The new sort mode.
239 */
240 private void doChangeSortMode(int sortMode) {
241 Editor editor = PreferenceManager.getDefaultSharedPreferences(this).edit();
242 editor.putInt(Constants.PREFERENCES_BOOKMARKS_SORT_MODE, sortMode);
243 editor.commit();
244
245 fillData();
246 }
247
248 /**
249 * Show a dialog for choosing the sort mode.
250 * Perform the change if required.
251 */
252 private void changeSortMode() {
253
254 int currentSort = PreferenceManager.getDefaultSharedPreferences(this).getInt(Constants.PREFERENCES_BOOKMARKS_SORT_MODE, 0);
255
256 AlertDialog.Builder builder = new AlertDialog.Builder(this);
257 builder.setInverseBackgroundForced(true);
258 builder.setIcon(android.R.drawable.ic_dialog_info);
259 builder.setTitle(getResources().getString(R.string.BookmarksListActivity_MenuSortMode));
260 builder.setSingleChoiceItems(new String[] {getResources().getString(R.string.BookmarksListActivity_MostUsedSortMode),
261 getResources().getString(R.string.BookmarksListActivity_AlphaSortMode),
262 getResources().getString(R.string.BookmarksListActivity_RecentSortMode) },
263 currentSort,
264 new OnClickListener() {
265 @Override
266 public void onClick(DialogInterface dialog, int which) {
267 doChangeSortMode(which);
268 dialog.dismiss();
269 }
270 });
271 builder.setCancelable(true);
272 builder.setNegativeButton(R.string.Commons_Cancel, null);
273
274 AlertDialog alert = builder.create();
275 alert.show();
276 }
277
278 @Override
279 protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
280 super.onActivityResult(requestCode, resultCode, intent);
281
282 switch (requestCode) {
283 case ACTIVITY_EDIT_BOOKMARK:
284 if (resultCode == RESULT_OK) {
285 fillData();
286 }
287 break;
288 case ACTIVITY_ADD_BOOKMARK:
289 if (resultCode == RESULT_OK) {
290 fillData();
291 }
292 break;
293
294 default:
295 break;
296 }
297 }
298
299 }
①同理在oncreate方法,实例化相应的listview,把从ContentResolver取得的网址信息,添加到相应的listview中去,并且为listview赋值与每项目的点击事件,每项的点击跳转到相应的界面上去。同时结束当前的界面。
②在方法中实现数据的填充,同时还为列表绑定上下文菜单。
③程序也是一环扣一环的,那么这个fillData方法是加载数据的方法,又是如何实现的了,把数据库存标签的数据按照一定方式(分页的方式)读取出来,并且加载到相应的列表上去。这个加载数据的过程中有一个淡入淡出动画的效果。
④你要添加这个标签对话框也是在此界面上完成这个功能的,我们用了回调结果intent来跳转到相应编辑标签的界面,编辑标签以后,在到回调结果方法中重新进行相应数据的重新初始化。
⑤这个文件大量的篇幅用于一些上下文菜单的处理,分别对相应在tab打开网页菜单,编辑标签的菜单,复制URL的菜单,分享的菜单,删除菜单的事件做一个处理。
接下来,是一个HistoryListActivity源代码控制文件的解析。源代码如下:
/**
* history list activity.
*/
public class HistoryListActivity extends ExpandableListActivity {
private static final int MENU_CLEAR_HISTORY = Menu.FIRST;
private static final int MENU_OPEN_IN_TAB = Menu.FIRST + 10;
private static final int MENU_COPY_URL = Menu.FIRST + 11;
private static final int MENU_SHARE = Menu.FIRST + 12;
private static final int MENU_DELETE_FROM_HISTORY = Menu.FIRST + 13;
private ExpandableListAdapter mAdapter;
private ProgressDialog mProgressDialog;
private OnCheckedChangeListener mBookmarkStarChangeListener;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle(R.string.HistoryListActivity_Title);
registerForContextMenu(getExpandableListView());
mBookmarkStarChangeListener = new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
long id = (Long) buttonView.getTag();
BookmarksProviderWrapper.toggleBookmark(getContentResolver(), id, isChecked);
if (isChecked) {
Toast.makeText(HistoryListActivity.this, R.string.HistoryListActivity_BookmarkAdded, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(HistoryListActivity.this, R.string.HistoryListActivity_BookmarkRemoved, Toast.LENGTH_SHORT).show();
}
}
};
fillData();
}
/**
* Fill the history list.
*/
private void fillData() {
Cursor c = BookmarksProviderWrapper.getStockHistory(getContentResolver());
mAdapter = new HistoryExpandableListAdapter(
this,
mBookmarkStarChangeListener,
c,
c.getColumnIndex(Browser.BookmarkColumns.DATE),
ApplicationUtils.getFaviconSizeForBookmarks(this));
setListAdapter(mAdapter);
if (getExpandableListAdapter().getGroupCount() > 0) {
getExpandableListView().expandGroup(0);
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
ExpandableListView.ExpandableListContextMenuInfo info =
(ExpandableListView.ExpandableListContextMenuInfo) menuInfo;
int type = ExpandableListView.getPackedPositionType(info.packedPosition);
int group = ExpandableListView.getPackedPositionGroup(info.packedPosition);
int child = ExpandableListView.getPackedPositionChild(info.packedPosition);
if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
HistoryItem item = (HistoryItem) getExpandableListAdapter().getChild(group, child);
menu.setHeaderTitle(item.getTitle());
menu.add(0, MENU_OPEN_IN_TAB, 0, R.string.HistoryListActivity_MenuOpenInTab);
menu.add(0, MENU_COPY_URL, 0, R.string.BookmarksHistoryActivity_MenuCopyLinkUrl);
menu.add(0, MENU_SHARE, 0, R.string.Main_MenuShareLinkUrl);
menu.add(0, MENU_DELETE_FROM_HISTORY, 0, R.string.HistoryListActivity_MenuDelete);
}
}
@Override
public boolean onContextItemSelected(MenuItem menuItem) {
ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) menuItem.getMenuInfo();
int type = ExpandableListView.getPackedPositionType(info.packedPosition);
if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
int group = ExpandableListView.getPackedPositionGroup(info.packedPosition);
int child = ExpandableListView.getPackedPositionChild(info.packedPosition);
HistoryItem item = (HistoryItem) getExpandableListAdapter().getChild(group, child);
switch (menuItem.getItemId()) {
case MENU_OPEN_IN_TAB:
doNavigateToUrl(item.getUrl(), true);
break;
case MENU_COPY_URL:
ApplicationUtils.copyTextToClipboard(this, item.getUrl(), getString(R.string.Commons_UrlCopyToastMessage));
break;
case MENU_SHARE:
ApplicationUtils.sharePage(this, item.getTitle(), item.getUrl());
break;
case MENU_DELETE_FROM_HISTORY:
BookmarksProviderWrapper.deleteHistoryRecord(getContentResolver(), item.getId());
fillData();
break;
default:
break;
}
}
return super.onContextItemSelected(menuItem);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuItem item;
item = menu.add(0, MENU_CLEAR_HISTORY, 0, R.string.Commons_ClearHistory);
item.setIcon(R.drawable.ic_menu_delete);
return true;
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch(item.getItemId()) {
case MENU_CLEAR_HISTORY:
clearHistory();
return true;
default: return super.onMenuItemSelected(featureId, item);
}
}
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
HistoryItem item = (HistoryItem) getExpandableListAdapter().getChild(groupPosition, childPosition);
doNavigateToUrl(item.getUrl(), false);
return super.onChildClick(parent, v, groupPosition, childPosition, id);
}
/**
* Load the given url.
* @param url The url.
* @param newTab If True, will open a new tab. If False, the current tab is used.
*/
private void doNavigateToUrl(String url, boolean newTab) {
Intent result = new Intent();
result.putExtra(Constants.EXTRA_ID_NEW_TAB, newTab);
result.putExtra(Constants.EXTRA_ID_URL, url);
if (getParent() != null) {
getParent().setResult(RESULT_OK, result);
} else {
setResult(RESULT_OK, result);
}
finish();
}
/**
* Clear history.
*/
private void doClearHistory() {
mProgressDialog = ProgressDialog.show(this,
this.getResources().getString(R.string.Commons_PleaseWait),
this.getResources().getString(R.string.Commons_ClearingHistory));
new HistoryClearer();
}
/**
* Display confirmation and clear history.
*/
private void clearHistory() {
ApplicationUtils.showYesNoDialog(this,
android.R.drawable.ic_dialog_alert,
R.string.Commons_ClearHistory,
R.string.Commons_NoUndoMessage,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
doClearHistory();
}
});
}
/**
* Runnable to clear history.
*/
private class HistoryClearer implements Runnable {
/**
* Constructor.
*/
public HistoryClearer() {
new Thread(this).start();
}
@Override
public void run() {
BookmarksProviderWrapper.clearHistoryAndOrBookmarks(getContentResolver(), true, false);
for (CustomWebView webView : Controller.getInstance().getWebViewList()) {
webView.clearHistory();
}
handler.sendEmptyMessage(0);
}
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
mProgressDialog.dismiss();
fillData();
}
};
}
}
观察相应的源代码了,我们可想而知其大体与标签列表界面的大体一样,上面说过方法就不做过多的赘述了,这里我们只需要阐述了为什么要HistoryClearer这个开启线程来清空历史记录。 首先原因有二:
①由于打开网页是很多很多,这里面数据还是很多很多。
②正视由于数据量大,这是一个耗时操作,如果放在一个ui线程中势必会造成页面假使,极大的影响了用户体验。开启一个线程,使其在回调后,更新界面,符合提升用户体验的原则。
我们再这里可以得出来这样android开发的原则:凡是耗时操作,应该开启多线程,再相应线程回调完成后再更新界面。
这就是我对标签记录页面总结,和一点点总结。