确定视图是否在屏幕上 - Android

2024-05-16

我对这个有点困惑 - 首先也是最重要的是,以下链接很有用,但是我提出了一些可见性问题:

链接:检查视图可见性 https://stackoverflow.com/questions/4628800/android-how-to-check-if-a-view-inside-of-scrollview-is-visible

我有一个滚动视图(父视图)和许多子视图(LinearLayout -> TableLayout)等。我设置了很多项目View.GONE在 XML 中(android:visibility="gone").

我有一些简单的代码来确定它是否可见getVisibility()但是当我将该项目设置为View.VISIBLE并尝试立即getDrawingRect()我得到一个全是零的矩形。任何进一步的单击都会获得正确的坐标。

现在,这可能是因为视图从未被绘制过(如 XML 中所定义),导致它不返回任何坐标,但我确实设置了View.VISIBLE在尝试确定屏幕可见性之前。我是否需要从 onDraw() 中获取某种回调?或者也许设置代码中隐藏项目的视图可见性。有点烦人;(

一些代码:

Rect scrollBounds = new Rect();
scroll.getHitRect(scrollBounds);

Rect viewBounds = new Rect();

if (view.getVisibility() == View.GONE) {
    view.setVisibility(View.VISBLE)


    viewBounds.getDrawingRect(viewBounds);
    if (!Rect.intersects(scrollBounds, viewBounds) {
        // do somthing
    } 
}

布局区域如下:

  • ScrollView
    • LinearLayout
      • TableLayout
        • Button
        • HiddenView

当然,我很可能完全以错误的方式处理这个问题 - 基本上我只是想确保滚动视图定位自身,以便可以完整地看到已经变得可见的视图。

如果需要任何其他信息,请告诉我!


好的,感谢 OceanLife 为我指明了正确的方向!确实需要回调并且ViewTreeObserver.OnGlobalLayoutListener()成功了。我最终针对我的片段类实现了侦听器,并在需要的地方选取了它。也感谢您关于多次通话的警告,我使用以下方法解决了这个问题removeOnGlobalLayoutListener()方法——有魅力。

Code:

...

// vto initialised in my onCreateView() method

vto = getView().getViewTreeObserver();
vto.addOnGlobalLayoutListener(this);

...

@Override
    public void onGlobalLayout() {

        final int i[] = new int[2];
        final Rect scrollBounds = new Rect();

        sView.getHitRect(scrollBounds);
        tempView.getLocationOnScreen(i);

        if (i[1] >= scrollBounds.bottom) {
            sView.post(new Runnable() {
                @Override
                public void run() {
                    sView.smoothScrollTo(0, sView.getScrollY() + (i[1] - scrollBounds.bottom));
                }
            });
        }

        vto.removeOnGlobalLayoutListener(this);
    }

现在要做一些清理工作...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

确定视图是否在屏幕上 - Android 的相关文章

  • Android 更改适配器中的数据

    我将此适配器用于我的 ListView Appadapter extends ArrayAdapter
  • 如何在屏幕截图后从 BroadcastReceiver 更新 UI

    主要问题 我需要在屏幕截图发生后更新用户界面 我尝试以编程方式在 MainActivity java 的 onResume 中创建 BroadcastReceiver 但由于某种原因它没有获取屏幕截图 因此 我尝试了清单中声明的 Broad
  • FCM 通知 onclick 未打开所需的活动

    我已经尝试了这里发布的几乎所有解决方案以及每个标志的组合 但它不起作用 以下是我遇到问题的用例 1 当我在申请时FCM通知打开我想要的活动 数据被传递到onNewIntent在主要活动中 当应用程序处于前台时它工作正常 2 当处于后台模式
  • 以编程方式切换片段

    我有一个带有两个片段的寻呼机 每个片段都有自己的 xml 我的问题是是否可以以编程方式从一个片段切换到另一个片段并触发任何侦听器 此致 我假设你的意思是浏览器 http developer android com reference and
  • 造型 Sherlock ActionMode 背景

    似乎无法设置 ActionMode 背景的样式 我已经覆盖了操作栏背景 但设置 ActionMode 背景似乎不起作用
  • 播放完整性本地验证

    我正在尝试将播放完整性检查集成到我的应用程序中 以确保我的应用程序没有安装在已取得 root 权限的 Android 设备上 我可以按照谷歌的指导成功获得完整性令牌响应document https developer android com
  • 如何在Android上创建原生C++库?

    我需要用C 编写一个动态链接库 供Android上的Java使用 据我所知 它应该是 so 库 但我不知道该怎么做 我尝试了 Cygwin 但它崩溃了 海湾合作委员会1 cpp usr lib gcc i686 pc cygwin 4 3
  • 想知道如何在 ANDROID 可扩展列表中获取所选项目

    我有一个可扩展列表 其中包含组 大陆和子组 国家 单击一个国家 地区时 我希望该国家 地区显示在另一类的文本视图中 package com zeus eca import android app ExpandableListActivity
  • 如何在Android中正确使用AsyncTask [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我不想传递任何参数doInBackgroundAsyncTask 的方法 那么代码应该是什么样的呢 import android ap
  • 如何从c调用Java函数

    我被这个问题困扰了 我需要从 c c 调用 Java 函数 在示例和教程中 我只看到一个java应用程序调用一个c方法 并在同一个方法中调用另一个java方法 但我想做的是从代码的任何部分调用java方法 这就是我所拥有的 static J
  • 注册到 gcm 时获取空设备 ID

    GCMRegistrar checkDevice this GCMRegistrar unregister this GCMRegistrar checkManifest this if GCMRegistrar isRegistered
  • 如何隐藏 Android Spinner 中的一项

    我正在寻找一种方法来隐藏 Android 旋转小部件中的一个项目 这将允许您模拟没有选择任何项目的微调器 并确保始终为每个选择的项目调用 onItemSelected 回调 如果隐藏项目是 当前 项目 通常 微调器中始终有一项不会生成回调
  • 动画片段和返回堆栈

    我在使用或理解如何弹出时遇到问题 后台堆栈中的 FragmentTransactions 处理自定义 动画 具体来说 我希望它能够调用 out 动画 但是 看来不是 我有一个简单的方法来处理片段事务 FragmentTransaction
  • 如何使用适用于 Android 的 google 驱动器 api 的 url 从 google 驱动器下载文本文件 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已将文本文件上传到我的谷歌云端硬盘帐户 并且该文件是公开的 我通过共享链接获得了该文件的链接 我想要做的是使用我获得的链接使用驱动器
  • 使用 Eclipse 测试 PhoneGap 应用程序时不断收到“发生网络错误”

    我刚刚收到分包商提供的 PhoneGap 解决方案 以便在发布前在我的手机上进行测试 我将项目导入到 Eclipse 中 一切看起来都很好 我可以通过打开 index html 文件在我的计算机上本地测试该应用程序 file E AppDe
  • android:web服务图像替换为本地文件夹中的图像

    我进入了 Android 聊天应用程序的最后阶段 我在使用图像和网络服务时遇到了一些问题 因此 当我选择图像并将该图像发送到 Web 服务时 我从服务获取 URL 我如何将该网址转换为本地文件夹中的图像 我很困惑如何才能使其发挥作用 我想在
  • 恢复 webview 滚动位置?

    我想要拯救国家 of my webView以其页面滚动位置当用户离开应用程序时并在用户再次打开应用程序时恢复它们 这样 用户可以继续阅读恢复的网页视图内容 向下滚动到恢复的位置 以下是我正在使用的方法 Override protected
  • 运行adb命令时出现错误3221226356

    我在使用 Android ADB 时开始发现问题 本质上 在 Windows 10 计算机上 如果我在命令行运行 adb exe P 5037 s emulator 5554 shell getprop ro build version s
  • 如何将 pdf 文档显示到 Webview 中?

    我想在 webview 上显示 pdf 内容 这是我的代码 WebView webview new WebView this setContentView webview webview getSettings setJavaScriptE
  • Android:永久保存文件(即使在清除数据/卸载后)

    我想知道是否有一种方法可以永久存储少量数据 永久我的意思是即使用户清除应用程序数据 卸载应用程序 我也希望数据保留下来 我知道当用户清除应用程序数据 卸载应用程序时 共享首选项和数据库将被删除 我也知道我可以在 SD 卡上保存内容 但是如果

随机推荐