首页 > 其他分享 >android引用资源@与属性?备忘单

android引用资源@与属性?备忘单

时间:2023-05-01 14:31:57浏览次数:31  
标签:colorPrimary attr color 备忘 引用 background android 属性


几天前我偶然发现了我Android开发早期时制作的一份学习备忘单,是为理解如何处理Android资源和主题属性的语法而整理的。

令人意外的是,我发现它对现在的我非常有用,因此决定整理成更适合博客的形式并分享给大家。

知道我们今天要讨论的话题了,那么请看下面,通过xml布局设置一个view的background color的几种方法:

android:background="@color/colorPrimary"  
android:background="@com.myapp:color/colorPrimary"  
android:background="?colorPrimary"  
android:background="?attr/colorPrimary"  
android:background="?com.myapp:attr/colorPrimary"  
android:background="?com.myapp:colorPrimary"  
android:background="?android:colorPrimary"  
android:background="?android:attr/colorPrimary"



够刺激,是吧?好吧,我希望可以把它拆解一下,这样就可以不那么吓人了。



引用资源(resources) vs 引用样式属性(style attribute)


先打断一下话题讲一下Android的基础,因为在进一步解释之前,理解 @ 和 ? 之间的区别是很重要的。



当我们使用@ -我们是引用一个实际的值(color, string, dimension,等等)。这个资源必须有具体的值,这种情况下我们知道自己处理的具体值。



比如


app/src/main/res/values/color.xml 


<?xml version="1.0" encoding="utf-8"?>  
<resources>  
    <color name="colorPrimary">#3F51B5</color>
</resources>



因此当我们想在xml中引用它的时候(android:background="@color/colorPrimary"),不管这个activity是什么主题的,background都将被设置为#3F51B5 。



反之,当你看到? 标记-那就意味着我们在尝试引用一个style attribute ,其值取决于当前使用的主题。在特定的主题下我可以重写这个属性,因此不需要改变xml布局,只需应用恰当的主题就是了:



<resources>  
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">#F00</item>
    </style>
</resources>
<TextView  
    android:id="@+id/my_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="?colorPrimary"/>



在这种情况下,我们询问Android:“嘿,把当前主题下定义的colorPrimary属性的值给我”。所以我们很难告诉你background到底会是什么颜色,因为它取决于这个布局所属的activity应用的主题。



语法


现在,让我们来看看引用资源的语法到底是什么样的。



引用resources (@)



@[包名:]资源类型/资源名



包名 - 可选项,即这个资源所属的包的名称(默认就是你app的包名);预留的包-android,用于与系统一起发布的资源。



资源类型 - R的子集,即资源的类型(attr, color, string, dimen,等等)



资源名 - 我们要引用的资源的名称



让我们先举2个例子:


android:background="@color/colorPrimary"  
android:background="@com.myapp:color/colorPrimary"



这两个都是引用相同的资源,因为默认包名就是自己app的包名,所以可以不写出来:



package(可选) = com.myapp



资源类型 = color



资源名 = colorPrimary



你可能会想,安卓不是预先定义了一些系统级别的资源吗?是的,比如可以这样引用一些内置的颜色:



android:background="@android:color/holo_orange_dark"

这个例子拆解开来就是:



package = android - 引用内置的资源



资源类型 = color



资源名 = holo_orange_dark



请注意:



现在,许多开发者都使用AppCompat(如果你还没有,那么建议你这样做),而AppCompat通常定义了自己的资源。虽然AppCompat属于谷歌自己发布的lib,但是它并不是系统的一部分。实际上,那些资源整合到了你的app中,因此不需要使用android关键字来引用。



例子:



android:background="?selectableItemBackground"



这里,即使我们app中并没有自定义的属性名selectableItemBackground(注意这里没有使用 android: 前缀),我们仍然可以引用它,因为我们通过AppCompat把它“添加”到了我们的app中。



引用样式属性(?)



你猜怎么着,它的语法相当类似于引用resources:



?[包名:][资源类型/]资源名称



只是有点小区别:



引用样式属性的时候唯一允许的资源类型是attr。所以实际上Android打包工具允许我们省略资源类型,因此实际上它是一个可选项。



所以从Android的角度来看,下面的表述方式其实完全是一样的:



android:background="?com.myapp:attr/colorPrimary" //verbose format  
android:background="?com.myapp:colorPrimary" //attr is skipped since its optional  
android:background="?attr/colorPrimary" //package is skipped since its optional  
android:background="?colorPrimary"  // package & attr is skipped



就如你看到的那样,其实语法是超级简单的,再也不会困惑了!


标签:colorPrimary,attr,color,备忘,引用,background,android,属性
From: https://blog.51cto.com/u_5454003/6238909

相关文章

  • Android重力感应基础
    android中的很多游戏的游戏都使用了重力感应的技术,但其apidemo却并没有重力感应的实例(不知道是不是我没找到,找到的朋友麻烦告诉我一下,谢谢),因为开发的需要,就研究了一下重力感应这方面,因为网上关于这方面的东西比较少,所以写出来跟大家交流一下,算是抛砖引玉吧。(p......
  • 在Android中实现文件读写
    android实现下载文件/***从网上下载*@paramurl下载路径*@paramoutputFile创建本地保存流的文件*@return*@return下载失败返回1(比如没有网络等情况)下载成功返回0*/publicstaticintdownloadFile(Stri......
  • android DragLayer源码
    Android_launcher的源码详细分析/**Copyright(C)2008TheAndroidOpenSourceProject**LicensedundertheApacheLicense,Version2.0(the"License");*youmaynotusethisfileexceptincompliancewiththeLicense.*......
  • Android提高第十五篇之ListView自适应实现表格
    上次介绍了使用GridView实现表格,这次就说说如何用ListView实现自适应的表格。GridView比ListView更容易实现自适应的表格,但是GridView每个格单元的大小固定,而ListView实现的表格可以自定义每个格单元的大小,但因此实现自适应表格也会复杂些(格单元大小不一)。......
  • Android提高第八篇之SQLite分页读取
    Android包含了常用于嵌入式系统的SQLite,免去了开发者自己移植安装的功夫。SQLite支持多数SQL92标准,很多常用的SQL命令都能在SQLite上面使用,除此之外Android还提供了一系列自定义的方法去简化对SQLite数据库的操作。不过有跨平台需求的程序就建议使用标准的SQL语句,毕竟这样容易在......
  • Android提高第九篇之GridView和SQLite实现分页表格
    上次讲的Android上的SQLite分页读取,只用文本框显示数据而已,这次就讲得更加深入些,实现并封装一个SQL分页表格控件,不仅支持分页还是以表格的形式展示数据。先来看看本文程序运行的动画:这个SQL分页表格控件主要分为“表格区”和“分页栏”这两部分,这两部分都是基于GridView实现的。......
  • Android提高第四篇之Activity+Intent
          Android有三个基础组件Activity,Service和BroadcastReceiver,他们都是依赖Intent来启动。本文介绍的是Activity的生命周期以及针对Activity的Intent使用。       之前的例子一直都是使用Activity,在一个LayoutXML与一个Activity捆绑的情况下可以视为一个Form,......
  • Android提高第十八篇之自定义PopupWindow实现的Menu(TabMenu)
    用过UCWEB-Android版的人都应该对其特殊的menu有印象,把menu做成Tab-Menu(支持分页的Menu),可以容纳比Android传统的menu更丰富的内容(Android的menu超过6项则缩略在[更多]里),本文参考网上的例子(作者:CoffeeCole,email:[email protected]),对例子进行简化以及封装,使其作为一个复......
  • Android Activity界面切换添加动画特效
    在Android2.0之后有了overridePendingTransition(),其中里面两个参数,一个是前一个activity的退出两一个activity的进入。@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentVi......
  • android系统各种音量的获取与设置 以及监听音量变化
    获取系统音量通过程序获取android系统手机的铃声和音量。同样,设置铃声和音量的方法也很简单!设置音量的方法也很简单,AudioManager提供了方法:publicvoidsetStreamVolume(intstreamType,intindex,intflags)其中streamType有内置的常量,去文档里面就可以看到。JAVA代码:AudioManagermAud......