揭秘uc浏览器三

这节我们主要讨论收藏与历史记录页面的边边角角。

首先,看看他的最终的效果图了:

揭秘uc浏览器三

照例了,我们先看看他的布局文件:

 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>

相应的布局文件说明如下:

揭秘uc浏览器三

别开这是一个布局文件其实涉及另外两个布局文件,相应布局文件是左右两边布局文件。他两个布局文件源代码又是怎么样了?一个是书签页面的布局文件,一个是历史记录的布局文件。但是布局文件共拥有一个布局文件。

相应源代码如下:

 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开发的原则:凡是耗时操作,应该开启多线程,再相应线程回调完成后再更新界面。

这就是我对标签记录页面总结,和一点点总结。

 

 

你可能感兴趣的:(浏览器)