TypedArray在Android应用程序中的使用

TypedArray在Android应用程序中的使用,android,Android,我在 HelloGallery示例 ImageAdapter.java- attrs.xml- attrs.html- ,但我几乎无法理解回收的作用是什么 归还以前检索到的文件 StyledAttributes,供以后重复使用 我可以知道他们为什么需要从XML中获取整数值吗?为什么不呢 仅代码mGalleryItemBackground=0; 而mTileSize=12 我认为这主要是为了演示从视图构造函数读取XML属性的技术,而不是为了满足绝对的需求。如果你想在其他地方重复使用你的自定义

我在

HelloGallery示例 ImageAdapter.java-


attrs.xml-


attrs.html-


,但我几乎无法理解
回收
的作用是什么 归还以前检索到的文件 StyledAttributes,供以后重复使用

  • 我可以知道他们为什么需要从XML中获取整数值吗?为什么不呢 仅代码mGalleryItemBackground=0; 而mTileSize=12 我认为这主要是为了演示从视图构造函数读取XML属性的技术,而不是为了满足绝对的需求。如果你想在其他地方重复使用你的自定义视图(我承认,对于像Snake这样的特定对象,这种可能性不大),那么这是一件非常有用的事情。。。在不接触Java代码的情况下更改背景颜色等

    特别是对于磁贴大小,如果不同的设备类型有不同的布局,那么从XML读取可能很有用。。。对于不同的密度+大小组合,您可能需要不同大小的瓷砖

  • 两者都试图读取一个整数。为什么其中一个示例使用 getResourceId技术,另一个是 使用getInt技术
  • 因为库背景不是整数。。。它应该是一个资源标识符(比如@drawable/foo)。是的,它仍然是一个整数,但是一个直到运行时才知道其值的整数。相比之下,平铺大小是一个常量,不需要任何类型的运行时解析

  • 我指的是Darray JavaDoc类型,但我几乎无法理解什么是回收 是吗
  • 如有疑问。这基本上是一种优化,以避免LayoutFlater必须为其膨胀的每个视图分配其中一个属性。

    关于可样式化属性 除了能够在不接触Java代码的情况下更改该值之外,它还允许他们根据设备配置对应用程序应用不同的样式。而不是用XML声明:

    <com.example.android.snake.SnakeView
        android:id="@+id/snake"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tileSize="24" />
    
    然后参考该样式:

    <com.example.android.snake.SnakeView
        android:id="@+id/snake"
        style="@styles/SnakeViewStyle" />
    
    
    
    在像这样分离样式之后,它们可以为每个设备配置提供不同的
    style.xml
    文件。例如,对于纵向模式可能有一个
    res/values/styles.xml
    ,对于横向模式可能有一个
    res/values land/styles.xml

    关于资源和整数 如果一个可设置样式的属性被声明为“reference”而不是“integer”,那么您将(1)在为该属性编写XML时获得IDE内容帮助,(2)编译器将检查您是否未提供对不存在的资源的引用。因此,要获得它,您需要使用
    getResourceId
    ,因为它可能会执行一些额外的解析来获得实际的资源id

    关于回收
    我不是很确定,但从Darray类型的代码来看,它似乎有一些缓存机制,而且
    recycle()
    使它工作起来。

    我还是不明白。我没有看到任何确切的值(如0和12)被显式地指定到XML文件本身中,我怎么可能在不接触Java代码的情况下更改某些内容。您好@Yan,您上面评论中的链接仅声明名为tileSize的属性可以存在,并且是整数类型的。名为tileSize的属性的实际声明(或“使用”或“实例”)位于布局XML(运行时用于创建UI的文件)中。这都是XML,但它们有着完全不同的用途。我在(运行时用于创建UI的文件)中没有看到tileSize。另外,您是否可以证明,在不涉及Java代码的情况下如何更改tileSize,因为在declare styleable中没有指定任何值,只是声明该属性可以在布局中使用,在特定的视图类型上(在本例中,这是“SnakeView”)。如果您没有在resources文件夹中的某个位置声明styleable,那么资源编译器在找到tileSize=“24”时会抛出“Unknown attribute”类型错误。Reuben是正确的:1)Java代码获取布局文件中设置的任何XML属性的值。2) 是attrs.xml文件定义了每个视图可以具有哪些可能的属性--您不能在长时间运行时只创建属性,必须先指定它们--我仍然无法获取它们。您给出的XML示例res/values/styles.XML与。没有在该文件中精确指定“12”值。如果我使用的是styles.xml,我应该如何初始化mTileSize?我不能再使用a.getInt(R.styleable.TileView_tileSize,12);程燕,这个文件:-不是
    styles.xml
    ,而是
    attrs.xml
    。它定义了自定义视图类可能具有的属性。在此特定情况下,
    TileView
    可能具有
    integer
    类型的属性
    tileSize
    。这意味着我们可以在布局XML文件或
    styles.XML
    fole中为该属性设置值。
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TileView);
    mTileSize = a.getInt(R.styleable.TileView_tileSize, 12);
    a.recycle();
    
    <resources>
      <declare-styleable name="TileView">
        <attr name="tileSize" format="integer" />
      </declare-styleable>
    </resources>
    
    <com.example.android.snake.SnakeView
        android:id="@+id/snake"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tileSize="24" />
    
    <style name="Control.SnakeViewStyle">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">match_parent</item>
        <item name="tileSize">24</item>
    </style>
    
    <com.example.android.snake.SnakeView
        android:id="@+id/snake"
        style="@styles/SnakeViewStyle" />