将值传递给 Android 中的自定义视图

2024-04-12

Cheers,

我有一个接收用户输入(2 个数字,宽度和高度)的应用程序,理论上根据该输入,我有一个应该绘制网格(宽度和高度)的自定义视图。

Note:

  • 应在视图尝试绘制自身之前接收这两个值。
  • 这两个值不是恒定的,因此我认为 XML 方法没有帮助。
  • 有人告诉我,向 View 构造函数添加另一个参数是邪恶的。
  • 不要将我的 2 个值与 canvas.getWidth 等混淆。这些值只是为了绘制某些东西而需要的,没有其他值。
  • 我的View也是一个ViewGroup。
  • 主要问题是在 XML 文件中声明的视图引起的。

我通过创建一个包含这两个静态值的SchemeContext类暂时解决了这个问题,我只需在onCreate中(在onCreateView之前)设置它们,然后在需要时在自定义视图onDraw中使用它们(SchemeContext.width)。这并不是人们所谓的 OOP,我将全局变量强加到 java 上,并且由于片段生命周期,这些变量是按时设置的。

我看过这个答案如何在调用 onDraw() 之前将变量传递给自定义 View? https://stackoverflow.com/questions/25419176/how-to-pass-variables-to-custom-view-before-ondraw-is-called.

但它更多的是一种解决方法,而不是解决方案(而且可能不是最快的解决方案)。必须有一个明智的解决方案,我不认为 Android 上的 3D 游戏会诉诸这些解决方法(带有 OpenGL 的 SurfaceView 仍然是一个视图,对吧?:d)。

如果有一个明显的解决方案并且这是一个明显的双重,我将删除这个问题。


我还没有尝试过这个,但我认为通过覆盖可以相当干净地做到这一点LayoutInflater.Factory。这样,您可以拦截需要传递给其构造函数的附加参数的视图的创建,并让其余部分陷入默认膨胀。

例如,在您的活动中,在膨胀视图层次结构之前:

LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
MyInflaterFactory factory = new MyInflaterFactory();
// Pass information needed for custom view inflation to factory.
factory.setCustomValue(42);
inflater.setFactory(factory);

对于您的工厂实施:

class MyInflaterFactory implements LayoutInflater.Factory {
    public void setCustomValue(int val) {
        mCustomVal = val;
    }

    @Override
    public View onCreateView (String name, Context context, AttributeSet attrs) {
        if (name.equals("com.package.ViewWithCustomCreation")) {
            return new ViewWithCustomCreation(context, attrs, mCustomVal);
        }
        return null;
    }

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

将值传递给 Android 中的自定义视图 的相关文章

随机推荐

  • 谁将高级语言转换为汇编语言

    好吧 通过计算机指令 程序的基本功能 我了解到我们用高级语言编写源代码 编译器将其转换为低级语言 机器代码 目标代码 我还了解到汇编器将汇编语言转换为机器代码 目标代码 那么我就有以下疑问 如果编译器直接将高级转换为低级 则从生成该汇编语言
  • “重置”对象变量的“Pythonic”方式?

    我认为 这里的 变量 指的是 名称 不完全确定pythonistas使用的定义 我有一个对象和一些方法 这些方法都需要并且都改变对象的变量 我怎样才能以最Pythonic和最好的方式 尊重OOP的技术 实现让方法使用对象变量 同时又保留其他
  • 嵌套表格中的长字换行

    我正在尝试总结一个很长的词 我看过这个帖子 如何防止长单词破坏我的 div https stackoverflow com questions 320184 how to prevent long words from breaking m
  • 生成谷歌地图图像[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想允许我的网站的最终用户生成谷歌地
  • 如何使用Logback以JSON方式登录?

    我是 SLF4J 和 Logback 的新手 我正在尝试记录以下 API 的每个请求和响应link https pivotal io de application transformation recipes observability r
  • 内容可编辑和非按钮元素

    如果使用按钮 我可以轻松地对内容可编辑的选择执行 execcommand 但是使用任何其他元素都会失败 http jsbin com atike edit http jsbin com atike edit 为什么会这样以及如何使用 div
  • 具有通用向量和对类型的对向量,模板的模板

    我想将一个成对的向量传递给一个函数 实际的向量实现以及对的类型应该是模板参数 我想到了这样的事情 template
  • jquery - firefox 中的 event.preventDefault()

    我有问题event preventDefault 在 Firefox 中 它不起作用 这是 jquery 代码 facebook del 1 click function event preventDefault var selector
  • MVC(模型-视图-控制器)——能用简单的术语解释一下吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我需要向一位不太懂技术的经理解释 MVC 模型 视图 控制器 概念 但遇到了麻烦 问题是解释需要处于 你的奶奶会明白的 水平 例如即使是相当简单的解释
  • 如何快速发送自动短信? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在我的应用程序中自动发送短信 我怎样才能快速做到这一点 我使用 MFMessageComposeViewController 发送
  • 对 Map 列表进行排序

    我有一个像这样创建的列表变量 List
  • 观察者 - 显式指定感兴趣的修改 - JAVA 实现

    I asked here https stackoverflow com questions 65198966 observer pattern observe attributes independently当我需要通知时我应该如何处理这
  • 为什么“System.out.println”在 Android 中不起作用?

    我想在控制台中打印一些内容 以便我可以调试它 但由于某种原因 我的 Android 应用程序中没有打印任何内容 那我该如何调试呢 public class HelloWebview extends Activity WebView webv
  • Angular 2 引导选项 - AOT 与 JIT

    刚开始使用 Angular 2 Angular 2 中的各种 Bootstrapping 选项有哪些 为什么当我进行更改并刷新时 index html 只需要很少的时间来检索 HTML 标记 它们之间的区别 有两种选择 动态引导 使用的编译
  • 如何为 Debian/Ubuntu 打包 Mono 应用程序

    是否有任何用于为 Debian Ubuntu 打包 Mono 应用程序的指南或工具 比如将应用程序附带的程序集放在哪里等 Mono 有一些关于打包的一般准则 但这些准则并非特定于 Debian Ubuntu 它们的做法可能有所不同 http
  • C:将x86指令放入数组并执行它们[重复]

    这个问题在这里已经有答案了 有没有办法将处理器指令放入数组中 使其内存段可执行并将其作为简单函数运行 int main char myarr 13 0x90 0xc3 void myfunc void myarr myfunc return
  • Google Calendar API - 通过服务帐户访问自己的日历

    我想访问 Google Calendar API 以使用 Python 插入条目 我创建了一个服务帐号在Google API控制台上 添加私钥 下载它 但是 当我尝试修改同一帐户上的任何日历时 我收到以下错误消息 读书作品 Code is
  • scala 框架中支持 PostgreSQL 特定的 array_agg 函数吗?

    是否有一些 scala 关系数据库框架 anorm squeryl 等 使用类似 postgres 的聚合器在分组后生成列表 或者至少模拟其使用 我期望有两个层次的实施 一个 标准 的 其中至少任何带有 array agg 的 SQL 分组
  • 我的 Rails 应用程序的捆绑包安装冻结

    有时 在使用 Rails 应用程序时 运行bundle install命令在处理 Rails Gemfile 时冻结 我尝试过清除缓存 但没有任何改善 请务必仔细检查并确保您声明的是 Rails 版本 如果不声明版本 Bundler 最终可
  • 将值传递给 Android 中的自定义视图

    Cheers 我有一个接收用户输入 2 个数字 宽度和高度 的应用程序 理论上根据该输入 我有一个应该绘制网格 宽度和高度 的自定义视图 Note 应在视图尝试绘制自身之前接收这两个值 这两个值不是恒定的 因此我认为 XML 方法没有帮助