当前位置: 首页 > 面试题库 >

在AttributeSet中访问自定义组件的attrs

戚飞雨
2023-03-14
问题内容

我有一个自定义组件,其中包含两个具有自定义尺寸设置方法的TextView(两个文本视图的比例大约为1:2)。由于这是RelativeLayout的子类,因此它没有textSize属性,但是我想知道是否仍然可以android:textSize在XML实例中为此组件设置属性,然后textSize从AttributeSet中获取要使用的属性与我setSize()在构造函数中的自定义方法。

我已经看到了使用自定义属性执行此操作的技术,但是如果我想获取Android词典中已经存在的属性该怎么办?


问题答案:

是的,有可能;

假设您的RelativeLayout声明(以xml格式)具有使用14sp定义的textSize:

android:textSize="14sp"

在自定义视图的构造函数(采用AttributeSet的视图)中,您可以从Android的命名空间中检索属性,如下所示:

String xmlProvidedSize = attrs.getAttributeValue("http://schemas.android.com/apk/res/android", "textSize");

xmlProvidedSize的值将类似于“ 14.0sp”,并且可能只需进行少量的字符串编辑就可以提取数字。

声明您自己的属性集的另一种选择可能不会很冗长,但是也可以。

因此,您拥有了自定义视图,并且TextViews声明了类似这样的权限:

public class MyCustomView extends RelativeLayout{

    private TextView myTextView1;
    private TextView myTextView2;

// rest of your class here

大…

现在,您还需要确保自定义视图会覆盖采用AttributeSet的构造函数,如下所示:

public MyCustomView(Context context, AttributeSet attrs){   
    super(context, attrs);
    init(attrs, context);  //nice, clean method to instantiate your TextViews// 
}

好的,让我们现在看看init()方法:

private void init(AttributeSet attrs, Context context){
    // do your other View related stuff here //


    TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.MyCustomView);
    int xmlProvidedText1Size = a.int(R.styleable.MyCustomView_text1Size);
    int xmlProvidedText2Size = a.int(R.styleable.MyCustomView_text2Size);

    myTextView1.setTextSize(xmlProvidedText1Size);
    myTextView2.setTextSize(xmlProvidedText2Size);

    // and other stuff here //
}

您可能想知道R.styleable.MyCustomView,R.styleable.MyCustomView_text1Size和R.styleable.MyCustomView_text2Size来自何处;请允许我详细说明。

您必须在attrs.xml文件(在values目录下)中声明属性名称,以便在使用自定义视图的任何地方,从这些属性收集的值都将交到构造函数中。

因此,让我们看看如何像您所要求的那样声明这些自定义属性:这是我的整个attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyCustomView">
        <attr name="text1Size" format="integer"/>
        <attr name="text2Size" format="integer"/>
    </declare-styleable>
</resources>

现在,您可以在XML中设置TextViews的大小,但是在不声明Layout中的命名空间的情况下,可以这样设置:

<com.my.app.package.MyCustomView
    xmlns:josh="http://schemas.android.com/apk/res-auto"
    android:id="@+id/my_custom_view_id"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    josh:text1Size="15"
    josh:text2Size="30"     
    />

请注意,我如何将名称空间声明为“ josh”作为CustomView属性集中的第一行。

我希望这对Josh有帮助,



 类似资料:
  • Mpx中的自定义组件完全基于小程序原生的自定义组件支持,与此同时,Mpx提供的数据响应和模板增强等一系列增强能力都能在自定义组件中使用。 原生自定义组件的规范详情查看这里 动态组件 Mpx中提供了使用方法类似于 Vue 的动态组件能力,这是一个基于 wx:if 实现的语法。通过对 is 属性进行动态绑定,可以实现在同一个挂载点切换多个组件,前提需要动态切换的组件已经在全局或者组件中完成注册。 使用

  • PyQt5有丰富的组件,但是肯定满足不了所有开发者的所有需求,PyQt5只提供了基本的组件,像按钮,文本,滑块等。如果你还需要其他的模块,应该尝试自己去自定义一些。 自定义组件使用绘画工具创建,有两个基本方式:根据已有的创建或改进;通过自己绘图创建。 Burning widget 这个组件我们会在Nero,K3B,或者其他CD/DVD烧录软件中见到。 #!/usr/bin/python3 # -*

  • 1. Component 创建自定义组件,接受一个 Object 类型的参数。 定义段 类型 是否必填 描述 最低版本 properties Object Map 否 组件的对外属性,是属性名到属性设置的映射表 data Object 否 组件的内部数据,和 properties 一同用于组件的模板渲染 observers Object 否 组件数据字段监听器,用于监听 properties 和

  • 1. 组件模板和样式 类似于页面,自定义组件拥有自己的 FXML 模板和 FTSS 样式。 1.1 组件模板 组件模板的写法与页面模板相同。组件模板与组件数据结合后生成的节点树,将被插入到组件的引用位置上。 在组件模板中可以提供一个 <slot> 节点,用于承载组件引用时提供的子节点。​ 代码示例 <!-- 组件模板 --> <view class="wrapper"> <view>这里是组件

  • 自定义组件 开发者可以将页面内的功能模块抽象成自定义组件,以便在不同的页面中重复使用;也可以将复杂的页面拆分成多个低耦合的模块,有助于代码维护。自定义组件在使用时与基础组件非常相似。 创建自定义组件 一个自定义组件由 json jxml jxss js 4个文件组成。要编写一个自定义组件,首先需要在 json 文件中进行自定义组件声明(将 component 字段设为 true 可这一组文件设为自

  • 元数据3.proto my_proto_file.proto 生成元数据3\u pb2。py并在protoc插件中使用它,如下所示, my\u proto\u file\u pb2。py公司 访问文件中定义的选项与生成代码中设置的选项相同 但从外部proto文件导入的选项似乎未设置,因此无法访问