自定义视图组中的视图未显示

2024-01-12

我最近深入研究创建自定义 ViewGroups 并遇到了一个我无法解决的问题。

我有 2 个 ViewGroups - ViewManager 和 Article

ViewManager 只是在上一篇文章下方布置一篇文章(即像垂直 LinearLayout)

正如您在图像中看到的那样,文章排列了几个 TextView 和一个 ImageView。创建一篇文章并将其添加到 ViewManager 工作正常,所有内容都会显示,但是当我添加第二篇文章时,该文章的所有内容都不可见。

那么为什么 TextView 或 ImageView 都没有显示出来(注意蓝色条是用 onDraw() 中的 canvas.drawRect() 绘制的)。我还打印了(通过logcat)子视图的绑定值(即drawChild()中的getLeft()/ Top()/ Right()/ Bottom(),它们看起来都很好

FIRST TextView
FIRST left 5 right 225 top 26 bottom 147
FIRST TextView
FIRST left 5 right 320 top 147 bottom 198
FIRST TextView
FIRST left 5 right 180 top 208 bottom 222
FIRST ImageView
FIRST left 225 right 315 top 34 bottom 129
SECOND TextView
SECOND left 10 right 53 top 238 bottom 257
SECOND TextView
SECOND left 5 right 325 top 257 bottom 349
SECOND TextView
SECOND left 5 right 320 top 349 bottom 400
SECOND TextView
SECOND left 5 right 180 top 410 bottom 424

那么有人知道我做错了什么吗?

测量方法文章

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
    int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
    int widthSpecSize =  MeasureSpec.getSize(widthMeasureSpec);

    int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
    int heightSpecSize =  MeasureSpec.getSize(heightMeasureSpec);
    specWidth = widthSpecSize;
    int totalHeight=0;

    int width = 0;
    if(mImage!=null&&mImage.getParent()!=null){
        measureChild(mImage,MeasureSpec.makeMeasureSpec(100, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(100, MeasureSpec.AT_MOST));
        width=widthSpecSize-mImage.getWidth();
        imageWidth = mImage.getMeasuredWidth();
    }
    for(int i = 0;i<this.getChildCount();i++){
        final View child = this.getChildAt(i);

        //get the width of the available view minus the image width
        if(imageWidth > 0)
            width =widthSpecSize- imageWidth; 
        else
            width = widthSpecSize;

        //measure only the textviews
        if(!(child instanceof ImageView)){
            measureChild(child, MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), heightMeasureSpec);
            //calculate total height of the views, used to set the dimension
            totalHeight+=child.getMeasuredHeight();
        }
    }
    //if the title height is greater than the image then the snippet
    //can stretch to full width
    if(mTitle.getMeasuredHeight()>mImage.getMeasuredHeight())
        measureChild(mSnippet, MeasureSpec.makeMeasureSpec(widthSpecSize, MeasureSpec.AT_MOST), heightMeasureSpec);

    //measure source to make it full width
    measureChild(mSource,MeasureSpec.makeMeasureSpec(LayoutParams.WRAP_CONTENT, MeasureSpec.AT_MOST), heightMeasureSpec);
    setMeasuredDimension(widthSpecSize, totalHeight);
}

和 onLayout 方法

protected void onLayout(boolean changed, int left, int top, int right, int bottom) {

    int newLeft = left+outerMargin;
    int newTop = top+marginTop;
    int prevHeight = 0;

    if(mEngine!=null){

        int height = mEngine.getMeasuredHeight();
        int childRight = newLeft+mEngine.getMeasuredWidth(); 
        mEngine.layout(newLeft+marginLeft, newTop+prevHeight+2, childRight+marginLeft, newTop+height+prevHeight+2);
        maxRight = Math.max(maxRight, childRight);
        prevHeight += height+2;
        topBarHeight = mEngine.getMeasuredHeight()+(marginLeft*2);
        maxBottom = Math.max(maxBottom, mEngine.getBottom());
    }
    if(mTitle!=null){
        int height = mTitle.getMeasuredHeight();
        int childRight = newLeft+mTitle.getMeasuredWidth();
        mTitle.layout(newLeft, newTop+prevHeight, childRight, newTop+height+prevHeight);
        maxRight = Math.max(maxRight, childRight);
        prevHeight += height;
        maxBottom = Math.max(maxBottom, mTitle.getBottom());
    }
    if(mSnippet!=null){
        int height = mSnippet.getMeasuredHeight();
        int childRight = newLeft+mSnippet.getMeasuredWidth();
        mSnippet.layout(newLeft, newTop+prevHeight, right, newTop+height+prevHeight);
        maxRight = Math.max(maxRight, childRight);
        prevHeight += height;
        maxBottom = Math.max(maxBottom, mSnippet.getBottom());
    }
    if(mSource !=null){
        int height = mSource.getMeasuredHeight();
        int childRight = newLeft+mSource.getMeasuredWidth();
        mSource.layout(newLeft, newTop+prevHeight+(marginTop*2), childRight, newTop+height+prevHeight+(marginTop*2));
        maxRight = Math.max(maxRight, childRight);
        prevHeight += height;
        maxBottom = Math.max(maxBottom, mSource.getBottom());

    }
    if(mImage!=null){
        int height = mImage.getMeasuredHeight();
        log("mxW "+maxRight);
        int childRight = maxRight+mImage.getMeasuredWidth();
        mImage.layout(right-mImage.getMeasuredWidth()+5, newTop+topBarHeight, right-5, height+topBarHeight);
        totalWidth = childRight;
        maxBottom = Math.max(maxBottom, mImage.getBottom());
    }else
        totalWidth = maxRight;

}

附带说明一下,可以像这样使用 LayoutParams.WRAP_CONTENT 作为 makeMeasureSpec() 的参数吗?

MeasureSpec.makeMeasureSpec(LayoutParams.WRAP_CONTENT, MeasureSpec.AT_MOST)

In onLayout,孩子的位置应该相对于他们的父母。您正在添加top (and left)到孩子们的坐标。这对于第一篇文章来说不是问题,因为top and left为零。对于第二条,left仍然为零但是top是第二篇文章最上面的ViewManager中的。只要摆脱newTop and newLeft并分别使用marginTop and outerMargin在他们的地方。

关于你的旁白:第一个论点makeMeasureSpec应该是一个维度。通过使用 WRAP_CONTENT,您将最大尺寸设置为 -2,这可能不是您想要做的。

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

自定义视图组中的视图未显示 的相关文章

  • 如何快速自动发送FCM或APNS消息?

    我正在开发一项后端服务 通过 FCM 或 APNS 向移动应用程序发送推送通知 我想创建一个可以在一分钟内运行的自动化测试 并验证服务器是否可以成功发送通知 请注意 我不一定需要检查通知是否已送达 只需检查 FCM 或 APNS 是否已成功
  • Android Studio 3.0 Canary 9 - 无法解析包

    我在 Android Studio 3 0 Canary 9 中遇到几个错误 这些错误是 无法解析 android 软件包 下面列出了一些错误 我刚刚安装了 SDK 的所有额外软件包 但仍然收到 gradle 构建错误 Error 82 1
  • React Native 从 JavaScript 代码内部访问 strings.xml

    有没有办法访问当前值android app src main res values strings xml从 JavaScript 代码内部 我想为每个构建放置不同的端点 URL 但我什至无法检测到反应本机代码内的构建类型 而不必求助于 D
  • StrictMode 策略违规:我的应用程序中存在 android.os.strictmode.LeakedClosableViolation?

    Android 开发新手 第一次在我的应用程序上尝试 StrictMode 我注意到以下内容 并想知道这是否是我的应用程序或库中的问题 我不太清楚 谢谢你 D StrictMode StrictMode policy violation a
  • Android - 从资产中解析巨大(超大)JSON 文件的最佳方法

    我正在尝试从资产文件夹中解析一些巨大的 JSON 文件 我如何加载并添加到 RecyclerView 我想知道解析这种大文件 大约 6MB 的最佳方法是什么 以及您是否知道可以帮助我处理此文件的良好 API 我建议您使用GSON lib h
  • 谷歌坐标认证

    当我尝试连接到 Google 坐标时 总是出现异常GoogleAuthException 我拥有 Google 地图协调中心许可证 我确实使用我的包应用程序名称和 SHA1 在 google 控制台中创建了我的客户端 ID 我将权限添加到清
  • 是否可以将数组或对象添加到 Android 上的 SharedPreferences

    我有一个ArrayList具有名称和图标指针的对象 我想将其保存在SharedPreferences 我能怎么做 注意 我不想使用数据库 无论 API 级别如何 请检查SharedPreferences 中的字符串数组和对象数组 http
  • 当文本输入聚焦在 React Native for Android 的底部工作表上时,视图移出屏幕

    我正在使用图书馆 https github com osdnk react native reanimated bottom sheet https github com osdnk react native reanimated bott
  • Adobe 是否为其 PDF 阅读器提供 Android SDK 或 API? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我希望能够在我们的应用程序内的视图中显示本地 PDF 文件 在 Android 4 03 下的平板电脑上运行 目前 我们将 Adob eR
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • Android SIP 来电使用带有广播接收器的服务

    大家好 其实我正在尝试创建一个应用程序 支持基于 SIP 通过互联网进行音频呼叫 这里使用本机 sip 我遇到了来电问题 我已经完成了服务的注册部分 但是在接听电话时我无法接听电话 请帮助我 Service file package exa
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 带有 EditText 和 Spinner 的对话框

    我有一个按钮 单击后会弹出一个对话框 我希望对话框有一个EditText and a Spinner对话框内 我不知道如何设置它的视图 我有一个代码AlertDialog它有效 只是EditText and Spinner我需要将其放入其中
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 如何默认在 ActionOpenDocument 意图中显示“内部存储”选项

    我需要用户选择一个自定义文件类型的文件 并将其从 Windows 文件资源管理器拖到 Android 设备上 但默认情况下内部存储选项不可用 当我使用以下命令启动意图时 var libraryIntent new Intent Intent
  • 如何确定对手机号码的呼叫是本地呼叫还是 STD 或 ISD

    我正在为 Android 开发某种应用程序 但不知道如何获取被叫号码是本地或 STD 的号码的数据 即手机号码检查器等应用程序从哪里获取数据 注意 我说的是手机号码 而不是固定电话 固定电话号码 你得到的数字是字符串类型 因此 您可以获取号
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 实现滚动选择 ListView 中的项目

    我想使用 ListView 您可以在其中滚动列表来选择一个项目 它应该像一个 Seekbar 但拇指应该是固定的 并且您必须使用该栏来调整它 我面临的一个问题是 我不知道这种小部件是如何调用的 这使得我很难搜索 所以我制作了下面这张图片 以
  • 将 Intent 包装在 LabeledIntent 中以用于显示目的

    要求 我的应用程序中有一个 共享 按钮 我需要通过 Facebook 分享 我需要选择是否安装原生 Facebook 应用程序 我们的决定是 如果未安装该应用程序 则将用户发送到 facebook com 进行分享 当前状态 我可以检测何时
  • 如何将 google+ 登录集成到我的 Android 应用程序中?

    大家好 实际上我需要通过我的应用程序从 google 登录人们 现在我阅读了 google 上的文档 其中指出 要允许用户登录 请将 Google Sign In 集成到您的应用中 初始化 GoogleApiClient 对象时 请求 PL

随机推荐

  • T-SQL 脚本 - 时间线的逻辑问题

    创建并加载两个临时表 这是架构 Create table SH date datetime sched id int agent id int Create table SD sched id int start minute int le
  • Java表达式语言如何解析布尔属性? (在 JSF 1.2 中)

    所以我们都知道 someBean value 将尝试获取某些属性的内容someBean called value 它会寻找getValue 但是 如果这个属性是boolean 它会寻找isValue 它不会寻找的是hasValue 这让我思
  • BitmapImage 缺少 BeginInit() 和 EndInit() 函数?

    据我发现 我似乎无法访问上述功能 我正在导入 BitmapImage 类 using System Windows Media Imaging 但是在下面的代码中 public static void loadCardImage Card
  • 无法使用 Virtualenv 通过 pip 安装

    以下是我运行时遇到的错误pip serkan rm r mysite serkan pwd Users serkan Desktop Python Folder serkan virtualenv mysite New python exe
  • 传统 Web 应用程序和 API 中的身份验证、授权和会话管理

    如果我错了 请纠正我 在传统的 Web 应用程序中 浏览器会自动将会话信息附加到向服务器发出的请求中 以便服务器可以知道该请求来自谁 实际上到底附加了什么 但是 在基于 API 的应用程序中 此信息不会自动发送 因此在开发 API 时 我必
  • 运行 Android Studio gradle 构建时如何使用所有 CPU 核心/线程?

    我正在 Android Studio 中寻找参数或配置 Gradle 它可以设置构建 以便在构建期间使用我的所有 CPU 核心 即 如果我有一个四核 CPU 并且每个核心运行 8 个线程 我如何优化构建 以便它将使用它可以获得的所有资源 当
  • Matlab M 脚本可以通过脚本中的语句停止吗?

    一个非常简单且可能显而易见的问题 如何使用脚本中的语句中止 Matlab M 脚本的执行 这类似于调用return在函数中间立即结束它 If return http www mathworks com help matlab ref ret
  • 性能监控Openerp

    我们正在尝试实施新的遗物 http www newrelic com http www newrelic com 在开发服务器上测试 openerp 的性能 newrelic的以下安装步骤要求我们修改WSGI应用程序文件 我是 opener
  • TDD:单元测试异步调用

    guys 我正在开发一个应用程序 并通过单元测试来构建它 但是 我现在处于需要测试异步调用的情况 例如 void testUserInfoBecomesValidWhenUserIsBuiltSuccessfully if userBuil
  • go build 工作正常但 go run 失败

    我在主包的一个目录下有几个文件 主程序 配置文件 服务器 go 当我这样做时 去构建 程序构建完美并且运行良好 当我这样做时 go run main go 失败了 Output command line arguments main go
  • 如何让自托管 signalR 服务器作为 NetCore 控制台应用程序运行

    我想使用 NetCore 在控制台应用程序中创建 SignalR 自托管服务器 我对 Web 开发和 Net Core 完全陌生 但想使用 SignalR 作为基于 Web 的实时协议 不需要网页 所以我想要一个控制台应用程序 我已经成功测
  • 出售苹果股票(一进一出)

    任何人都可以帮我解决我的代码吗 我在卖苹果时遇到问题 它减去我的所有股票 有时当我的输入超过股票时 数字会变成负数 int main void int choice 0 int days 1 i buyApple int stocks 99
  • IntelliJ 中的远程结对编程

    结对编程时有没有办法使用 IntelliJ 如果有 v7 和 v8 的选项就好了 但如果需要的话我会升级到 v9 这个问题有点像this https stackoverflow com questions 926349 remote pai
  • gradle 测试执行时间过长

    我有一个 Spring boot 应用程序 可以在 10 秒内启动 然而 在一个简单的空集成测试中 我的执行时间很糟糕 60 70 秒 使用 IntelliJ 或时也是如此gradle test spring上下文的初始化比手动运行服务花费
  • Elixir + Ecto:不在 [array] 中怎么办?

    我正在尝试寻找所有Users 中没有特定的字符串元素match history场地 我对此进行了猜测 matched user User gt where u device id not in u match history gt limi
  • 如何从 Checkbox.checked 上的 Gridview 获取 Id?

    我有 GridView 和一个按钮 如下所示 然后我将 gridview 与数据库中的数据绑定 GridView 有两个隐藏字段 Id 和 ClassIndex 当我选择一个复选框并单击按钮时 我想获取相应的 ID 和文件名
  • 如何解决 JDK 的这个限制?

    我正在从 Java Collection Framework 中寻找一个不允许 null 元素的类 你认识一个吗 Use Constraints import com google common collect Constraints Co
  • 聊天机器人 - 使用 Facebook 登录为不属于您的页面生成页面令牌

    有谁知道如何在您不拥有的页面上安装 Facebook 聊天机器人 我已经创建了一个聊天机器人并希望允许其他FB页面安装我的聊天机器人应用程序 我可以为我管理的FB页面生成page access token 但是如何获取我不是管理员的FB页面
  • 如何在生产模式下运行 GWT

    我正在尝试按照以下说明在生产模式下运行 GWT 项目https developers google com web toolkit usingeclipse https developers google com web toolkit u
  • 自定义视图组中的视图未显示

    我最近深入研究创建自定义 ViewGroups 并遇到了一个我无法解决的问题 我有 2 个 ViewGroups ViewManager 和 Article ViewManager 只是在上一篇文章下方布置一篇文章 即像垂直 LinearL