与儿童一起定制 Android 控件

2024-01-13

我正在尝试创建一个自定义Android控件 that 包含一个 LinearLayout。您可以将其视为具有精美边框、背景、左侧图像的扩展 LinearLayout...

我可以在 XML 中完成这一切(效果很好),但由于我的应用程序中出现了数十次,因此很难维护。我认为有这样的东西会更好:

/* Main.xml */
<MyFancyLayout>
    <TextView />   /* what goes inside my control's linear layout */
</MyfancyLayout>

你会如何处理这个问题?我想避免重写整个线性布局 onMeasure / onLayout 方法。这就是我目前所拥有的:

/* MyFancyLayout.xml */
<TableLayout>
    <ImageView />
    <LinearLayout id="container" />   /* where I want the real content to go */
</TableLayout>    

and

/* MyFancyLayout.java */
public class MyFancyLayout extends LinearLayout
{
    public MyFancyLayout(Context context) {
        super(context);
        View.inflate(context, R.layout.my_fancy_layout, this);
    }
}

您将如何将用户指定的内容(main.xml 中的 TextView)插入到正确的位置(id=container)?

Cheers!

Romain

- - - 编辑 - - - -

仍然没有成功,所以我改变了设计以使用更简单的布局,并决定接受一些重复的 XML。但仍然对任何人知道如何做到这一点非常感兴趣!


这个确切的问题已经困扰我一段时间了,但直到现在我才解决了它。

乍一看,问题在于声明性内容(在您的情况下为 TextView)有时会被实例化afterctor(我们通常会在其中膨胀布局),因此现在手头有声明性内容和模板内容将前者推入后者还为时过早。

我发现了一个这样的地方,我们可以操纵这两者:它是一个 onFinishInflate() 方法。我的情况是这样的:

    @Override
    protected void onFinishInflate() {
        int index = getChildCount();
        // Collect children declared in XML.
        View[] children = new View[index];
        while(--index >= 0) {
            children[index] = getChildAt(index);
        }
        // Pressumably, wipe out existing content (still holding reference to it).
        this.detachAllViewsFromParent();
        // Inflate new "template".
        final View template = LayoutInflater.from(getContext())
            .inflate(R.layout.labeled_layout, this, true);
        // Obtain reference to a new container within "template".
        final ViewGroup vg = (ViewGroup)template.findViewById(R.id.layout);
        index = children.length;
        // Push declared children into new container.
        while(--index >= 0) {
            vg.addView(children[index]);
        }

        // They suggest to call it no matter what.
        super.onFinishInflate();
    }

上面引用的labeled_layout.xml 与这样的东西没有什么不同:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation             ="vertical"
    android:layout_width            ="fill_parent"
    android:layout_height           ="wrap_content"
    android:layout_marginLeft       ="8dip"
    android:layout_marginTop        ="3dip"
    android:layout_marginBottom     ="3dip"
    android:layout_weight           ="1"
    android:duplicateParentState    ="true">

    <TextView android:id            ="@+id/label"
        android:layout_width        ="fill_parent"
        android:layout_height       ="wrap_content"
        android:singleLine          ="true"
        android:textAppearance      ="?android:attr/textAppearanceMedium"
        android:fadingEdge          ="horizontal"
        android:duplicateParentState="true" />

    <LinearLayout
        android:id                  ="@+id/layout"
        android:layout_width        ="fill_parent"
        android:layout_height       ="wrap_content"
        android:layout_marginLeft   ="8dip"
        android:layout_marginTop    ="3dip" 
        android:duplicateParentState="true" />
</LinearLayout>

现在(仍然省略一些细节)在其他地方我们可能会像这样使用它:

        <com.example.widget.LabeledLayout
            android:layout_width    ="fill_parent"
            android:layout_height   ="wrap_content">
            <!-- example content -->
        </com.example.widget.LabeledLayout> 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

与儿童一起定制 Android 控件 的相关文章

随机推荐

  • maven buildnumber插件错误The scm url can not be null

    我是 Maven 的新用户 并且很难让 buildnumber maven plugin 执行我所期望的操作 本质上 我希望 maven 构建我的项目并创建结果的 JAR 文件 并在 manifest mf 文件中设置构建号 我将在下面包含
  • 如何抑制此 COM 泛型警告?

    我正在使用 msbuild 编译 VB Net 2 0 应用程序 在 VS2008 中创建 现在我添加了一个通用返回类型 它给了我以下内容 警告 类型库导出器 遇到泛型类型实例 一个签名 通用代码可能不是 导出到COM 刚刚花了很长时间删除
  • 使用 GUI 和工作线程增强 Asio 模式

    我想使用 GUI 线程和某些套接字 IO 的工作线程来实现 Boost Asio 模式 工作线程将使用boost asio io service管理套接字客户端 套接字上的所有操作将仅由工作线程执行 GUI 线程需要从工作线程发送和接收消息
  • 融合几个接近点的简单方法?

    我有一个这样的点列表 points 57 213878612138828 17 916958304169601 76 392039480378514 0 060882542482108504 0 12417670682730897 1 04
  • Hibernate @LazyCollection 注解有什么用

    我有 2 个实体作为父实体和子实体作为 OneToMany 关系 Entity public class Parent Id GeneratedValue strategy GenerationType AUTO private Integ
  • java 如何知道您是否正在运行 javaw.exe 与 java.exe

    相关以编程方式从 java 代码中查找 java exe 的绝对路径 https stackoverflow com questions 9006127 find absolute java exe path programatically
  • 如何使用 C 捕获另一个进程的输出?

    如何使用纯 C 捕获另一个进程的输出 你能提供示例代码吗 编辑 让我们假设Linux 我会对 相当可移植 的代码感兴趣 我想做的就是执行一个命令 捕获它的输出并以某种方式处理它 有多种选择 但它在一定程度上取决于您的平台 那就是说popen
  • 使用 NPOI,如何返回已由 Excel 格式化的单元格值?

    Using NPOI https npoi codeplex com 是否有任何内置的可能性来格式化单元格值 特别是数字和日期值 因为它已经 如果不是 最好的实施方式是什么 我想到了从 Excel 格式字符串到 C 格式字符串的格式字符串转
  • NodeJS 请求多个 api 端点

    好的 我正在尝试使用请求模块向 API 端点发出两个或多个请求 我正在渲染一个 HTML 文件 并使用以下代码将返回的 JSON 传递到车把模板 res render list html title List data returnedJS
  • 初始化一个包含 List 的 Map

    我需要使用里面有列表的地图 Map
  • Orchard CMS 中如何从数据库中获取表数据?

    如何从 Orchard CMS 数据库中获取表数据 我是 Orchard CMS 的初学者 我不知道如何在 Orchard CMS 中获取和保存任何数据 因为它不像 ado net 或 linq to sql 或实体框架等常规数据库访问模型
  • 使用另一个bat文件中的变量创建一个bat文件

    我想创建一个bat文件 其中包含另一个bat文件中的设置变量 这是针对初创公司的 bat文件映射网络驱动器并将一些文件复制到本地计算机并查看需要运行的系统服务 它还需要在每次登录 bat 文件运行时创建一个日志文件 这是我所做的示例 ECH
  • 好主意/坏主意?在一小部分子查询结果之外使用 MySQL RAND()?

    因此 在 MySQL 中 我读到 对于包含大量行的大型表 使用 ORDER BY RAND 是一个坏主意 即使有大约 500 行表 缓慢且低效 大量的行扫描 这 下 看起来如何作为替代方案 SELECT FROM 通常返回少于 20 行的集
  • 无法在 Colab 中导入 ToTensorV2

    from albumentations pytorch transforms import ToTensorV2 我使用了上面的代码 但它不起作用 只需添加一个带有以下行的代码块 pip install albumentations 0 4
  • 使用值进行条件格式设置时出现错误的单元格

    当我使用公式创建新规则时 我经常在 Excel 2010 上遇到问题 该问题在我的几台计算机上都可以重现 我选择多个单元格 例如 A4 B143 然后使用以下公式之一创建新规则 A4 issue A4 issue 然后按 Enter 键 当
  • 将 CSV 文件导入 Java

    在我正在编写的程序中 我希望能够导入 CSV 文件 目前 它需要一个基本的文本文件 File mainemails new File mainemails txt 我知道对于 CSV 导入 使用 File 可能不是最省时的方法 导入 CSV
  • 任何类型的数组总是聚合吗?

    class A public A private int i A a 8 C 11 标准 8 5 1 1 说 聚合是一个数组或类 条款 9 没有用户提供的构造函数 12 1 没有非静态数据成员的大括号或等价初始化器 9 2 没有私有或受保护
  • 无法读取架构文档“http://www.springframework.org/schema/beans/spring-beans-3.0.xsd”

    启动我的 Spring 应用程序时 出现以下错误 WARNING Ignored XML validation warning org xml sax SAXParseException schema reference 4 Failed
  • jquery append() 不适用于动态添加的元素

    考虑 HTML ul li Default item li li Default item li ul
  • 与儿童一起定制 Android 控件

    我正在尝试创建一个自定义Android控件 that 包含一个 LinearLayout 您可以将其视为具有精美边框 背景 左侧图像的扩展 LinearLayout 我可以在 XML 中完成这一切 效果很好 但由于我的应用程序中出现了数十次