API( Application Programming Interface),它能够帮你实现轻松的和其他软件组件(如服务器,操作系统等)的交互。交互只能发生在中间的区域。在 API 术语里面,我们管中间的这块区域叫做接口 Interface ;在这里各个部分发生交互。
在 API 术语中,协议 是规定了各部分之间如何进行交流的一系列规则的集合。各部分之间想要完成交互必须理解并且遵守同一个协议。
在程序员的世界里,通用的格式包含 XML 和 JSON。
API 端点 通常是指在同一个接口中提供特定功能子集的服务提供者。在这种情况下,小冰和小娜都是端点。(小冰和小娜是同一个柜台不同功能的提供者)不同的端点可以有不同的协议和不同的格式。
总结起来:接口是不同组件进行交互的地方。协议是一系列规定了他们之间怎样进行交互的规则。格式定义了他们通过什么进行交流(JSON或者是XML),端点可以在同一个接口里面提供不同的功能。
API 是用于构建应用程序软件的一组子程序定义,协议和工具。一般来说,这是一套明确定义的各种软件组件之间的通信方法
https://blog.csdn.net/weixin_42067279/article/details/87987028API详解
按照功能不同,项目文件分布在不同文件夹里。
(1)Android 清单文件夹 app\manifests\
里面只有一个文件 AndroidManifest.xml,这里都是一些关于应用包的元数据 。
Application 内部有一个或多个==activity(活动)元素,所谓 activity,就是为用户执行的一项任务,一个 Android 应用程序可以有一个或多个活动。在这个应用程序,只有一个活动名为 MainActivity。另外还有intent-filter(意图过滤器)==元素,意图是指从活动转到其它活动,这个Manifest 所用的意图过滤器,其名为 *android.intent.action.MAIN*,它的 category(类别)是launcher(启动器),这个特殊的意图就是如果用户点击了菜单中的应用图标,这就是开始要运行的活动,这就像 C/C++中的 main 程序一样,这个意图过滤器定义了应用程序的进入点。
(2)代码文件夹 app\java\com.mycompany.helloworld\
这个文件夹是放代码文件的地方,目前只有文件 MainActivity
(3) 资源文件夹 app\res\
这个文件夹存放项目所需的各种资源,包括子文件夹:
1)图片文件夹 drawable
2)布局文件夹 layout
布局就是界面设计,Android 使用 XML 文件定义用户界面,用 XML 文件描述屏幕视觉元素的布局。
3)菜单文件夹 menu
文件夹下有一个文件 menu_main.xml
4)图片文件夹 mipmap
这个文件夹也是存放图片的,和 drawable 作用相同,但是用 mipmap 系统会在缩放上提供一定的性能优化。目前这里存放着启动图标,不同的图标适应不同的屏幕。
5)键值
包括颜色、适配不同屏幕、字符串、样式。我们重点学习 strings.xml.
HelloWorld
Settings
用 户 界 面 上 文 本 是 字 符 串 , 这 些 字 符 串 可 以 放 在 strings.xml 里 。如
HelloWorld
它的键是 app_name,值是 HelloWorld。试着把 HelloWorld 改为“你好,世界!”总要指定字符串,这个字符串资源文件可以管理所有的 UI 文本,使得开发人员容易地管理、更新文本,以及 app 多语言国际化。
https://blog.csdn.net/JourneyX/article/details/52970903activity和intent详解
Activity是Android四大组件之一主要用于与用户进行交互,在一个App中可能存在零个或多个Activity。Android的四大组件都必须要在清单文件中进行注册。
Acitivity的启动需要使用到Intent类,Intent不是Android四大组件之一,Intent,意图,主要用于Android三大组件之间的通讯,是三大组件的桥梁。
PS:这里的三大组件是Activity、Service、BroadcastReceiver
一个Android应用程序可以包含零或多个Activity,当应用程序具有多个Activity时,就可能需要从一个Activity跳转到另一个Activity。在Android中,Activity之间的导航是通过Intent(意图)来完成
Intent并不是Andorid应用的组件,但它是各组件之间通信的载体
Intent不仅仅可以用于同一个App内来传递“意图”,也可以跨App。
显示意图:需要明确指定需要启动的组件名称。
隐式意图:不需要明确指定需要启动的组件的名称,只需要给定启动的组件的相关信息。所谓的相关系,比如:打电话、上网、发邮件。
显示意图和隐式意图的区别
1、显示意图:必须指定要激活的组件的完整包名和类名
(应用程序之间耦合在一起,一般是在激活自己应用中的组件时使用显示意图。效率较高)
2、隐式意图:只需要指定执行的动作和数据就可以
(好处:应用程序之间没有耦合。一般在激活其他应用中的组件时使用隐式意图。缺点:效率较低)
意图过滤器:
通过intent传递数据
1、 Intent.setData(Uri) ——> intent.getData() :传递简单的文本数据,// 传递Uri对象(实际上就是一个字符串)
2、 putExtra(name ,value) ——> getXXXExtra() //传递额外数据
通过该方法可以传递以下数据类型:八种基本数据类型,数组,字符串,序列化对象
(在Android中有两个序列化接口:A)Serializable接口: JDK自带的接口,使用方式很简单,只需要让自定义类实现Serializable接口即可。b)Parcelable接口,Android SDK提供的接口)
相对于Serializable接口,序列化和反序列化的效率更高,是Android推荐使用的,但是序列化和反序列的部分操作需要程序员自己完成
Bundle对象,就是一个容器,操作和Map集合类似,是以键值对的方式存储
3、 putExtras(Bundle extras) ——> getExtras():可以传递一组数据(Map集合)
4、putXXXArrayListExtra 传递ArrayList对象
Intent intent = getIntent();
activity和intent
Action代表该Intent所要完成的一个抽象“动作”
一个Intent对象最多包含一个action
一个Activity可以定义多个action
Android本身提供了很多action供开发者使用
Action代表该Intent所要完成的一个抽象“动作”
一个Intent对象最多包含一个action
一个Activity可以定义多个action
Android本身提供了很多action供开发者使用
category
为Activity增加额外的附加类别信息
为Activity增加额外的附加类别信息
data
声明数据的类型(mimeType)、约束(scheme)、主机名(host)、端口(port)、路径(path)等
声明数据的类型(mimeType)、约束(scheme)、主机名(host)、端口(port)、路径(path)等
应用场景:开启别的应用程序中的界面,系统需要查询匹配的Activity,效率较低
任务(Task)
一个应用程序一般都是由多个Activity组成的,task就是多个 Activity的集合
后退栈(Back Stack)
就是一个保存和管理应用程序中所有Activity的容器用户在进行操作时将与task中的Activity进行交互,这些Activity会按照启动顺序排队存入后退栈
Android为什么要引入任务和后退栈的概念?
在Windows下可以同时开启多个程序,并且可以在多个程序之间进行切换,在Andorid下也可以开启多个程序,可以通过长摁home键来查看开启的App,要实现在多个Activity之间进行切换,那么就要将已经打开的Activity保存在内存中,而Android系统是通过后退栈来存储已经开启的Activity,并记录他们开启的先后顺序。
Android意图是一个要执行的操作的抽象描述。它可以通过 startActivity 来启动一个活动,broadcastIntent 来发送广播到任何对它感兴趣的广播接受器组件,startService(Intent) 或者bindService(Intent, ServiceConnection, int) 来与后台服务通讯。
意图本身(一个 Intent 对象)是一个被动的数据结构,保存着要执行操作的抽象描述。
例如,你有一个活动,需要打开邮件客户端并通过 Android 设备来发送邮件。为了这个目的,你的活动需要发送一个带有合适选择器的 ACTION_SEND 到 Android 意图处理者。指定的选择器给定合适的界面来让用户决定如何发送他的邮件数据。
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
email.putExtra(Intent.EXTRA_EMAIL, recipients);
email.putExtra(Intent.EXTRA_SUBJECT, subject.getText().toString());
email.putExtra(Intent.EXTRA_TEXT, body.getText().toString());
startActivity(Intent.createChooser(email, "Choose an email client from..."));
上面的语法调用 startActivity 方法来开启邮件活动。
例如,你有一个活动,需要在 Android 设备上通过浏览器打开一个URL。为了这个目的,你的活动发送 ACTION_WEB_SEARCH 意图到 Android 意图处理器来在浏览器中打开给定的 URL 。意图处理器通过解析一系列活动,并选择最适合你的意图的一个活动,在这个例子中,是 Web 浏览器活动。意图处理器传递你的网页地址到 Web 浏览器,并打开 Web 浏览器活动。
String q = "https://www.runoob.com";
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH );
intent.putExtra(SearchManager.QUERY, q);
startActivity(intent);
上面的例子将在Android搜索引擎上查找"www.runoob.com",并在一个活动上给出关键词的结果。
对于每一个组件-活动,服务,广播接收器都有独立的机制来传递意图。
序号 | 方法和描述 |
---|---|
1 | Context.startActivity():意图传递给该方法,用于启动一个新的活动或者让已存在的活动做一些新的事情。 |
2 | Context.startService():意图传递给该方法,将初始化一个服务,或者新的信息到一个持续存在的服务。 |
3 | Context.sendBroadcast():意图传递给该方法,信息将传递到所有对此感兴趣的广播接收器。 |
意图对象是一包的信息,用于组件接收到的意图就像 Android 系统接受到的信息。
意图对象包括如下的组件,具体取决于要通信或者执行什么。
动作(Action)
这是意图对象中必须的部分,被表现为一个字符串。在广播的意图中,动作一旦发生,将会被报告。动作将很大程度上决定意图的其他部分如何被组织。Intent 类定义了一系列动作常量对应不同的意图。这里是一份Android意图标准动作 列表。
意图对象中的动作可以通过 setAction() 方法来设置,通过 getAction() 方法来读取。
数据(Data)
添加数据规格到意图过滤器。这个规格可以只是一个数据类型(如元类型属性),一条 URI ,或者同时包括数据类型和 URI 。 URI 则由不同部分的属性来指定。
这些指定 URL 格式的属性是可选的,但是也相互独立 -
setData() 方法只能以 URI 来指定数据,setType() 只能以元类型指定数据,setDataAndType() 可以同时指定 URI 和元类型。URI 通过 getData() 读取,类型通过 getType() 读取。
以下是动作/数据组的一些实例 -
序号 | 动作/数据组和描述 |
---|---|
1 | ACTION_VIEW content://contacts/people/1:显示ID为1的用户的信息。 |
2 | ACTION_DIAL content://contacts/people/1:显示电话拨号器,并填充用户1的数据。 |
3 | ACTION_VIEW tel:123:显示电话拨号器,并填充给定的号码。 |
4 | ACTION_DIAL tel:123:显示电话拨号器,并填充给定的号码。 |
5 | ACTION_EDIT content://contacts/people/1:编辑ID为1的用户信息。 |
6 | ACTION_VIEW content://contacts/people/:显示用户列表,以便查看。 |
7 | ACTION_SET_WALLPAPER:显示选择壁纸设置。 |
8 | ACTION_SYNC:同步数据,默认的值为:android.intent.action.SYNC |
9 | ACTION_SYSTEM_TUTORIAL:开启平台定义的教程(默认教程或者启动教程) |
10 | ACTION_TIMEZONE_CHANGED:当时区被改变时通知 |
11 | ACTION_UNINSTALL_PACKAGE:运行默认的卸载器 |
类别
类别是意图中可选的部分,是一个字符串,包含该类型组件需要处理的意图的附加信息。addCategory() 方法为意图对象添加类别,removeCategory() 方法删除之前添加的类别,getCategories() 获取所有被设置到意图对象中的类别。这里是Android意图标准类别列表。
可以查看下面章节中的意图过滤器来了解我们如何使用类别来通过对应的意图选择合适的活动。
附加数据
这是传递给需要处理意图的组件的以键值对描述的附加信息。通过 putExtras() 方法设置,getExtras() 方法读取。这里是Android意图标准附加数据列表。
标记
这些标记是意图的可选部分,说明Android系统如何来启动活动,启动后如何处理等。
序号 | 标记和说明 |
---|---|
1 | FLAG_ACTIVITY_CLEAR_TASK :如果在意图中设置,并通过 Context.startActivity 传递,这个标记将导致与该活动相关联的所有已存在的任务在活动启动前被清空。活动将成为一个空任务的根,所有旧的活动被结束。该标记可以与 FLAG_ACTIVITY_NEW_TASK 结合使用。 |
2 | FLAG_ACTIVITY_CLEAR_TOP :如果设置该标记,活动将在当前运行的任务中被启动。这病不会启动一个新的活动实例,所有的在它之上的活动被关闭,这个意图作为一个新的意图被传递到已有的(目前在顶部的)活动。 |
3 | FLAG_ACTIVITY_NEW_TASK :这个标记一般用于使得活动用于"启动器"风格的行为:为用户提供一个可以独立完成运行的数据,并启动完整儿独立的活动。 |
组件名称
组件名称对象是一个可选的域,代表活动、服务或者广播接收器类。如果设置,则意图对象被传递到实现设计好的类的实例,否则,Android 使用其他意图中的其他信息来定位一个合适的目标。组件名称通过 setComponent(),setClass()或者 setClassName() 来设置,通过 getComponent() 获取。
Android 支持两种类型的意图。
显式意图
显式意图用于连接应用程序的内部世界,假设你需要连接一个活动到另外一个活动,我们可以通过显示意图,下图显示通过点击按钮连接第一个活动到第二个活动。
这些意图通过名称指定目标组件,一般用于应用程序内部信息 - 比如一个活动启动一个下属活动或者启动一个兄弟活动。举个例子:
// 通过指定类名的显式意图
Intent i = new Intent(FirstActivity.this, SecondAcitivity.class);
// 启动目标活动
startActivity(i);
隐式意图
这些意图没有为目标命名,组件名称的域为空。隐式意图经常用于激活其他应用程序的组件。举个例子:
Intent read1=new Intent();
read1.setAction(android.content.Intent.ACTION_VIEW);
read1.setData(ContactsContract.Contacts.CONTENT_URI);
startActivity(read1);
Android Studio 用 XML 文件描述界面 。content_main.xml 是 activity_main.xml 的一部分,activity_main.xml 定义了顶部和底部的母版,所以直接操作 content_main.xml即可。
Design 模式拖拽控件到界面上。
android:id="@+id/名称 ":识别 view 的唯一的 id,有了这个 id,在程序里可以用 id操作这个对象。定义 id 的格式为:@+id/名称,注意@+id/是固定的,反斜杠后的名称才是你自由取名字。引用 id 的格式为:R.java.资源名称。这种方式资源 ID 只声明一次,引用 ID 不需要加上+号。仅在指定新资源 ID 是才需要+号,诸如 string、布局等具体资源不需要+号。
android:layout_width 和android:layout_height:可以不用具体的数值,wrap_content 意思是能够包裹住它内容的,仅用于适应视图内容,表示宽度或高度上需要用多少就是多少。如果是match_parent,EditText 元素会充满屏幕,因为它将要适应父元素 LinearLayout 的大小。
**android:hint=“@string/名称”**是编辑框空的时候出现的默认字符串,也就是这个编辑框的提示文本,而文本属性值是@string/名称, 是因为引用具体资源(而不是标识符),不需要+号。这个字符串的具体值定义在另一个文件的字符串资源上。@string 表示该字符串定义在其它 XML 文件中,它在 values 目录下,名为 string.xml,打开它,其中有一个 string 元素,name 属性为 hello,内容是"Hello World,IntroActivity!"回头看 main 文件,该引用是说:要输入到屏幕的这个字段,实际数据在string.xml 文件中,实际显示的是这一段。
布局文件与 Activity关联
基类中的 onCreate 方法:super.onCreate(savedInstanceState); 每个 activity 都要进行一些必要的初始化,而这些初始化就是通过调用父类的构造函数来进行的。
调用方法 setContentView(R.layout.activity_display_message);,setContentView 就是说活动创建以后,这就是我需要渲染到屏幕上的视图,这个视图就是R.layout.activity_display_message,也就是就是在第一步我们编写 XML 布局文件描述 UI activity_display_message 文件 ,放置在 layout目录下 。setContentView(R.layout.activity_display_message)是在告诉机器,activity_display_message 中定义有布局 layout,这就是我要输出到屏幕的。
在 AndroidManifest.xml 里声明新建的activity。
调用
如何从活动转到另一个活动,当应用中包含一个或多个活动时,
什么能让我们从一个转到另一个,在 Android Studio 中,我们称之为 Intent(意图)。Intent 是
从一个活动传到另一个的异步信息,一般 Intent 包括两段数据,首先是动作,然后是该动作
所需数据。
Intent 有两个参数:
第一个是 Context 类型参数,使用 this 因为 Activity 类是 Context 的子类;
第二个是系统要传递的目标(这里是要启动的窗体)app 组件的类
findViewById()获取当前编辑框 EditText 对象
putExtra()把 message 作为附加数据加到 intent
调用 startActivity 方法,传递 Intent 对象
被调用
被调用的 activity 启动时要处理的工作在 onCreate()方法里实现。activity 收到带有 message 的Intent,然后处理它。onCreate()方法也必须用 setContentView()定义 activity 布局。
getIntent()获取传入的Intent 调用方
getStringExtra(“EXTRA_MESSAGE”)取得"EXTRA_MESSAGE"代表的值 message。
获取 xml 定义的 TextView,把 message 显示出来
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_message);
Intent intent=getIntent();
String message=intent.getStringExtra("EXTRA_MESSAGE");
TextView textView=(TextView)findViewById(R.id.textviewShow);
textView.setText(message);//设置文本为 message
}
相对布局的 XML 元素是
关系,这样可以保证在屏幕的局部范围内几个控件之间的关系不受外部影响。
android:layout_centerHrizontal 水平居中
android:layout_centerVertical 垂直居中
android:layout_centerInparent 相对于父元素完全居中
android:layout_alignParentBottom 贴紧父元素的下边缘
android:layout_alignParentLeft 贴紧父元素的左边缘
android:layout_alignParentRight 贴紧父元素的右边缘
android:layout_alignParentTop 贴紧父元素的上边缘
android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以
父元素做参照物
android:layout_below 在某元素的下方
android:layout_above 在某元素的的上方
android:layout_toLeftOf 在某元素的左边
android:layout_toRightOf 在某元素的右边
android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐
android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐
android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐
android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐
android:layout_marginBottom 离某元素底边缘的距离
android:layout_marginLeft 离某元素左边缘的距离
android:layout_marginRight 离某元素右边缘的距离
android:layout_marginTop 离某元素上边缘的距离
设计 FrameLayout 是为了显示单一项 view。通常,不建议使用 FrameLayout 显示多项
内容。因为它们的布局很难调节,不用 layout_gravity 属性的话,多项内容会重叠;使用
layout_gravity 的话,能设置不同的位置。
public void switchLayout(){
for (int i=0;i<persons.size();i++){
HashMap<String,Object> map=new HashMap< >();
map.put ("img",persons.get(i).getImgId());
map.put("name", persons.get(i).getName());
map.put("te1", persons. get(i).getTel());
lxrlist.add(map) ;
}
String[] from={"img", "name", "te1"};
int[] to={R.id.lxrimg, R.id.lxrname, R.id.lxrtel} ;
/* SimpleAdapter adapter=new SimpleAdapter( this,lxrlist,R.layout.person_layout,from,to);*/
SimpleAdapter adapter=new SimpleAdapter( getActivity(), lxrlist,R.layout.person_layout, from,to) ;
listView.setAdapter(adapter);
}
使用SimpleAdapter的格式
SimpleAdapter(Context context, List extends Map
一般使用这样使用的
SimpleAdapter adapter=new SimpleAdapter(this,lxrlist,R.layout.person_layout,from,to);
当是在Fragment中使用会报错,上下文context要使用getActivity()
线性布局里的控件以在 XML 出现的顺序出现在屏幕上。线性布局控制其中的控件或组件横向或纵向排列。在线性布局布局中,每一行或每一列只能放单独一个控件。线性布局不会换行。当控件排列到窗体边缘,后面的控件就被隐藏,而不会显示出来。
线性布局里的控件是从左到右水平排列,还是从上至下竖直排列是由属性android:orientation 决定的,当它值为"horizontal"时控件是在水平一直排列,不会转到下一行;当它值为"vertical"时控件至上而下排列。
线性布局的默认方向是水平方向(Horizontal)。
LinearLayout的常用属性
可选项:vertical 、 horizontal
可选项:fill_parent / match_parent/ wrap_content/绝对数值
备注:fill_parent / match_parent的效果完全一致,都是填充整个父控件。但是自2.2版本开始推荐使用match_parent 。wrap_content指的是该控件的宽度正好包裹内容物。
可选项:fill_parent / match_parent/ wrap_content/绝对数值
备注:fill_parent / match_parent的效果完全一致,都是高度填充整个父控件。wrap_content指的是该控件的高度正好包裹内容物。
设置id的格式为:android:id = “@+id/id的名字”
例如:android:background=“#ffffff”
android:background=“@drawable/图片名称”
【备注:】
颜色有RGB颜色格式和ARGB格式。RGB是红绿蓝三原色。而ARGB是带alpha的三原色,即有透明度的三原色。
#FFFFFF 代表白色
#000000 黑色
#FFFFFFFF 完全不透明
#00FFFFFF 完全透明
#88FFFFFF 半透明
备注:如果是水平方向设置权重,要将android:layout_width设置为0dp,如果是垂直方向上使用权重,要将android:layout_height设置为0dp。否则权重容易受到高度或宽度的干扰而出现偏差。
如果该属性是定义在布局节点中,则该布局中所有控件的位置都受到这个属性的控制。
如果该属性出现在Button、TextView、EditText等控件中,则用来控制这些控件上的文字的位置。
可选项有:top、bottom、left、right、center_vertical、fill_vertical 、 center、fill等等。
【备注:】本属性与android:layout_gravity不同。
可选项有:top、bottom、left、right、center_vertical、center_horizontal 、fill_vertical 、 center、fill等等。
这些可选项中不是适用于每一种布局。在垂直线性布局中,android:gravity为bottom不起作用;而水平线性布局中,android:gravity为right不起作用。
LinearLayout的特有属性:【重新归纳:去除公共属性后的特有属性】
android:orientation 布局管理器内组件的排列方式
android:gravity 设置布局管理器内组件的对齐方式
android:weightSum
LinearLayout 子元素的特有属性:
android:layout_weight 子元素在 LinearLayout 中所占的权重
android:layout_gravity 子元素在 LinearLayout 中的对齐方式
这种布局和 Office 里的制作表格类似,把布局看作一个表格,控件放置在每个单元格里。
表格行的最大行高与该行最高控件匹配;表格最宽的列与该列最宽控件匹配。
网格布局虽然和表格布局类似,但比表格更灵活。网格布局子控件放置在
典型应用:计算器
alignBounds – 对齐子视图边界。
alignMargins – 对齐子视图边距。
android:columnCount GridLayout的最大列数
android:rowCount GridLayout的最大行数
android:orientation GridLayout中子元素的布局方向。有以下取值:
horizontal – 水平布局。
vertical – 竖直布局。
android:columnOrderPreserved 设置该网格布局是否保留列序号。默认是true。
android:rowOrderPreserved 设置该网格布局是否保留行序号。默认是true。
android:useDefaultMargins 设置GridLayout使用默认的边距。默认值是false。
GridLayout子元素的属性:
android:layout_column 显示该控件的列。例如,android:layout_column=“0”,表示在第1列显示该控件;android:layout_column=“1”,表示在第2列显示该控件。
android:layout_row 该控件所在行。例如,android:layout_row=“0”,表示在第1行显示该控件;android:layout_row=“1”,表示在第2行显示该控件。它和 android:layout_column类似。
android:layout_columnSpan 列合并。即该控件所占的列数。例如,android:layout_columnSpan=“2”,表示该控件占2列。
android:layout_rowSpan 行合并。即该控件所占的行数。例如,android:layout_rowSpan=“2”,表示该控件占2行。
android:layout_gravity 该控件的布局方式。选项值:
采用绝对坐标进行布局定位,官方已经逐步弃用。
控件名称:【标红色的为常用的】
用于显示信息,不能输入,但可以在程序中动态修改显示信息。
TextView 常用属性:
andorid:text 设置文本的内容
android:textColor 设置文本的颜色
android:textSize 设置文本的字体大小(sp)
andorid:height 设置文本的高度,以像素为单位
android:width 设置文本的宽度,以像素为单位
android:inputType 设置文本的类型。例如是普通文本,还是email,password,数字等。
android:singleLine 设置文本是否是单行显示。
android:gravity 设置文本框内文本的对齐方式。可选项有:top、bottom、left、right、center、fill、center_vertical、center_horizontal、fill_horizontal等等。这些属性值也可以同时指定,各属性值之间用竖线隔开。例如right|bottom
android:drawableLeft 用于在文本框左侧绘制图片。该属性值通过“@drawable/图片文件名”来设置。
android:drawableRight 用于在文本框左侧绘制图片。该属性值通过“@drawable/图片文件名”来设置。
android:drawableTop 用于在文本框左侧绘制图片。该属性值通过“@drawable/图片文件名”来设置。
android:drawableBottom 用于在文本框左侧绘制图片。该属性值通过“@drawable/图片文件名”来设置。
android:autoLink 给指定的文本增加可单击的超链接。可选项为:none、web、email、phone、map和all。多个选项之间使用“|”分隔,也可以使用all。
android:hint 设置当文本框内文本内容为空时,默认显示的提示性文字。
android:textAllCaps=“true” 设置所有字母都大小
android:ellipsize=“end” 文字过长,设置省略号。可选项:start , end ,middle,marquee
android:ellipsize=“start” 省略号在开头
android:ellipsize=“middle” 省略号在中间
android:ellipsize=“end” 省略号在结尾
android:ellipsize=“marquee” 跑马灯显示
【备注:】要实现跑马灯效果。要同时具有以下属性。
EditText 继承了TextView的所有属性。
android:inputType的可选项:
android:inputType="textPersonName"
android:inputType="textPassword"
android:inputType="numberPassword" 只可以输入数字
android:inputType="textEmailAddress"
android:inputType="phone" 只允许输入数字,括号等特殊符号,不可以输入字母。
android:inputType="textPostalAddress"
android:inputType="time"
android:inputType="date"
android:inputType="number"
Button继承了TextView的所有属性。
dpi dpi指像素密度。dots per inch ,即每英寸内像素点的个数。它不是表示长度的单位。
在android中认为:低(120dpi),中(160dpi),高(240dpi),超高(320dpi)。随着技术的增长,实际dpi已经超出这个定义。
dip dimension independent pixels ,即与设备无关的像素。目前这个单位已经被dp所取代,而不建议使用dip。
dp 与dip的概念一样。不过dp已经取代了dip。在Android中用来表示非文字大小的尺寸。例如:外边距、内填充等。
px = dp * (dpi / 160)
3.7寸屏幕,分辨率320*480手机上,正好1px = 1dp。
sp scale independent pixel ,即与缩放比例无关的像素。在android中常用来表示文字大小。
px 表示像素。因为同样是200px,但是在不同手机下显示的大小是不同的。
pt point磅。1磅=1/74英寸
xlarge 屏幕至少:960dp x 720dp
large 屏幕至少 :640dp x 480dp
normal 屏幕至少 :480dp x 320dp
small 屏幕至少 :426dp x 320dp
总之:dp是用来定义非文字的尺寸,sp用来定义文字大小。px只用于产生一条一像素的分割线时使用。
多选一的选择模式。因为一组 RadioButton 的选择是单选,任何时候只能是一个被选中。
只有把这一组 RadioButton 放在一个 RadioGroup 里,它们之间才是互斥的。RadioGruop 是
RadioButton 的容器,不仅让它们互斥选择,其 android:orientation 属性还能让它们排列
是水平还是竖直。
参数 view 代表触发这个事件方法的 RadioButton,**int id=view.getId();**取得这个
RadioButton 的 id 的整数值,用分支语句 switch 判断这个 id 与哪个 RadioButton 的 id 相符,然后用 Toast 弹出短暂的窗口提示
提供几个选项给用户勾选。因为 CheckBox 不是互斥选择,所以放在 LinearLayout 里排
列好布局就可以了
它可以把 drawable 下的图片资源显示出来,首先把示例项目下为您准备好的 9 个图片
拷贝到你的 drawable 文件夹下。新建名为活动 ImagesActivity,修改布局文件.
新建一个 DateTimeActivity,会自动生成布局文件activity_date_time和 content_date_time,
在 content_date_time 的 Design 模式,从视图工具箱的 Date&Time 下拖拽 DatePicker 和
TimePicker 到 content_date_time
Spinner 提供一种下拉列表选择的输入方式,这种方式在手机应用上很常见,软件开发
的一个“潜规则”是能让用户选择的时候不让用户填写,因为下拉列表选择的数据规范,而用
户填写的内容可能千奇百怪,需要在程序中处理,否则会导致程序崩溃。
https://blog.csdn.net/weixin_44758662/article/details/107383396?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-9.add_param_isCf&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-9.add_param_isCf 详例1
https://blog.csdn.net/pu2810280557/article/details/100115842?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf详例2
AutoCompleteTextView用于输入一定字符后显示下拉列表框,供用户进行选择
XML属性 | 功能 |
---|---|
android:completionHint | 设置文本框中的提示信息 |
android:dropDownHeight | 设置提示框的高度单位dp |
android:dropDownWidth | 设置提示框的宽度单位dp |
android:popuPBackground | 为提示框设置背景 |
android:completionThreshold | 设置输入几个字符串才会显示提示信息 |
其他 | 其他属性不常用,使用默认设置的就好 |
ProgressBar就是我们常用的进度条
XML属性 | 功能 |
---|---|
可用 style | 设置进度条样式 |
android:max | 设置进度条最大值 |
android:progress | 设置进度条当前进度 |
android:progressDrawable | 设置进度条轨道的绘制形式 |
style
XML属性 | 功能 |
---|---|
?android:attr/progressBarStyleHorizontal | 细长条进度条 |
?android:attr/progressBarStyleLarge | 大圆形进度条 |
?android:attr/progressBarStyleSmall | 小圆形进度条 |
@android:style/Widget.ProgressBar.Horizontal | 粗长条进度条 |
@android:style/Widget.ProgressBar.Large | 大跳跃旋转的进度条 |
@android:style/Widget.ProgressBar.Small | 大跳跃旋转的进度条 |
SeekBar是拖动条,用户可以进行拖动,用来改变某种数值
为其设置监听后并重写方法
RatingBar是星状的评分条,如淘宝的评价等
XML属性 | 功能 |
---|---|
android:rating | 设置默认选择的星星数 |
android:numStars | 设置评分条总星数 |
android:stepSize | 设置评分条最少改变的星星数 |
android:isIndicator | 设置评分条是否能改变,true为不能 |
GridView中的数据通过适配器Adapter来连接存取,常用的Adapter有四种:
使用SimpleAdapter适配器制作相册总览页面:
GridView gridView = findViewById(R.id.gridView);
//建立一个存储Map类型数据的List列表用于存储数据供下面的simpleAdapter适配器作为参数调用
List<Map<String,Object>> listItem = new ArrayList<Map<String,Object>>();
//picture为图片资源id数组,将picture中的每一个图片资源id以image为键值key放入map中,然后加入list数组里
for(int i=0;i<picture.length;i++){
Map<String,Object> map = new HashMap<String,Object>();
map.put("image",picture[i]);
listItem.add(map);
}
//关于simpleAdapter的构造参数看这个:
//https://blog.csdn.net/perfect2011/article/details/6925283
SimpleAdapter simpleAdapter = new SimpleAdapter(this,listItem,R.layout.cell,new String[]{"image"},new int[]{R.id.imageView_cell});
gridView.setAdapter(simpleAdapter);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oG5soaJV-1688052978114)(C:\Users\user\Desktop\Android_study.assets\1.webp)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U1fS3ZVH-1688052978115)(C:\Users\user\Desktop\Android_study.assets\2.webp)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bUVBlEM9-1688052978115)(C:\Users\user\Desktop\Android_study.assets\3.webp)]
match_parent
设置一个构件的布局为match_parent将强制性地使构件扩展,以填充布局单元内尽可能多的空间。这跟Windows控件的dockstyle属性大体一致。设置一个顶部布局或控件为match_parent将强制性让它布满整个屏幕。
match—->使等同于,parent—->父母,所以,可以从单词上去理解,它就是强制性的使它的大小等同于父控件,父控件多大,他就多大。
wrap_content
设置一个视图的尺寸为wrap_content将强制性地使视图扩展以显示全部内容。以TextView和ImageView控件为例,设置为wrap_content将完整显示其内部的文本和图像。布局元素将根据内容更改大小。设置一个视图的尺寸为wrap_content大体等同于设置Windows控件的Autosize属性为True。
wrap—->包(着),content—->内容,单词意思上去理解,这个属性就是让这个属性包着内容,转译过来,就是使这个属性和内容的大小刚好。
layout_width(layout_height)在match_parent、wrap_content、0dp时的不同情况
当按水平排放时,
若几个控件的android:layout_width=“wrap_content”,会先分配各个控件内部必须要占用的空间,其他剩余空间按该值得大小比例分配。
若几个控件的android:layout_width=“fill_parent” 会根据该值得比例反比去显示大小。
若android:layout_width="0dip"会按该值得大小比例分配。
竖直时亦然。
Drawable分为两种: 一种是普通的图片资源,在Android Studio中我们一般放到res/mipmap目录下, 直接往mipmap目录下丢图片,AS会自动分hdpi,xhdpi…; 另一种是编写的XML形式的Drawable资源,我们一般把他们放到res/drawable目录 下,比如最常见的按钮点击背景切换的Selctor。
在XML我们直接通过@mipmap或者@drawable设置Drawable。 例: android:background = "@mipmap/iv_icon_zhu" / "@drawable/btn_back_selctor"
, 而在Java代码中我们可以通过Resource的getDrawable(R.mipmap.xxx)可以获得drawable资源 如果是为某个控件设置背景,比如ImageView,我们可以直接调用控件.getDrawale()同样 可以获得drawable对象!
Android中drawable中的资源名称有约束,必须是:[a-z0-9_.](即:只能是字母数字及和.), 而且不能以数字开头,否则编译会报错: Invalid file name: must contain only [a-z0-9.]。
最简单的一种Drawable,当我们将ColorDrawable绘制到Canvas(画布)上的时候, 会使用一种固定的颜色来填充Paint,然后在画布上绘制出一片单色区域!
ColorDrawable drawable = new ColorDrawable(0xffff2200);
txtShow.setBackground(drawable);
<color
xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#FF0000"/>
当然上面这些用法,其实用得不多,更多的时候我们是在res/values目录下创建一个color.xml 文件,然后把要用到的颜色值写到里面,需要的时候通过@color获得相应的值,比如:
比如:
<resources>
<color name="material_grey_100">#fff5f5f5color>
<color name="material_grey_300">#ffe0e0e0color>
<color name="material_grey_50">#fffafafacolor>
<color name="material_grey_600">#ff757575color>
<color name="material_grey_800">#ff424242color>
<color name="material_grey_850">#ff303030color>
<color name="material_grey_900">#ff212121color>
resources>
然后如果是在xml文件中话我们可以通过@color/xxx获得对应的color值 如果是在Java中:
int mycolor = getResources().getColor(R.color.mycolor);
btn.setBackgroundColor(mycolor);
ps:另外有一点要注意,如果我们在Java中直接定义颜色值的话,要加上0x,而且不能把透明度漏掉:
int mycolor = 0xff123456;
btn.setBackgroundColor(mycolor);
比如:BLACK(黑色),BLUE(蓝色),CYAN(青色),GRAY(灰色),GREEN(绿色),RED(红色),WRITE(白色),YELLOW(黄色). 用法:
btn.setBackgroundColor(Color.BLUE);
也可以获得系统颜色再设置:
int getcolor = Resources.getSystem().getColor(android.R.color.holo_green_light);
btn.setBackgroundColor(getcolor);
xml中使用:
android:background="@android:color/black"
Android使用一个int类型的数据表示颜色值,通常是十六进制,即0x开头, 颜色值的定义是由透明度alpha和RGB(红绿蓝)三原色来定义的,以"#"开始,后面依次为: 透明度-红-绿-蓝;eg:#RGB #ARGB #RRGGBB #AARRGGBB
每个要素都由一个字节(8 bit)来表示,所以取值范围为0~255,在xml中设置颜色可以忽略透明度, 但是如果你是在Java代码中的话就需要明确指出透明度的值了,省略的话表示完全透明,这个时候 就没有效果了哦~比如:0xFF0000虽然表示红色,但是如果直接这样写,什么的没有,而应该这样写: 0xFFFF0000,记Java代码设置颜色值,需要在前面添加上透明度~ 示例:(参数依次为:透明度,红色值,绿色值,蓝色值) txtShow.setBackgroundColor(Color.argb(0xff, 0x00, 0x00, 0x00));
xml定义NinePatchDrawable:
<nine-patch
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/dule_pic"
android:dither="true"/>
使用Bitmap包装.9图片:
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/dule_pic"
android:dither="true"/>
形状的Drawable,定义基本的几何图形,如(矩形,圆形,线条等),根元素是
<shape>:
<size>:
<solid>
<stroke>
<conner>
<padding>
一个具有渐变区域的Drawable,可以实现线性渐变,发散渐变和平铺渐变效果 核心节点:<gradient/>,有如下可选属性:
应用程序组件是一个Android应用程序的基本构建块。这些组件由应用清单文件松耦合的组织。AndroidManifest.xml描述了应用程序的每个组件,以及他们如何交互。
以下是可以在Android应用程序中使用的四个主要组件。
组件 | 描述 |
---|---|
Activities | 描述UI,并且处理用户与机器屏幕的交互。 |
Services | 处理与应用程序关联的后台操作。 |
Broadcast Receivers | 处理Android操作系统和应用程序之间的通信。 |
Content Providers | 处理数据和数据库管理方面的问题。 |
一个活动标识一个具有用户界面的单一屏幕。举个例子,一个邮件应用程序可以包含一个活动用于显示新邮件列表,另一个活动用来编写邮件,再一个活动来阅读邮件。当应用程序拥有多于一个活动,其中的一个会被标记为当应用程序启动的时候显示。
一个活动是Activity类的一个子类,如下所示:
public class MainActivity extends Activity {
}
服务是运行在后台,执行长时间操作的组件。举个例子,服务可以是用户在使用不同的程序时在后台播放音乐,或者在活动中通过网络获取数据但不阻塞用户交互。
一个服务是Service类的子类,如下所示:
public class MyService extends Service {
}
广播接收器简单地响应从其他应用程序或者系统发来的广播消息。举个例子,应用程序可以发起广播来让其他应用程序知道一些数据已经被下载到设备,并且可以供他们使用。因此广播接收器会拦截这些通信并采取适当的行动。
广播接收器是BroadcastReceiver类的一个子类,每个消息以Intent对象的形式来广播。
public class MyReceiver extends BroadcastReceiver {
}
内容提供者组件通过请求从一个应用程序到另一个应用程序提供数据。这些请求由ContentResolver类的方法来处理。这些数据可以是存储在文件系统、数据库或者其他其他地方。
内容提供者是ContentProvider类的子类,并实现一套标准的API,以便其他应用程序来执行事务。
public class MyContentProvider extends ContentProvider {
}
我们将在独立的章节中通过这些标签的细节来涵盖应用程序组件。
有一些附件的组件用于以上提到的实体、他们之间逻辑、及他们之间连线的构造。这些组件如下:
组件 | 描述 |
---|---|
Fragments | 代表活动中的一个行为或者一部分用户界面。 |
Views | 绘制在屏幕上的UI元素,包括按钮,列表等。 |
Layouts | 控制屏幕格式,展示视图外观的View的继承。 |
Intents | 组件间的消息连线。 |
Resources | 外部元素,例如字符串资源、常量资源及图片资源等。 |
Manifest | 应用程序的配置文件。 |
活动代表了一个具有用户界面的单一屏幕,如 Java 的窗口或者帧。Android 的活动是 ContextThemeWrapper 类的子类。
如果你曾经用 C,C++ 或者 Java 语言编程,你应该知道这些程序从 main() 函数开始。很类似的,Android 系统初始化它的程序是通过活动中的 onCreate() 回调的调用开始的。存在有一序列的回调方法来启动一个活动,同时有一序列的方法来关闭活动,如下面的活动声明周期图所示:
Activity 类定义了下面的回调。你可以不用实现所有的回调方法。但了解其中的每一个非常的重要,实现这些可以保证你的应用行为如用户所期望的那样。
回调 | 描述 |
---|---|
onCreate() | 这是第一个回调,在活动第一次创建时调用 |
onStart() | 这个回调在活动为用户可见时被调用 |
onResume() | 这个回调在应用程序与用户开始可交互的时候调用 |
onPause() | 被暂停的活动无法接受用户输入,不能执行任何代码。当前活动将要被暂停,上一个活动将要被恢复时调用 |
onStop() | 当活动不在可见时调用 |
onDestroy() | 当活动被系统销毁之前调用 |
onRestart() | 当活动被停止以后重新打开时调用 |
package com.example.helloworld;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
public class MainActivity extends Activity {
String msg = "Android : ";
/** 当活动第一次被创建时调用 */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(msg, "The onCreate() event");
}
/** 当活动即将可见时调用 */
@Override
protected void onStart() {
super.onStart();
Log.d(msg, "The onStart() event");
}
/** 当活动可见时调用 */
@Override
protected void onResume() {
super.onResume();
Log.d(msg, "The onResume() event");
}
/** 当其他活动获得焦点时调用 */
@Override
protected void onPause() {
super.onPause();
Log.d(msg, "The onPause() event");
}
/** 当活动不再可见时调用 */
@Override
protected void onStop() {
super.onStop();
Log.d(msg, "The onStop() event");
}
/** 当活动将被销毁时调用 */
@Override
public void onDestroy() {
super.onDestroy();
Log.d(msg, "The onDestroy() event");
}
}
服务是一个后台运行的组件,执行长时间运行且不需要用户交互的任务。即使应用被销毁也依然可以工作。服务基本上包含两种状态 -
状态 | 描述 |
---|---|
Started | Android的应用程序组件,如活动,通过startService()启动了服务,则服务是Started状态。一旦启动,服务可以在后台无限期运行,即使启动它的组件已经被销毁。 |
Bound | 当Android的应用程序组件通过bindService()绑定了服务,则服务是Bound状态。Bound状态的服务提供了一个客户服务器接口来允许组件与服务进行交互,如发送请求,获取结果,甚至通过IPC来进行跨进程通信。 |
服务拥有生命周期方法,可以实现监控服务状态的变化,可以在合适的阶段执行工作。下面的左图展示了当服务通过startService()被创建时的生命周期,右图则显示了当服务通过bindService()被创建时的生命周期:
要创建服务,你需要创建一个继承自Service基类或者它的已知子类的Java类。Service基类定义了不同的回调方法和多数重要方法。你不需要实现所有的回调方法。虽然如此,理解所有的方法还是非常重要的。实现这些回调能确保你的应用以用户期望的方式实现。
回调 | 描述 |
---|---|
onStartCommand() | 其他组件(如活动)通过调用startService()来请求启动服务时,系统调用该方法。如果你实现该方法,你有责任在工作完成时通过stopSelf()或者stopService()方法来停止服务。 |
onBind | 当其他组件想要通过bindService()来绑定服务时,系统调用该方法。如果你实现该方法,你需要返回IBinder对象来提供一个接口,以便客户来与服务通信。你必须实现该方法,如果你不允许绑定,则直接返回null。 |
onUnbind() | 当客户中断所有服务发布的特殊接口时,系统调用该方法。 |
onRebind() | 当新的客户端与服务连接,且此前它已经通过onUnbind(Intent)通知断开连接时,系统调用该方法。 |
onCreate() | 当服务通过onStartCommand()和onBind()被第一次创建的时候,系统调用该方法。该调用要求执行一次性安装。 |
onDestroy() | 当服务不再有用或者被销毁时,系统调用该方法。你的服务需要实现该方法来清理任何资源,如线程,已注册的监听器,接收器等。 |
下面的主服务演示了每个方法的生命周期 -
package com.runoob.androidservices;
import android.app.Service;
import android.os.IBinder;
import android.content.Intent;
import android.os.Bundle;
public class HelloService extends Service {
/** 标识服务如果被杀死之后的行为 */
int mStartMode;
/** 绑定的客户端接口 */
IBinder mBinder;
/** 标识是否可以使用onRebind */
boolean mAllowRebind;
/** 当服务被创建时调用. */
@Override
public void onCreate() {
}
/** 调用startService()启动服务时回调 */
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return mStartMode;
}
/** 通过bindService()绑定到服务的客户端 */
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
/** 通过unbindService()解除所有客户端绑定时调用 */
@Override
public boolean onUnbind(Intent intent) {
return mAllowRebind;
}
/** 通过bindService()将客户端绑定到服务时调用*/
@Override
public void onRebind(Intent intent) {
}
/** 服务不再有用且将要被销毁时调用 */
@Override
public void onDestroy() {
}
}
广播接收器用于响应来自其他应用程序或者系统的广播消息。这些消息有时被称为事件或者意图。例如,应用程序可以初始化广播来让其他的应用程序知道一些数据已经被下载到设备,并可以为他们所用。这样广播接收器可以定义适当的动作来拦截这些通信。
有以下两个重要的步骤来使系统的广播意图配合广播接收器工作。
还有一个附加的步骤,要实现自定义的意图,你必须创建并广播这些意图。
广播接收器需要实现为BroadcastReceiver类的子类,并重写onReceive()方法来接收以Intent对象为参数的消息。
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
}
}
应用程序通过在AndroidManifest.xml中注册广播接收器来监听制定的广播意图。假设我们将要注册MyReceiver来监听系统产生的ACTION_BOOT_COMPLETED事件。该事件由Android系统的启动进程完成时发出。
现在,无论什么时候Android设备被启动,都将被广播接收器MyReceiver所拦截,并且在onReceive()中实现的逻辑将被执行。
有许多系统产生的事件被定义为类Intent中的静态常量值。下面的表格列举了重要的系统事件。
事件常量 | 描述 |
---|---|
android.intent.action.BATTERY_CHANGED | 持久的广播,包含电池的充电状态,级别和其他信息。 |
android.intent.action.BATTERY_LOW | 标识设备的低电量条件。 |
android.intent.action.BATTERY_OKAY | 标识电池在电量低之后,现在已经好了。 |
android.intent.action.BOOT_COMPLETED | 在系统完成启动后广播一次。 |
android.intent.action.BUG_REPORT | 显示报告bug的活动。 |
android.intent.action.CALL | 执行呼叫数据指定的某人。 |
android.intent.action.CALL_BUTTON | 用户点击"呼叫"按钮打开拨号器或者其他拨号的合适界面。 |
android.intent.action.DATE_CHANGED | 日期发生改变。 |
android.intent.action.REBOOT | 设备重启。 |
如果你想要应用程序中生成并发送自定义意图,你需要在活动类中通过sendBroadcast()来创建并发送这些意图。如果你使用sendStickyBroadcast(Intent)方法,则意图是持久的(sticky),这意味者你发出的意图在广播完成后一直保持着。
public void broadcastIntent(View view)
{
Intent intent = new Intent();
intent.setAction("com.runoob.CUSTOM_INTENT");
sendBroadcast(intent);
}
com.runoob.CUSTOM_INTENT的意图可以像之前我们注册系统产生的意图一样被注册。
内容提供者组件通过请求从一个应用程序向其他的应用程序提供数据。这些请求由类 ContentResolver 的方法来处理。内容提供者可以使用不同的方式来存储数据。数据可以被存放在数据库,文件,甚至是网络。
有时候需要在应用程序之间共享数据。这时内容提供者变得非常有用。
内容提供者可以让内容集中,必要时可以有多个不同的应用程序来访问。内容提供者的行为和数据库很像。你可以查询,编辑它的内容,使用 insert(), update(), delete() 和 query() 来添加或者删除内容。多数情况下数据被存储在 SQLite 数据库。
内容提供者被实现为类 ContentProvider 类的子类。需要实现一系列标准的 API,以便其他的应用程序来执行事务。
public class MyApplication extends ContentProvider {
}
要查询内容提供者,你需要以如下格式的URI的形式来指定查询字符串:
:////
以下是URI中各部分的具体说明:
部分 | 说明 |
---|---|
prefix | 前缀:一直被设置为content:// |
authority | 授权:指定内容提供者的名称,例如联系人,浏览器等。第三方的内容提供者可以是全名,如:cn.programmer.statusprovider |
data_type | 数据类型:这个表明这个特殊的内容提供者中的数据的类型。例如:你要通过内容提供者Contacts来获取所有的通讯录,数据路径是people,那么URI将是下面这样:content://contacts/people |
id | 这个指定特定的请求记录。例如:你在内容提供者Contacts中查找联系人的ID号为5,那么URI看起来是这样:content://contacts/people/5 |
这里描述创建自己的内容提供者的简单步骤。
以下是让你的内容提供者正常工作,你需要在类 ContentProvider 中重写的一些方法:
一个优秀的 Android 应用程序由许多东西用来构建。除了应用程序的编码,还有各种各样的资源,诸如各种静态内容,如位图,颜色,布局定义,用户界面字符串,动画等等。
这些资源一般放置在项目的 res/ 下独立子目录中。
每种资源需要放置在项目中 res/ 目录的特定子目录下。
res/ 目录在各种子目录中包含了所有的资源。下表详细的给出了在项目中 res/ 目录里面支持的资源。
目录 | 资源类型 |
---|---|
anim/ | 定义动画属性的XML文件。它们被保存在res/anim/文件夹下,通过R.anim类访问 |
color/ | 定义颜色状态列表的XML文件。它们被保存在res/color/文件夹下,通过R.color类访问 |
drawable/ | 图片文件,如.png,.jpg,.gif或者XML文件,被编译为位图、状态列表、形状、动画图片。它们被保存在res/drawable/文件夹下,通过R.drawable类访问 |
layout/ | 定义用户界面布局的XML文件。它们被保存在res/layout/文件夹下,通过R.layout类访问 |
menu/ | 定义应用程序菜单的XML文件,如选项菜单,上下文菜单,子菜单等。它们被保存在res/menu/文件夹下,通过R.menu类访问 |
raw/ | 任意的文件以它们的原始形式保存。需要根据名为R.raw.filename的资源ID,通过调用Resource.openRawResource()来打开raw文件 |
values/ | 包含简单值(如字符串,整数,颜色等)的XML文件。这里有一些文件夹下的资源命名规范。arrays.xml代表数组资源,通过R.array类访问;integers.xml代表整数资源,通过R.integer类访问;bools.xml代表布尔值资源,通过R.bool类访问;colors.xml代表颜色资源,通过R.color类访问;dimens.xml代表维度值,通过R.dimen类访问;strings.xml代表字符串资源,通过R.string类访问;styles.xml代表样式资源,通过R.style类访问 |
xml/ | 可以通过调用Resources.getXML()来在运行时读取任意的XML文件。可以在这里保存运行时使用的各种配置文件 |
你的应用程序需要为特定的设备配置提供替代的资源支持。比如说,你需要为不同的屏幕分辨率提供替代的图片资源,为不同的语言提供替代的字符串资源。在运行时,Android 检测当前设备配置,并为应用程序加载合适的资源。
要为特定的配置的确定一系列替代资源,遵循如下的步骤:
在应用程序开发中,需要访问定义好的资源,不论是通过代码还是通过 XML 文件。下面的章节介绍如何分别在这两种场景中访问资源。
在代码访问资源
当 Android 应用程序被编译,生成一个 R 类,其中包含了所有 res/ 目录下资源的 ID。你可以使用 R 类,通过子类+资源名或者直接使用资源 ID 来访问资源。
实例
访问 res/drawable/myimage.png,并将其设置到 ImageView 上,你将使用以下代码:
ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);
这里第一行代码用 R.id.myimageview 来在布局文件中获取定义为 myimageview 的 ImageView。第二行用 R.drawable.myimage 来获取在 res/ 的 drawable 子目录下名为 myimage 的图片。
考虑下一个例子,其中 res/values/strings.xml 有如下定义:
Hello, World!
现在你可以在 ID 为 msg 的 TextView 对象上使用资源 ID 来设置文本,具体如下:
TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello);
考虑如下定义的布局 res/layout/activity_main.xml
这个应用程序代码将为活动加载这个布局,onCreate() 方法中如下:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
}
考虑下面的 XML 资源文件 res/values/strings.xml,其中包含一个颜色资源和一个字符串资源 -
#f00
Hello!
现在,你可以在下面的布局文件中使用这些资源来设置文本颜色和文本内容:
碎片是活动的一部分,使得活动更加的模块化设计。我们可以认为碎片是一种子活动。
下面是关于碎片的重要知识点 -
通过继承 Fragment 类来创建碎片。可以通过使用 元素在活动的布局文件中声明碎片来在你的活动中插入碎片。
在引入碎片之前,由于每次给定的一个时间点在屏幕上只能显示单一的活动,因此我们有一个局限。我们无法分割设备屏幕并且独立的控制不同的部分。伴随着碎片的引入,我们获得了更大的灵活性,并使得一个时间点只能在屏幕上有一个单一活动的限制被移除。现在我们可以有单一的活动,但每个活动由多个碎片组装,每个碎片有自己的布局,事件和完整的生命周期。
下面是一个典型的示例演示如何让两个由碎片定义的UI模块,在为平板设计的活动中组合,在为手持设备设计的活动中分离。
当运行在在平板尺寸的设备上,这个应用程序可以在活动A中嵌入两个碎片。在手机设备屏幕上,由于没有足够的空间,活动A仅包含有文章列表的碎片,当用户点击文章时,启动包含第二个碎片的活动B来阅读文章。
Android 的碎片拥有自己的生命周期,与 Android 的活动很相似。下面简单介绍它生命周期的不同阶段。
这是在类fragment中你可以重写的方法列表:
这里介绍创建碎片的简单步骤。
基本的碎片可以分为如下所示的三种:
Color | 颜色 | HEX | RGB |
---|---|---|---|
LightPink | 浅粉红 | #FFB6C1 | 255,182,193 |
Pink | 粉红 | #FFC0CB | 255,192,203 |
Crimson | 深红(猩红) | #DC143C | 220,20,60 |
LavenderBlush | 淡紫红 | #FFF0F5 | 255,240,245 |
PaleVioletRed | 弱紫罗兰红 | #DB7093 | 219,112,147 |
HotPink | 热情的粉红 | #FF69B4 | 255,105,180 |
DeepPink | 深粉红 | #FF1493 | 255,20,147 |
MediumVioletRed | 中紫罗兰红 | #C71585 | 199,21,133 |
Orchid | 暗紫色(兰花紫) | #DA70D6 | 218,112,214 |
Thistle | 蓟色 | #D8BFD8 | 216,191,216 |
Plum | 洋李色(李子紫) | #DDA0DD | 221,160,221 |
Violet | 紫罗兰 | #EE82EE | 238,130,238 |
Magenta | 洋红(玫瑰红) | #FF00FF | 255,0,255 |
Fuchsia | 紫红(灯笼海棠) | #FF00FF | 255,0,255 |
DarkMagenta | 深洋红 | #8B008B | 139,0,139 |
Purple | 紫色 | #800080 | 128,0,128 |
MediumOrchid | 中兰花紫 | #BA55D3 | 186,85,211 |
DarkViolet | 暗紫罗兰 | #9400D3 | 148,0,211 |
DarkOrchid | 暗兰花紫 | #9932CC | 153,50,204 |
Indigo | 靛青/紫兰色 | #4B0082 | 75,0,130 |
BlueViolet | 蓝紫罗兰 | #8A2BE2 | 138,43,226 |
MediumPurple | 中紫色 | #9370DB | 147,112,219 |
MediumSlateBlue | 中暗蓝色(中板岩蓝) | #7B68EE | 123,104,238 |
SlateBlue | 石蓝色(板岩蓝) | #6A5ACD | 106,90,205 |
DarkSlateBlue | 暗灰蓝色(暗板岩蓝) | #483D8B | 72,61,139 |
Lavender | 淡紫色(熏衣草淡紫) | #E6E6FA | 230,230,250 |
GhostWhite | 幽灵白 | #F8F8FF | 248,248,255 |
Blue | 纯蓝 | #0000FF | 0,0,255 |
MediumBlue | 中蓝色 | #0000CD | 0,0,205 |
MidnightBlue | 午夜蓝 | #191970 | 25,25,112 |
DarkBlue | 暗蓝色 | #00008B | 0,0,139 |
Navy | 海军蓝 | #000080 | 0,0,128 |
RoyalBlue | 皇家蓝/宝蓝 | #4169E1 | 65,105,225 |
CornflowerBlue | 矢车菊蓝 | #6495ED | 100,149,237 |
LightSteelBlue | 亮钢蓝 | #B0C4DE | 176,196,222 |
LightSlateGray | 亮蓝灰(亮石板灰) | #778899 | 119,136,153 |
SlateGray | 灰石色(石板灰) | #708090 | 112,128,144 |
DodgerBlue | 闪兰色(道奇蓝) | #1E90FF | 30,144,255 |
AliceBlue | 爱丽丝蓝 | #F0F8FF | 240,248,255 |
SteelBlue | 钢蓝/铁青 | #4682B4 | 70,130,180 |
LightSkyBlue | 亮天蓝色 | #87CEFA | 135,206,250 |
SkyBlue | 天蓝色 | #87CEEB | 135,206,235 |
DeepSkyBlue | 深天蓝 | #00BFFF | 0,191,255 |
LightBlue | 亮蓝 | #ADD8E6 | 173,216,230 |
PowderBlue | 粉蓝色(火药青) | #B0E0E6 | 176,224,230 |
CadetBlue | 军兰色(军服蓝) | #5F9EA0 | 95,158,160 |
Azure | 蔚蓝色 | #F0FFFF | 240,255,255 |
LightCyan | 淡青色 | #E0FFFF | 224,255,255 |
PaleTurquoise | 弱绿宝石 | #AFEEEE | 175,238,238 |
Cyan | 青色 | #00FFFF | 0,255,255 |
Aqua | 浅绿色(水色) | #00FFFF | 0,255,255 |
DarkTurquoise | 暗绿宝石 | #00CED1 | 0,206,209 |
DarkSlateGray | 暗瓦灰色(暗石板灰) | #2F4F4F | 47,79,79 |
DarkCyan | 暗青色 | #008B8B | 0,139,139 |
Teal | 水鸭色 | #008080 | 0,128,128 |
MediumTurquoise | 中绿宝石 | #48D1CC | 72,209,204 |
LightSeaGreen | 浅海洋绿 | #20B2AA | 32,178,170 |
Turquoise | 绿宝石 | #40E0D0 | 64,224,208 |
Aquamarine | 宝石碧绿 | #7FFFD4 | 127,255,212 |
MediumAquamarine | 中宝石碧绿 | #66CDAA | 102,205,170 |
MediumSpringGreen | 中春绿色 | #00FA9A | 0,250,154 |
MintCream | 薄荷奶油 | #F5FFFA | 245,255,250 |
SpringGreen | 春绿色 | #00FF7F | 0,255,127 |
MediumSeaGreen | 中海洋绿 | #3CB371 | 60,179,113 |
SeaGreen | 海洋绿 | #2E8B57 | 46,139,87 |
Honeydew | 蜜色(蜜瓜色) | #F0FFF0 | 240,255,240 |
LightGreen | 淡绿色 | #90EE90 | 144,238,144 |
PaleGreen | 弱绿色 | #98FB98 | 152,251,152 |
DarkSeaGreen | 暗海洋绿 | #8FBC8F | 143,188,143 |
LimeGreen | 闪光深绿 | #32CD32 | 50,205,50 |
Lime | 闪光绿 | #00FF00 | 0,255,0 |
ForestGreen | 森林绿 | #228B22 | 34,139,34 |
Green | 纯绿 | #008000 | 0,128,0 |
DarkGreen | 暗绿色 | #006400 | 0,100,0 |
Chartreuse | 黄绿色(查特酒绿) | #7FFF00 | 127,255,0 |
LawnGreen | 草绿色(草坪绿_ | #7CFC00 | 124,252,0 |
GreenYellow | 绿黄色 | #ADFF2F | 173,255,47 |
DarkOliveGreen | 暗橄榄绿 | #556B2F | 85,107,47 |
YellowGreen | 黄绿色 | #9ACD32 | 154,205,50 |
OliveDrab | 橄榄褐色 | #6B8E23 | 107,142,35 |
Beige | 米色/灰棕色 | #F5F5DC | 245,245,220 |
LightGoldenrodYellow | 亮菊黄 | #FAFAD2 | 250,250,210 |
Ivory | 象牙色 | #FFFFF0 | 255,255,240 |
LightYellow | 浅黄色 | #FFFFE0 | 255,255,224 |
Yellow | 纯黄 | #FFFF00 | 255,255,0 |
Olive | 橄榄 | #808000 | 128,128,0 |
DarkKhaki | 暗黄褐色(深卡叽布) | #BDB76B | 189,183,107 |
LemonChiffon | 柠檬绸 | #FFFACD | 255,250,205 |
PaleGoldenrod | 灰菊黄(苍麒麟色) | #EEE8AA | 238,232,170 |
Khaki | 黄褐色(卡叽布) | #F0E68C | 240,230,140 |
Gold | 金色 | #FFD700 | 255,215,0 |
Cornsilk | 玉米丝色 | #FFF8DC | 255,248,220 |
Goldenrod | 金菊黄 | #DAA520 | 218,165,32 |
DarkGoldenrod | 暗金菊黄 | #B8860B | 184,134,11 |
FloralWhite | 花的白色 | #FFFAF0 | 255,250,240 |
OldLace | 老花色(旧蕾丝) | #FDF5E6 | 253,245,230 |
Wheat | 浅黄色(小麦色) | #F5DEB3 | 245,222,179 |
Moccasin | 鹿皮色(鹿皮靴) | #FFE4B5 | 255,228,181 |
Orange | 橙色 | #FFA500 | 255,165,0 |
PapayaWhip | 番木色(番木瓜) | #FFEFD5 | 255,239,213 |
BlanchedAlmond | 白杏色 | #FFEBCD | 255,235,205 |
NavajoWhite | 纳瓦白(土著白) | #FFDEAD | 255,222,173 |
AntiqueWhite | 古董白 | #FAEBD7 | 250,235,215 |
Tan | 茶色 | #D2B48C | 210,180,140 |
BurlyWood | 硬木色 | #DEB887 | 222,184,135 |
Bisque | 陶坯黄 | #FFE4C4 | 255,228,196 |
DarkOrange | 深橙色 | #FF8C00 | 255,140,0 |
Linen | 亚麻布 | #FAF0E6 | 250,240,230 |
Peru | 秘鲁色 | #CD853F | 205,133,63 |
PeachPuff | 桃肉色 | #FFDAB9 | 255,218,185 |
SandyBrown | 沙棕色 | #F4A460 | 244,164,96 |
Chocolate | 巧克力色 | #D2691E | 210,105,30 |
SaddleBrown | 重褐色(马鞍棕色) | #8B4513 | 139,69,19 |
Seashell | 海贝壳 | #FFF5EE | 255,245,238 |
Sienna | 黄土赭色 | #A0522D | 160,82,45 |
LightSalmon | 浅鲑鱼肉色 | #FFA07A | 255,160,122 |
Coral | 珊瑚 | #FF7F50 | 255,127,80 |
OrangeRed | 橙红色 | #FF4500 | 255,69,0 |
DarkSalmon | 深鲜肉/鲑鱼色 | #E9967A | 233,150,122 |
Tomato | 番茄红 | #FF6347 | 255,99,71 |
MistyRose | 浅玫瑰色(薄雾玫瑰) | #FFE4E1 | 255,228,225 |
Salmon | 鲜肉/鲑鱼色 | #FA8072 | 250,128,114 |
Snow | 雪白色 | #FFFAFA | 255,250,250 |
LightCoral | 淡珊瑚色 | #F08080 | 240,128,128 |
RosyBrown | 玫瑰棕色 | #BC8F8F | 188,143,143 |
IndianRed | 印度红 | #CD5C5C | 205,92,92 |
Red | 纯红 | #FF0000 | 255,0,0 |
Brown | 棕色 | #A52A2A | 165,42,42 |
FireBrick | 火砖色(耐火砖) | #B22222 | 178,34,34 |
DarkRed | 深红色 | #8B0000 | 139,0,0 |
Maroon | 栗色 | #800000 | 128,0,0 |
White | 纯白 | #FFFFFF | 255,255,255 |
WhiteSmoke | 白烟 | #F5F5F5 | 245,245,245 |
Gainsboro | 淡灰色(庚斯博罗灰) | #DCDCDC | 220,220,220 |
LightGrey | 浅灰色 | #D3D3D3 | 211,211,211 |
Silver | 银灰色 | #C0C0C0 | 192,192,192 |
DarkGray | 深灰色 | #A9A9A9 | 169,169,169 |
Gray | 灰色 | #808080 | 128,128,128 |
DimGray | 暗淡的灰色 | #696969 | 105,105,105 |
Black | 纯黑 | #000000 | 0,0,0 |
ll | 海贝壳 | #FFF5EE | 255,245,238 |
| Sienna | 黄土赭色 | #A0522D | 160,82,45 |
| LightSalmon | 浅鲑鱼肉色 | #FFA07A | 255,160,122 |
| Coral | 珊瑚 | #FF7F50 | 255,127,80 |
| OrangeRed | 橙红色 | #FF4500 | 255,69,0 |
| DarkSalmon | 深鲜肉/鲑鱼色 | #E9967A | 233,150,122 |
| Tomato | 番茄红 | #FF6347 | 255,99,71 |
| MistyRose | 浅玫瑰色(薄雾玫瑰) | #FFE4E1 | 255,228,225 |
| Salmon | 鲜肉/鲑鱼色 | #FA8072 | 250,128,114 |
| Snow | 雪白色 | #FFFAFA | 255,250,250 |
| LightCoral | 淡珊瑚色 | #F08080 | 240,128,128 |
| RosyBrown | 玫瑰棕色 | #BC8F8F | 188,143,143 |
| IndianRed | 印度红 | #CD5C5C | 205,92,92 |
| Red | 纯红 | #FF0000 | 255,0,0 |
| Brown | 棕色 | #A52A2A | 165,42,42 |
| FireBrick | 火砖色(耐火砖) | #B22222 | 178,34,34 |
| DarkRed | 深红色 | #8B0000 | 139,0,0 |
| Maroon | 栗色 | #800000 | 128,0,0 |
| White | 纯白 | #FFFFFF | 255,255,255 |
| WhiteSmoke | 白烟 | #F5F5F5 | 245,245,245 |
| Gainsboro | 淡灰色(庚斯博罗灰) | #DCDCDC | 220,220,220 |
| LightGrey | 浅灰色 | #D3D3D3 | 211,211,211 |
| Silver | 银灰色 | #C0C0C0 | 192,192,192 |
| DarkGray | 深灰色 | #A9A9A9 | 169,169,169 |
| Gray | 灰色 | #808080 | 128,128,128 |
| DimGray | 暗淡的灰色 | #696969 | 105,105,105 |
| Black | 纯黑 | #000000 | 0,0,0 |