网站首页 > 技术文章 正文
通过前面几篇文章,虽然我们实现了在各级目录之间进行切换的功能,但还是有一些不够方便的地方。例如:
- 返回上级目录之前必须首先当前回到目录的最顶端
- 退回上级目录之后,总是回到该目录的最顶端。这对于希望继续浏览目录内容的用户很不友好
针对这两个问题,我们采取如下对策:
- 通过画面顶端的操作区实现返回上级目录功能
- 每次进入下级目录时记录当前表示位置,从下级目录返回时恢复这个表示位置。
修改后的动作视频如下:
返回上级目录按钮
画面最上面操作区的布局文件中和返回上级目录按钮相关的部分如下:
<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:id="$+id:app_bar"
ohos:height="match_content"
ohos:width="match_parent"
ohos:background_element="$color:title_layout_background_color"
ohos:orientation="horizontal">
<DirectionalLayout
ohos:id="$+id:title_layout"
ohos:height="56vp"
ohos:width="match_content"
ohos:orientation="horizontal"
ohos:weight="1">
<Image
ohos:id="$+id:left_arrow"
ohos:height="24vp"
ohos:width="24vp"
ohos:layout_alignment="center"
ohos:start_margin="24vp"/>
当MainAbilitySlice启动时,为该按钮指定图像文件和按下处理:
public void onStart(Intent intent) {
setUIContent(ResourceTable.Layout_browser_ability);
Image leftArrow = (Image) findComponentById(ResourceTable.Id_left_arrow);
leftArrow.setPixelMap(ResourceTable.Media_return_gray50);
leftArrow.setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
FileListContainer listContainer = (FileListContainer) findComponentById(ResourceTable.Id_list_container);
listContainer.backToParent();
}
});
initListContainer();
}
最初表示的目录是根目录,因此对应的图像文件是灰色按钮。接下来我们可以在FileListContainer的当前目录发生变化时决定返回上级目录按钮的状态:
private void initListContainer() {
FileListContainer listContainer = (FileListContainer) findComponentById(ResourceTable.Id_list_container);
listContainer.setSelectedListener(listener);
listContainer.setDirChangeListener(new BrowserItem.DirChangeListener() {
@Override
public void dirChanged(File dir) {
String parent = dir.getParent();
Image leftArrow = (Image) findComponentById(ResourceTable.Id_left_arrow);
if(parent != null){
leftArrow.setPixelMap(ResourceTable.Media_return_black50);
}
else{
leftArrow.setPixelMap(ResourceTable.Media_return_gray50);
}
}
});
}
记录和恢复进入下级目录时的表示位置
首先准备一个用于管理每次进入下级目录时表示位置的entryPointList,当FileListContainer的当前目录发生变化时,如果新目录比原目录长则判断为进入下级目录,这时保存进入位置;如果新目录比原目录短,则判断为返回上级目录,这时回复进入位置。具体代码如下:
void changeDir(File dir){
int firstVisible = getItemPosByVisibleIndex(0);
setSelectedItemIndex(-1);
sampleItemProvider.setCurrentDir(dir);
setItemProvider(sampleItemProvider);
if(currentDir == null
|| dir.getAbsolutePath().length() > currentDir.getAbsolutePath().length()){
entryPointList.add(firstVisible);
}
else{
int listSize = entryPointList.size();
if(listSize > 0){
int last = entryPointList.remove(listSize - 1);
scrollTo(last);
}
}
currentDir = dir;
if(dirChangeListener != null){
dirChangeListener.dirChanged(dir);
}
}
参考资料
ListContainer
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-java-component-listcontainer-0000001060007847
参考代码
完整代码可以从以下链接下载:
https://github.com/xueweiguo/Harmony/tree/master/FileBrowser
作者著作介绍
《实战Python设计模式》是作者去年3月份出版的技术书籍,该书利用Python 的标准GUI 工具包tkinter,通过可执行的示例对23 个设计模式逐个进行说明。这样一方面可以使读者了解真实的软件开发工作中每个设计模式的运用场景和想要解决的问题;另一方面通过对这些问题的解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式的利弊,并合理运用设计模式。
对设计模式感兴趣而且希望随学随用的读者通过本书可以快速跨越从理解到运用的门槛;希望学习Python GUI 编程的读者可以将本书中的示例作为设计和开发的参考;使用Python 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。
觉得本文有帮助?请分享给更多人。
关注微信公众号【面向对象思考】轻松学习每一天!
面向对象开发,面向对象思考!
- 上一篇: AltTab for Mac(窗口快速切换工具)
- 下一篇: 求圆周长的另一种思路,并非2*pi*r
猜你喜欢
- 2024-10-24 窗口快速切换利器 AltTab 3.22.6中文版
- 2024-10-24 这样上班玩游戏老板都只会夸:5个常用组合键你同事都会用!
- 2024-10-24 窗口快速切换利器AltTab for Mac 3.11.0中文版
- 2024-10-24 这些强大的快捷键,学会你就是公司最早下班的仔!
- 2024-10-24 Altium Design 快捷键(altium designer操作快捷键)
- 2024-10-24 同创双子IT小技巧分享:PPT超实用看快捷键分享,赶紧收藏吧
- 2024-10-24 一个方便的 Windows 10 技巧,让多任务处理变得更容易
- 2024-10-24 css3制作网页中常见的小箭头(html5如何弄箭头)
- 2024-10-24 电脑键盘操作技巧——Windows键或CTRL
- 2024-10-24 窗口快速切换利器AltTab 3.17.0 Mac中文版
- 11-26Win7\8\10下一条cmd命令可查得笔记本电脑连接过的Wifi密码
- 11-26一文搞懂MySQL行锁、表锁、间隙锁详解
- 11-26电脑的wifi密码忘记了?一招教你如何找回密码,简单明了,快收藏
- 11-26代码解决忘记密码问题 教你用CMD命令查看所有连接过的WIFI密码
- 11-26CMD命令提示符能干嘛?这些功能你都知道吗?
- 11-26性能测试之慢sql分析
- 11-26论渗透信息收集的重要性
- 11-26如何查看电脑连接过的所有WiFi密码
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)