由于书签模块还是比较复杂的, 为了不让博客变得太长, 故拆分为两篇.

上一篇介绍了书签大致的实现, 本篇主要介绍

1.书签模块BreadCrumb的实现,

2.书签模块与Activity之间的通讯,

3. 修改添加书签的实现

开始吧:

1.书签模块BreadCrumb的实现,

这个东西其实就是在书签UI和书签添加窗口展示的那个类似windows窗口管理器的导航按钮

点击可以动态的调整书签的层级, 效果还是蛮不错的,在很多文件管理器中也有用到.

可以认为是一个自定义view (应该是一个viewgroup)了:

类图差不多是这样:可以看到有两个地方使用到了这个东西, 也就是上面截图的 书签UI和添加书签UI,

使用这个东西需要注册一个通知, 这样在用户点击BreadCrumbView的时候会回调到他们进行调整目录.

BreadCrumbView 是一个LinearLayout, 所以他里面有一个List 集合, 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);

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

android:visibility="gone"

>

android:id="@+id/list"

android:layout_marginLeft="16dip"

android:layout_marginRight="16dip"

android:layout_width="match_parent"

android:layout_height="match_parent"

/>

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" />

而点击操作最终是通过BreadCrumbView来通知Activity进行获取下一级目录:

android browser 书签 路径,Android Browser学习七 书签历史模块: 书签UI的实现(2)相关推荐

  1. android studio视频路径,Android studio相关设置及实现存在于工程目录中的视频播放...

    一:相关设置 1:主题设置 File-->Settings-->Appearance &Behavior-->Appearance-->THeme 2:Java源码的颜 ...

  2. android assets绝对路径,Android 获取assets的绝对路径

    第一种方法: String path = "file:///android_asset/文件名"; 第二种方法: InputStream abpath = getClass().g ...

  3. Android Browser学习七 书签历史模块: 书签UI的实现

    2019独角兽企业重金招聘Python工程师标准>>> 浏览器的书签界面功能还是比较丰富的, 主要有 1.可以按照列表和grid两种方式展示 2.同步后会显示不同用户的书签 3.可以 ...

  4. android 本地存储路径,Android本地存储路径学习

    一.前言: Android 中获取本地储存路径,有四个方法, getCacheDir().getFilesDir().getExternalFilesDir().getExternalCacheDir ...

  5. android读写缓存文件路径,Android app-cache-Path的 缓存图片、缓存文件的路径包名路径 和外路径比较...

    代码对应的路径: //判断手机是否挂在sd卡 String externalStorageState= Environment.getExternalStorageState(); File down ...

  6. android mm 修改路径,Android 编译系统模块

    在开发过程中,尤其是Framework相关开发时,有时候需要重新编译资源文件.编译顺序和注意事项如下: 1,资源文件位置:frameworks/base/core/res 2,编译后生成的文件:fra ...

  7. android pdf生成 路径,android – 如何从指向PDF文档的URI获取文件路径?

    现在我的代码打开了默认下载视图,它只显示我下载的PDF.我选择了一个PDF文件,我得到了这个: content://com.android.providers.downloads.documents/ ...

  8. android anr 文件路径,android出现ANR 如何导出anr文件

    1.老版Android系统 anr的导出 在项目目录下或app下运行命令: adb pull data/anr/traces.txt 1 测试了华为p7(Android 5.1.1)和荣耀v10(An ...

  9. 安卓android获取存储路径,Android系统的手机文件夹目录详解

    一.文件夹 1./acct/ 系统回收站,删除的系统文件. 2./cache/ 缓存 3./data/ 用户的所有程序相关数据 app/ 所有用户安装的apk文件 app-private/ data/ ...

最新文章

  1. 数字基带传输与码间干扰
  2. python去除字符串中的单词_从字符串中删除单词列表
  3. virtualbox下给centos7固定ip
  4. php递归复制文件内容,PHP实现递归复制整个文件夹的类实例_php技巧
  5. display属性_CSS之使用display:inline-block来布局
  6. 基于几何距离的椭圆拟合
  7. 【报告分享】2019中国社交电商白皮书.pdf
  8. java中ssm付款代码_基于Java+SSM的网上订餐系统、基于JavaWeb的网上订餐系统
  9. 约架的节奏?BAT之后 小米加入地图生态资源争夺战
  10. mysql语句怎么拼接字符串_MySQL执行拼接字符串语句实例
  11. 数据结构与算法之栈的实现及逆波兰计算器简易版
  12. 苹果屏蔽更新描述文件_iOS屏蔽更新文件失效,教你两个技巧暂停更新
  13. 移动端轮播图——网易云音乐手机端样式
  14. 教你怎么用Mono Cecil - 动态注入 (注意代码的注释)
  15. P2P网贷行业的新征程
  16. Win11系统时间不同步的解决方法
  17. Win32 OpenGL 编程
  18. 通过AD域验证登录Linux系统(Linux安装sssd加入Windows AD域)
  19. 初涉VB.NET入门级代码积累
  20. putty 连接服务器 server refused our key

热门文章

  1. 深信服上网管理设备基本操作
  2. 一个按键控制数码管的开和关_基于FPGA的数字电路实验3:点亮数码管
  3. python中模块的概念_Python中模块的概念
  4. 防止html转义字符,如何防止我的HTML标签被转义?
  5. python消息队列框架持久化_消息队列如果持久化到数据库的话,相对于直接操作数据库有啥优势?...
  6. Android开发之ApiCloud模块开发的注意事项
  7. 3706 teradata 语句报错_Teradata SQL
  8. iOS 开发之获取时间到年底可能会踩到的坑
  9. (笔记)java环境变量设置
  10. asp.net webform 局部发布更新