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进行获取下一级目录:


相关文章
相关标签/搜索