Android Browser學習七 書籤歷史模塊: 書籤UI的實現(2)

因爲書籤模塊仍是比較複雜的, 爲了避免讓博客變得太長, 故拆分爲兩篇. 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);
    }



值得注意一下empty的用法:



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>



而點擊操做最終是經過BreadCrumbView來通知Activity進行獲取下一級目錄:


相關文章
相關標籤/搜索