Android 遍历界面所有的View

这篇具有很好参考价值的文章主要介绍了Android 遍历界面所有的View。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。
专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。

Android 遍历界面所有的View,Android基础,android,view,面试,遍历

一、导读

我们继续总结学习,温故知新。

二、概览

本文讲述如何遍历获取页面中所有的view,并输出对应的id,textview文本内容,imageview实际大小及设置的图片大小。

可用于检测android应用中的大图。

三、实践

在Android开发中,有时我们需要遍历界面上的所有View,以便进行某些操作。例如,我们可能需要查找特定类型的View,或者对所有的View进行某种操作。这里是一个简单的示例,展示如何遍历界面上的所有View。
首先,假设你有一个Activity或Fragment,里面有一个布局文件,里面包含各种各样的View,例如Button、TextView、ImageView等。

然后,你可以在Activity或Fragment的代码中,通过递归的方式遍历所有的View。

不多说,直接上代码,

图片大小检测思路。

    fun checkBitmapFromView(){
        //1、遍历activity中的各个View控件
        //2、获取View控件加载的Bitmap
        //3、对比Bitmap宽高与View宽高
    }

示例代码:
遍历获取所有的view,并输出相应的信息


    List<View> viewList=new ArrayList<>();
    @Override
    protected void onResume() {
        super.onResume();
        logoIcon.postDelayed(new Runnable() {
            @Override
            public void run() {
                getAllViews((ViewGroup) getWindow().getDecorView());
                for (View view: viewList) {

                    if(view instanceof TextView) {
                        Log.d("xyz", view.toString());
                        Log.d("xyz", ((TextView)view).getText().toString());

                    } else if(view instanceof ImageView) {
                        Log.d("xyz", view.toString());
                        checkBitmap(view, ((ImageView)view).getDrawable());
                    } else {
                        Log.d("xyz", view.toString());
                    }
                }
            }
        }, 3000);
    }

    //获取所有的子view,我们这里只保存imageview及textview,用于测试
    private List<View> getAllViews(ViewGroup viewGroup){
        for(int i=0;i< viewGroup.getChildCount(); i++){
            View view = viewGroup.getChildAt(i);
            if(view instanceof ViewGroup) {
                getAllViews((ViewGroup) view);
            } else {
                if(view instanceof ImageView || view instanceof TextView) {
                    viewList.add(view);
                }
                if(view.getVisibility() == View.VISIBLE) {
                }
            }
        }
        return viewList;
    }

这个示例代码会遍历界面上的所有View,并将image view和textview加入到list中。注意,这里使用了递归方法来遍历ViewGroup中的所有子View。如果View是一个ViewGroup(例如RelativeLayout、LinearLayout等),那么我们就递归遍历它的所有子View。如果View是一个叶子视图(例如Button、TextView等),那么我们就执行想要的操作。

当我们获取到页面上的imageview后,就可以做一些操作,如
ImageView大小检测


    private void checkBitmap(Object thiz, Drawable drawable) {
        if (drawable instanceof BitmapDrawable && thiz instanceof View) {
            final Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();

            final View view = (View) thiz;
            int width = view.getWidth();
            int height = view.getHeight();

            if (bitmap != null) {
                if (width > 0 && height > 0) {
                    // 图标宽高都大于view带下的2倍以上,则警告
                    if (bitmap.getWidth() >= (width << 1)
                            && bitmap.getHeight() >= (height << 1)) {
//                        warn(bitmap.getWidth(), bitmap.getHeight(), width, height, new RuntimeException("Bitmap size too large"));
                    }
                    warn(bitmap.getWidth(), bitmap.getHeight(), width, height, new RuntimeException("log"));
                } else {
                    final Throwable stackTrace = new RuntimeException();
                    view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                        @Override
                        public boolean onPreDraw() {
                            int w = view.getWidth();
                            int h = view.getHeight();
                            if (w > 0 && h > 0) {
                                if (bitmap.getWidth() >= (w << 1)
                                        && bitmap.getHeight() >= (h << 1)) {
//                                    warn(bitmap.getWidth(), bitmap.getHeight(), w, h, stackTrace);
                                }
                                warn(bitmap.getWidth(), bitmap.getHeight(), w, h, stackTrace);
                                view.getViewTreeObserver().removeOnPreDrawListener(this);
                            }
                            return true;
                        }
                    });
                }
            } else {

                warn(bitmap.getWidth(), bitmap.getHeight(), width, height, new RuntimeException("bitmap null"));
            }
        }
    }

    private void warn(int bitmapWidth, int bitmapHeight, int viewWidth, int viewHeight, Throwable t) {
        String warnInfo = new StringBuilder("Bitmap info: ")
                .append("\n real size: (").append(bitmapWidth).append(',').append(bitmapHeight).append(')')
                .append("\n desired size: (").append(viewWidth).append(',').append(viewHeight).append(')')
                .append("\n call stack trace: \n").append(Log.getStackTraceString(t)).append('\n')
                .toString();

        Log.d("xyz", warnInfo);
    }

我们看下log输出

com.xxx.xxx.xxx.ImageViewFor{e292c7e VFED..C.. ........ 540,1348-900,1528 #7f0a024e app:id/bt_phone}
2023-08-23 18:28:47.956 12556-12556 xyz                com.xxx.xxx                      D  Bitmap info: 
         real size: (144,144)
         desired size: (360,180)
         call stack trace: 
        java.lang.RuntimeException: log
            at com.xxx.xxx.ui.LoginActivity.checkBitmap(LoginActivity.java:235)
            at com.xxx.xxx.ui.LoginActivity.access$100(LoginActivity.java:79)
            at com.xxx.xxx.ui.LoginActivity$2.run(LoginActivity.java:193)
            at android.os.Handler.handleCallback(Handler.java:900)
            at android.os.Handler.dispatchMessage(Handler.java:103)
            at android.os.Looper.loop(Looper.java:219)
            at android.app.ActivityThread.main(ActivityThread.java:8673)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1109)

四、 推荐阅读

Java 专栏

SQL 专栏

数据结构与算法

Android学习专栏

Android 遍历界面所有的View,Android基础,android,view,面试,遍历文章来源地址https://www.toymoban.com/news/detail-718056.html

到了这里,关于Android 遍历界面所有的View的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android自定义View流程

    在开发中,View视图具有非常重要的作用,它是直接呈现给使用者的,因此向用户展示精美高效的View视图很有意义。Android系统提供了丰富的视图组件,如TextView、ImageView、Button等,还提供了RelativeLayout、LinearLayout、FrameLayout等组合组件,使用这些组件搭配能实现良好的视图效果

    2024年04月11日
    浏览(49)
  • Android View滑动处理大法

    原文链接 Android View滑动处理大法 对于触控式操作来说,滑动是一个特别重要的手势操作,如何做到让应用程序的页面滑动起来如丝般顺滑,让用户感觉到手起刀落的流畅感,是开发人猿需要重点解决的问题,这对提升用户体验是最为重要的事情。本文就将探讨一下,Android中

    2024年02月13日
    浏览(37)
  • android 自定义圆角View

    public class CustomView extends View {     private float cornerRadius;     public CustomView(Context context) {         super(context);         init();     }     public CustomView(Context context, AttributeSet attrs) {         super(context, attrs);         TypedArray typedArray = context.obt

    2024年02月11日
    浏览(49)
  • Android 动态控制view的大小

    这样就实现了控件尺寸随着我们手指滑动变化了。 OnTouchListener中有event.getX(),event.getY(),和event.getRawX(),event.getRawY(),他们究竟有什么区别了? getX和getY代表相当于控件本身的位置,getRawX和getRawY相对屏幕的位置

    2023年04月08日
    浏览(103)
  • Android动画深入分析(View动画)

    Android的动画我其实在View的滑动里面写过,主要还是分为2点。 一个就是View动画,还有一个是属性动画 先讲述 View动画 View动画主要分为4种, 平移动画 , 缩放动画 , 旋转动画 , 透明度动画 。 还有一个叫 帧动画 ,但是表现方式和上面4种不太一样 一般情况下我们是在xml里面定义动

    2024年02月07日
    浏览(68)
  • Android View实现滑动的方式

    实现View的滑动有三种方式 通过View本身提供的scrollTo/scrollBy方法实现滑动 通过动画给View施加平移效果来实现滑动 通过改变View LayoutParams使得View重新布局从而实现滑动 scrollTo:通过传递的参数实现绝对滑动 scrollBy:通过传递的参数实现相对滑动 scrollTo和scrollBy只能改变View内容

    2024年02月16日
    浏览(50)
  • Android自定义View之游戏摇杆键盘实现(一),快手android面试经验

    public class RemoteViewBg { private Bitmap bitmapBg; public RemoteViewBg(Bitmap bitmap) { bitmapBg = bitmap; } //背景的绘图函数 public void draw(Canvas canvas, Paint paint, Rect src0 ,Rect dst0 ) { canvas.drawBitmap(bitmapBg, src0, dst0, paint); } } 重写系统的触摸时间,判断触摸点在背景范围内还是背景范围外 @Override public b

    2024年04月12日
    浏览(46)
  • 重学Android之View——TabLayoutMediator解析

    在使用TabLayout+ViewPager2+Fragment的时候,查询别人的使用例子,看到了 TabLayoutMediator这个类,撰写此文,仅当学习思考,本文是在引用material:1.7.0的版本基础上 Tab + ViewPager2 + Fragment TabLayoutMediator类引用了tabLayout跟ViewPager2对象,另外内部定义定义了tabLayout跟Viewpager2的 监听回调类

    2023年04月24日
    浏览(26)
  • 无涯教程-Android - List View函数

    Android ListView 是垂直滚动列表中显示的视图,使用 Adapter 从列表(如数组或数据库)中获取内容的列表项会自动插入列表中。 适配器(Adapter)实际上是UI组件和将数据填充到UI组件中的数据源之间的桥梁,适配器保存数据并将数据发送到适配器视图,该视图可以从适配器视图获取数

    2024年02月10日
    浏览(46)
  • Flutter 页面嵌入 Android原生 View

    文章主要讲解Flutter页面如何使用Android原生View,但用到了Flutter 和 Android原生 相互通信知识,建议先看完这篇讲解 通信的文章 Flutter 与 Android原生 相互通信:BasicMessageChannel、MethodChannel、EventChannel-CSDN博客 数据观察监听,Flutter使用ValueNotifier,Android原生使用LiveData,在实体数据

    2024年01月21日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包