如何在java和xml中传递自定义组件参数

2023-12-25

在 android 中创建自定义组件时,经常会被问到如何创建 attrs 属性并将其传递给构造函数。

通常建议在 java 中创建组件时只需使用默认构造函数,即

new MyComponent(context);

而不是尝试创建一个 attrs 对象来传递给基于 xml 的自定义组件中常见的重载构造函数。我尝试创建一个 attrs 对象,但它似乎并不容易或根本不可能(没有极其复杂的过程),而且从所有方面来看,这并不是真正需要的。

我的问题是:在 java 中构造自定义组件的最有效方法是什么,该组件传递或设置在使用 xml 扩展组件时本来由 attrs 对象设置的属性?


(全面披露:这个问题是创建自定义视图 https://stackoverflow.com/questions/4418700)

您可以创建超出继承自的三个标准构造函数的构造函数View添加您想要的属性...

MyComponent(Context context, String foo)
{
  super(context);
  // Do something with foo
}

...但我不推荐它。最好遵循与其他组件相同的约定。这将使您的组件尽可能灵活,并防止使用您的组件的开发人员因为您的组件与其他组件不一致而焦头烂额:

1. 为每个属性提供 getter 和 setter:

public void setFoo(String new_foo) { ... }
public String getFoo() { ... }

2. 定义属性res/values/attrs.xml因此它们可以在 XML 中使用。

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <declare-styleable name="MyComponent">
    <attr name="foo" format="string" />
  </declare-styleable>
</resources>

3. 提供三个标准构造函数View.

如果您需要从一个采用AttributeSet, 你可以做...

TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.MyComponent);
CharSequence foo_cs = arr.getString(R.styleable.MyComponent_foo);
if (foo_cs != null) {
  // Do something with foo_cs.toString()
}
arr.recycle();  // Do this when done.

完成所有操作后,您可以实例化MyCompnent以编程方式...

MyComponent c = new MyComponent(context);
c.setFoo("Bar");

...或通过 XML:

<!-- res/layout/MyActivity.xml -->
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:blrfl="http://schemas.android.com/apk/res-auto"
  ...etc...
>
  <com.blrfl.MyComponent
   android:id="@+id/customid"
   android:layout_weight="1"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:layout_gravity="center"
   blrfl:foo="bar"
   blrfl:quux="bletch"
  />
</LinearLayout>

额外资源 -https://developer.android.com/training/custom-views/create-view https://developer.android.com/training/custom-views/create-view

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

如何在java和xml中传递自定义组件参数 的相关文章

随机推荐

  • 如何读取 Objective-C 堆栈跟踪

    我有以下堆栈跟踪 0 MyApp 0x000833a3 TFCrashHandler backtrace 26 1 MyApp 0x000836bd TFSignalHandler 28 2 libsystem c dylib 0x33ea
  • 删除重复行并更新引用

    如何删除一个表中的重复行并将另一表中的引用更新为剩余行 重复仅出现在名称中 Id 列是标识列 Example 假设我们有两张表Doubles and Data Doubles table Id int Name varchar 50 Dat
  • 如何从嵌入式 HTML 与 Swift 进行通信以更改 bool

    您好 我想在执行 html 中的 onReady 块后更改绑定变量 click 的值 我可以使用评估java脚本从swift到html进行通信 但是我如何从 html 中的 onReady 与 swift 进行通信以更改 bools val
  • Chrome 扩展中的跨源 XMLHttpRequest

    根据 chrome 扩展 API 如果设置了权限 则应允许使用 XMLHttpRequest 对象进行跨源调用 只要扩展程序首先请求跨源权限 就可以与其源之外的远程服务器进行通信 我正在密切关注谷歌教程 http code google c
  • 如何 dplyr 按列索引重命名列?

    以下代码重命名数据集中的第一列 require dplyr mtcars gt setNames c RenamedColumn names 2 length names 期望的结果 RenamedColumn cyl disp hp dr
  • jsPlumb:如何选择特定连接器

    我似乎不知道如何选择特定的 jsPlumb 连接器 我知道我可以选择与源或目标相关的所有连接器 但通常我会在同一源和目标之间有多个连接器 因此在这种情况下我看不到能够选择特定连接器的方法 我的具体用例如下 如果用户单击连接器 则会出现一个对
  • 无法重新启动 Spring 批处理作业

    我有一个 Spring Batch 作业 用于读取 转换和写入 Oracle 数据库 我通过 CommandLineJobRunner 实用程序运行该作业 使用 fat jar 使用 Maven Shade 插件生成的依赖项 该作业随后由于
  • 有没有办法在 JavaScript 中清除对象?

    有没有办法清除 Javascript 中的对象 具体来说 如果一个对象有多个成员变量 是否有一种简单的方法来重置每个值 function exampleObject this valueA A this valueB B this myAr
  • SQL——在 select 语句中分配位变量

    例如 declare bitHaveRows bit select bitHaveRows count from table where predicate 我可以在这一行调用任何函数吗 select bitHaveRows count 如
  • 如何在请求写入代理 Netty 服务器中的 outboundChannel 时在同一处理程序中获取响应 byteBuf

    我正在实现 netty 代理服务器 如下所示 一个http请求进来 如果本地缓存有数据 则写入channel并flush 如果没有 则从远程服务器获取数据 将其添加到缓存并刷新 我在与写入客户端的处理程序相同的处理程序中从响应中提取 byt
  • 如何查找Javascript语法错误? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在编写一段 JavaScript 代码 并在语法中犯了很多愚蠢的错误 但是找到错误所在行的唯一方法是开始注释掉我刚刚编写的代码部分
  • 搜索 R-Studio 中所有打开的文件

    R Studio 中的普通搜索功能 ctrl f 仅搜索当前选定的文件 有没有办法搜索所有打开的文件 Tom 查看以下文档 http www rstudio com ide docs using navigation http www rs
  • 我需要在共享内存对象上使用 shm_unlink 吗?

    我编写了一个连续运行的服务器 GNU C Linux 偶尔执行小型独立程序来完成工作 为了有效地将数据获取到工作程序 服务器创建并映射一个共享内存对象 为了清楚起见 缩写了代码 int fd shm open shm file O CREA
  • 如何在MaterialDesignInXamlToolkit中添加个人图标?

    Material Design Icons 项目包含大量图标 但对于非英语国家来说还不够 那么如何在不修改源代码的情况下在个人项目中添加另一个包图标呢 正如 mm8所说 是的 这只是一条路径 但是 是的 您可以构建自己的 PackIcon
  • Android Afreechart - 更改点形状、线条粗细和颜色

    我正在尝试在我的应用程序中更改折线图点的形状 我在用afreechart s TimeSeriesChart 我想让这条线在粗细 颜色和点形状方面变得更漂亮 哪里可以改代码 将使用哪种方法 我现在拥有的 source googlecode
  • 通过 ckeditor 上传的 django+heroku+S3 图片在创建帖子一段时间后被删除

    我已经在heroku中部署了我的django应用程序 postgresql作为数据库并用于存储我使用亚马逊S3存储的图像 我面临的问题是 用于创建我使用过的博客文章 ckeditor 因此用户可以输入图像以及内容文本来创建帖子 创建帖子后
  • 由于“找不到符号类 X”错误,无法在 Intellij Idea 中编译 java 类

    我在项目中从头开始创建了新的 Java 模块 在模块创建向导中选择了 创建 src 文件夹 源文件夹中有一个 com 包 其中包含两个公共类 例如 A 和 B A类实例化B类 IDE 不显示错误 并且当光标位于 A 类源内的类名上时 按 c
  • 模拟在默认系统相机应用程序中拍照

    我正在制作 Android 语音助手应用程序 在后台运行服务以识别语音命令 当用户说 自拍 这个词时 我想在默认系统相机应用程序中拍照 我已经知道如何使用语音命令 但问题是我无法让相机应用程序拍照 我尝试了一些方法但没有帮助 第一次我尝试模
  • 如何在页面刷新后保持登录状态?

    我正在使用 React 和 Node 开发一个全栈应用程序 以下是主屏幕 用户登录后 用户名会显示在导航栏中 服务器的响应 包括 JWT 会保存在本地存储中 如下图所示 现在 当我刷新页面时 用户已注销 这种情况不应该发生 因为我使用 ax
  • 如何在java和xml中传递自定义组件参数

    在 android 中创建自定义组件时 经常会被问到如何创建 attrs 属性并将其传递给构造函数 通常建议在 java 中创建组件时只需使用默认构造函数 即 new MyComponent context 而不是尝试创建一个 attrs