安卓16 设置壁纸中应用网格,有两个5X5的选项

复现步骤

复制代码
设置 - 壁纸 - 壁纸与风格 - 主屏幕 - 应用网格,发现有两个5X5的选项

要做的就是去掉一个5x5

解决

搜索关键词应用网格,发现不是在Setting中,而是在ThemePicker模块下,后续更改均在ThemePicker模块。 模块路径:packages/apps/ThemePicker

根据应用网格定位:

xml 复制代码
strings.xml

<string name="grid_title" msgid="1688173478777254123">"应用网格"</string>

定位到布局文件grid_section_view.xml,这个布局文件其实是图片二内容,即一级目录,图片一展示的是二级目录的。这个一级目录布局对应的java文件为GridSectionView,但GridSectionView.java没内容,需要看GridSectionController.java

xml 复制代码
grid_section_view.xml

<com.android.customization.picker.grid.ui.view.GridSectionView
......


        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/grid_title" // 这里
            style="@style/SectionTitleTextStyle" />

......
</com.android.customization.picker.grid.ui.view.GridSectionView>
java 复制代码
GridSectionController.java

gridSectionView.setOnClickListener(
        v -> {
            //代码中有点击事件的处理,即点击图片二中那个"应用网格"的处理事件,发现跳转的是GridFragment中调用了GridScreenBinder,我就是修改的这个Binder
            ```kotlin
            GridScreenBinder.kt
            
            lifecycleOwner.lifecycleScope.launch {
            lifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
                launch {
                    viewModel.optionItems.collect { options ->
                        // According to the number of rows and columns, to avoid duplication.
                        Log.d(
                            "cmy-GridScreenBinder",
                            "collect optionItems: size=${options.size}, keys=${
                                options.joinToString { it.key.value }
                            }"
                        )

                        val uniqueOptions = options.distinctBy { it.key.value }

                        Log.d(
                            "cmy-GridScreenBinder",
                            "after distinctBy key: size=${uniqueOptions.size}, keys=${
                                uniqueOptions.joinToString { it.key.value }
                            }"
                        )

                        adapter.setItems(uniqueOptions)
                        onOptionsChanged()
                    }
                }
            }
        }
            ```
            final Fragment gridFragment = new GridFragment(); 
            mSectionNavigationController.navigateTo(gridFragment);
        });

在GridFragment中调用了GridScreenBinder,我就是修改的这个Binder

kotlin 复制代码
GridScreenBinder.kt

lifecycleOwner.lifecycleScope.launch {
    lifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
        launch {
            viewModel.optionItems.collect { options ->
                // According to the number of rows and columns, to avoid duplication.
                // 这个log打印的是有两个5x5
                Log.d(
                    "cmy-GridScreenBinder",
                    "collect optionItems: size=${options.size}, keys=${
                        options.joinToString { it.key.value }
                    }"
                )
                
                
                // ********数据去重:使用 `distinctBy { it.key.value }`对 `options`进行去重,确保基于 `key`的唯一性
                val uniqueOptions = options.distinctBy { it.key.value } //

                // 这个log打印的是过滤之后的,只有一个5x5
                Log.d(
                    "cmy-GridScreenBinder",
                    "after distinctBy key: size=${uniqueOptions.size}, keys=${
                        uniqueOptions.joinToString { it.key.value }
                    }"
                )

                adapter.setItems(uniqueOptions) //**更新UI**:将去重后的列表 `uniqueOptions`设置给 `adapter`,从而更新界面显示
                onOptionsChanged()
            }
        }
    }
}

经过去重后,这样就只显示一个5x5选项了。

相关推荐
天空之城--12 小时前
Android Koin 完全指南:从原理到实践
android
zhangphil13 小时前
Android main thread主线程Choreographer doFrame发生FullSuspendCheck
android
TimeFine17 小时前
智能眼镜开发:获取真实的音频路由
android
pengyu17 小时前
【Kotlin 协程修仙录 · 渡劫境 · 中阶】 | 造化神兵:自定义 CoroutineDispatcher 与调度器的终极定制
android·kotlin
pengyu17 小时前
【Kotlin 协程修仙录 · 渡劫境 · 初阶】 | 飞升雷劫:CPS 变换与挂起函数字节码终极透视
android·kotlin
TimeFine17 小时前
智能眼镜开发:眼镜Touch后收音与触发播放系统音乐的矛盾处理
android
TimeFine18 小时前
智能眼镜开发:眼镜侧收集音频
android
又见情义18 小时前
Android 系统设置从平板版迁移至TV版实践
android
杉氧21 小时前
打破边界(一):实战编写 Android/iOS 原生模块 (Native Modules)
android·react native·前端框架