电子书阅读器上的浏览器 [Day13] 自订工具列

随着开发的功能愈来愈多,工具列的空间已不足以将所有的功能都显示在上面;而且也不是每个功能都是使用者会常用的功能。为了要解决这个问题,我打算改造工具列,让使用者可以自订工具列上的功能和排序方式。如果能在上面放上最常用的功能,使用者就不用频繁地开启层层选单找寻功能按钮。

我们先来看看一般浏览器的工具列都长得怎样

Chrome NeoBrowser Firefox
https://ithelp.ithome.com.tw/upload/images/20210912/20140260jnXrDuetJy.jpg https://ithelp.ithome.com.tw/upload/images/20210912/201402606rTmWK7imG.jpg https://ithelp.ithome.com.tw/upload/images/20210912/201402604exP0v5hdC.jpg

Chrome 包含了几个常用的功能,Onyx 电子书设备内建的 NeoBrowser 跟 Chrome 蛮相似的;Firefox 则是相当简洁,几乎没有任何按钮可用。

扩充工具列界面

原本的工具列只是在一个水平的 LinearLayout 中,放入多个 ImageButton,为了避免使用者塞入太多按钮,造成工具列超过画面宽度,我们先在外面包上一层 HorizontalScrollView,如果真的太多按钮的话,至少还可以左右滑动工具列。

https://ithelp.ithome.com.tw/upload/images/20210912/2014026092eVvkmzYa.png

https://ithelp.ithome.com.tw/upload/images/20210912/20140260RCBWYSGtMt.png
在画面初始化时,我们就会先把所有的按钮生成出来;之後再根据使用者的设定,将其重新排列和隐藏不必要的按钮。

对於工具列的操作,因为有点多,所以另外写了一个 ToolBarViewController 来处理。其中比较重要的函式是 reorderIcons()

fun reorderIcons() {
    toolbarActionViews.size

    val iconEnums = config.toolbarActions
    // 先移除全部按钮,再依照设定中的资讯来重新塞入按钮
    if (iconEnums.isNotEmpty()) {
        iconBar.removeAllViews()
        iconEnums.forEach { actionEnum ->
            iconBar.addView(toolbarActionViews[actionEnum.ordinal])
        }
        // Settings 这个按钮如果不小心被使用者删除了,这里会强制将它显示出来
        // 因为没有 Settings 按钮,就无法再进到工具列设定的画面。
        if (ToolbarAction.Settings !in iconEnums) {
            iconBar.addView(toolbarActionViews[ToolbarAction.Settings.ordinal])
        }
        // 重新配置工具列的呈现
        iconBar.requestLayout()
       …
    }
}

toolbarActionViews 则是在画面生成的时候,先把里头的每个按钮元件的 reference 都先记录下来。

private val toolbarActionViews: List<View> by lazy {
    val childCount = iconBar.childCount
    val children = mutableListOf<View>()
    for (i in 0 until childCount) {
        children.add(iconBar.getChildAt(i))
    }

    children
}

建立可拖拉排序的选项对话框

这一部分的实作需要一个可以拖拉的 ListView。花了点时间在网路上找到堪用的元件 DragSortListView,将它置於对话框 ToolbarConfigDialog 内,并且依照使用者储存的设定,初始化它的状态。

https://ithelp.ithome.com.tw/upload/images/20210912/20140260xxr02lLTwB.png

然後,为了储存和管理所有的工具列按钮,建立了 ToolbarActionEnum

https://ithelp.ithome.com.tw/upload/images/20210912/201402608bcGR5AIJq.png

全部实作完後,只要再在设定画面中,加上一个工具列设定的按钮就行了!

https://ithelp.ithome.com.tw/upload/images/20210912/20140260aUGTzLgK3G.jpg

下面是 BrowserActivity 里设定 onClick 的实作,全部的细节都在 ToolbarConfigDialog 中。

R.id.toolbar_setting -> ToolbarConfigDialog(this).show()

下面是完成的工具列设定画面

画面 1 画面 2
https://ithelp.ithome.com.tw/upload/images/20210912/20140260Fabo52OqNX.jpg https://ithelp.ithome.com.tw/upload/images/20210912/20140260ZNtMXnXGJe.jpg

自订後的范例

https://ithelp.ithome.com.tw/upload/images/20210912/20140260krkAqQntMD.jpg
参考版本:https://github.com/plateaukao/browser/releases/tag/v8.7.3


<<:  【美美心港式饮茶吃到饱 Mei Mei Sum 潮港城-女儿红婚宴会馆 in Taichung】

>>:  D3-用 Swift 和公开资讯,打造投资理财的 Apps { 使用 Alamofire 套件进行 URLRequest }

Day10-为了让表单资料不要太过自大,给予其正确的绝望-Validation(III)

标题参考来源 大家好~ 今天来认识如何自定义错误讯息且不用另外建立 FormRequest clas...

Day 11 - 物品借用纪录系统 (3) 发送到期与逾期通知

我们昨天顺利把借物归还事件可以自动化上传到 Google Calendar 上,但是如果借阅人不看 ...

Day 30 建立一个好口碑

心若改变,你的态度跟着改变;态度改变,你的习惯跟着改变;习惯改变,你的性格跟着改变;性格改变,你的人...

Day 03 - 命名的规则

如果有错误,欢迎留言指教~ Q_Q 好的命名,也能够清楚的让人一看就知道是在做什麽 团队有统一的写...

[DAY20]图片旋转木马

TemplateSendMessage - ImageCarouselTemplate image_...