因爲書籤模塊仍是比較複雜的, 爲了避免讓博客變得太長, 故拆分爲兩篇. java
上一篇介紹了書籤大體的實現, 本篇主要介紹 android
1.書籤模塊BreadCrumb的實現, 數據庫
2.書籤模塊與Activity之間的通信, windows
3. 修改添加書籤的實現 app
開始吧: ide
1.書籤模塊BreadCrumb的實現, 佈局
這個東西其實就是在書籤UI和書籤添加窗口展現的那個相似windows窗口管理器的導航按鈕 this
點擊能夠動態的調整書籤的層級, 效果仍是蠻不錯的,在不少文件管理器中也有用到. url
能夠認爲是一個自定義view (應該是一個viewgroup)了: spa
類圖差很少是這樣:能夠看到有兩個地方使用到了這個東西, 也就是上面截圖的 書籤UI和添加書籤UI,
使用這個東西須要註冊一個通知, 這樣在用戶點擊BreadCrumbView的時候會回調到他們進行調整目錄.
BreadCrumbView 是一個LinearLayout, 因此他裏面有一個List<Crumb> 集合, Crumb裏面有個view 咱們看到的一連串的按鈕其實是CrumbView添加的每個Crumb.
在BookMarkExpandableView中經過getGroupView調用到getBreadCrumbView添加每個crumb按鈕
在AddBookMarkPage 則是在View的佈局中有這個View:
mCrumbs = (BreadCrumbView) findViewById(R.id.crumbs);
BreadCrumbView的添加標籤按鈕和分割線的操做:
private void pushCrumb(Crumb crumb) { if (mCrumbs.size() > 0) { addSeparator();//左邊添加一個分割線 } mCrumbs.add(crumb); addView(crumb.crumbView); updateVisible(); crumb.crumbView.setOnClickListener(this); } private void addSeparator() { View sep = makeDividerView(); sep.setLayoutParams(makeDividerLayoutParams()); addView(sep); } private ImageView makeDividerView() { ImageView result = new ImageView(mContext); result.setImageDrawable(mSeparatorDrawable); result.setScaleType(ImageView.ScaleType.FIT_XY); return result; }
其餘的就是數據庫操做了, 暫時不去研究.
2.書籤模塊與ComboViewActivity之間的通信,
在使用Fragment的時候咱們常常會須要fragment和activity的相互通信, activity通知fragment比較簡單, 由於fragment是activity的組成部分, 那麼咱們經過書籤模塊, 谷歌是怎麼實現Fragment通知到Activity的:
其實就是
mCallbacks = new CombinedBookmarksCallbackWrapper(
(CombinedBookmarksCallbacks) getActivity());
真的不知道爲何要這麼設計, 我的認爲Activity繼承一個接口, 直接cast getActivity就能夠了.不清楚這個CombinedBookmarksCallbackWrapper有什麼用?
3. 修改添加書籤的實現
AddBookMarkPage其實有兩個功能 添加書籤和編輯書籤,看部分onCreate的代碼就知道了:
@Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); requestWindowFeature(Window.FEATURE_NO_TITLE); mMap = getIntent().getExtras(); setContentView(R.layout.browser_add_bookmark); Window window = getWindow(); String title = null; String url = null; mFakeTitle = (TextView) findViewById(R.id.fake_title); if (mMap != null) { Bundle b = mMap.getBundle(EXTRA_EDIT_BOOKMARK); if (b != null) { mEditingFolder = mMap.getBoolean(EXTRA_IS_FOLDER, false); mMap = b; mEditingExisting = true; mFakeTitle.setText(R.string.edit_bookmark); if (mEditingFolder) { findViewById(R.id.row_address).setVisibility(View.GONE); } else { showRemoveButton(); } } else { int gravity = mMap.getInt("gravity", -1); if (gravity != -1) { WindowManager.LayoutParams l = window.getAttributes(); l.gravity = gravity; window.setAttributes(l);//不知道什麼意思 這樣是設置decorview的grivity } } title = mMap.getString(BrowserContract.Bookmarks.TITLE); url = mOriginalUrl = mMap.getString(BrowserContract.Bookmarks.URL); mTouchIconUrl = mMap.getString(TOUCH_ICON_URL); mCurrentFolder = mMap.getLong(BrowserContract.Bookmarks.PARENT, DEFAULT_FOLDER_ID); }
其實選擇文件夾的窗口也在這個Activity中, 打開關閉窗口是讓他們 gone 和visiable:
private void switchToFolderSelector() { // Set the list to the top in case it is scrolled. mListView.setSelection(0); mDefaultView.setVisibility(View.GONE); mFolderSelector.setVisibility(View.VISIBLE); mCrumbHolder.setVisibility(View.VISIBLE); mFakeTitleHolder.setVisibility(View.GONE); mAddNewFolder.setVisibility(View.VISIBLE); mAddSeparator.setVisibility(View.VISIBLE); getInputMethodManager().hideSoftInputFromWindow( mListView.getWindowToken(), 0); }
mListView = (CustomListView) findViewById(R.id.list); View empty = findViewById(R.id.empty); mListView.setEmptyView(empty);
<LinearLayout android:id="@+id/folder_selector" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:visibility="gone" > <view class="com.android.browser.AddBookmarkPage$CustomListView" android:id="@+id/list" android:layout_marginLeft="16dip" android:layout_marginRight="16dip" android:layout_width="match_parent" android:layout_height="match_parent" /> <TextView android:id="@+id/empty" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" android:layout_marginLeft="16dip" android:layout_marginTop="16dip" android:text="@string/no_subfolders" android:textStyle="italic" android:textAppearance="?android:attr/textAppearanceMedium" /> </LinearLayout>