桌面列表小部件不能点击的问题分析

桌面列表小部件不能点击的问题分析

问题复现

拖动谷歌浏览器的小部件到桌面,"打开新的标签页"不能点击,没有按压效果

小部件布局

正常情况点击事件传递

不能点击的情况

也会触发AbsListView.onTounchDown和AbsListView.onTouchUP,但没有按压效果和点击事件触发

分析:

拖动小部件放到桌面时会触发AbsListView的onAttachedToWindow,mDataChanged被赋值为true frameworks/base/core/java/android/widget/AbsListView.java

js 复制代码
    protected void onAttachedToWindow() {
        if (mAdapter != null && mDataSetObserver == null) {
...
            mDataChanged = true;
        }
    }

mDataChanged = true,列表的点击事件PerformClick.run无法处理 frameworks/base/core/java/android/widget/AbsListView.java

js 复制代码
    private void onTouchUp(MotionEvent ev) {
        switch (mTouchMode) {
            case TOUCH_MODE_DOWN:
            case TOUCH_MODE_TAP:
            case TOUCH_MODE_DONE_WAITING:
...
                        if (mTouchMode == TOUCH_MODE_DOWN || mTouchMode == TOUCH_MODE_TAP) {
...
                            if (!mDataChanged && mAdapter.isEnabled(motionPosition)) {
...
                                layoutChildren();
                                child.setPressed(true);
...
                                setPressed(true);
...
                                mTouchModeReset = new Runnable() {
                                    @Override
                                    public void run() {
                                        mTouchModeReset = null;
                                        mTouchMode = TOUCH_MODE_REST;
                                        child.setPressed(false);
                                        setPressed(false);
                                        if (!mDataChanged && !mIsDetaching
                                                && isAttachedToWindow()) {
                                            performClick.run();
                                        }
                                    }
                                };
                                postDelayed(mTouchModeReset,
                                        ViewConfiguration.getPressedStateDuration());
..
                    }
                }

安卓15无此问题:

触摸一下就会触发DOWN,MOVE,MOVE,UP 对比Android14机器

只触发DOWN,UP

因此Android 15会在点击时多处理move事件

move事件处理中mDataChanged为true时,会调用layoutChildren(),此函数中可以将mDataChanged重新置为false,onTouchUp就可以正常触发点击事件 frameworks/base/core/java/android/widget/AbsListView.java

js 复制代码
    private void onTouchMove(MotionEvent ev, MotionEvent vtev) {
...
        if (mDataChanged) {
            layoutChildren();
        }

frameworks/base/core/java/android/widget/ListView.java

js 复制代码
    protected void layoutChildren() {
...
            mLayoutMode = LAYOUT_NORMAL;
            mDataChanged = false;
...
    }

解决

此问题为AOSP的原生bug,在onAttachedToWindow后重新请求布局更新 frameworks/base/core/java/android/widget/AbsListView.java

js 复制代码
    protected void onAttachedToWindow() {
....
        if (mAdapter != null && mDataSetObserver == null) {
.....
            mDataChanged = true;
...
+            if (mAdapter instanceof RemoteViewsAdapter) {
+                requestLayout();
+            }
        }
    }
相关推荐
一只修仙的猿3 小时前
再谈性能优化,一次项目优化经历分享
android·性能优化
雮尘5 小时前
Android性能优化之枚举替代
android
2501_915909067 小时前
苹果上架App软件全流程指南:iOS 应用发布步骤、App Store 上架流程、uni-app 打包上传与审核技巧详解
android·ios·小程序·https·uni-app·iphone·webview
2501_915921437 小时前
iOS 文件管理与能耗调试结合实战 如何查看缓存文件、优化电池消耗、分析App使用记录(uni-app开发与性能优化必备指南)
android·ios·缓存·小程序·uni-app·iphone·webview
2501_915918418 小时前
App 苹果 上架全流程解析 iOS 应用发布步骤、App Store 上架流程
android·ios·小程序·https·uni-app·iphone·webview
2501_916007478 小时前
苹果上架全流程详解,iOS 应用发布步骤、App Store 上架流程、uni-app 打包上传与审核要点完整指南
android·ios·小程序·https·uni-app·iphone·webview
PuddingSama9 小时前
Android 高级绘制技巧: BlendMode
android·前端·面试
2501_915921439 小时前
iOS App 性能监控与优化实战 如何监控CPU、GPU、内存、帧率、耗电情况并提升用户体验(uni-app iOS开发调试必备指南)
android·ios·小程序·uni-app·iphone·webview·ux
Digitally10 小时前
如何将视频从安卓手机传输到电脑?
android·智能手机·电脑
CV资深专家10 小时前
Android 相机框架的跨进程通信架构
android