您的位置:首页 > 移动开发 > Android开发

android编程基础

2017-08-24 11:07 87 查看
Android编程基础

1.Android背景与当前的状况

Android系统是由AndyRubin创建的,后来被Google收购了;最早的版本是:Android
1.1版本而现在最新的版本是今年5.28,GoogleI/O大会上推出的Android
M,有趣的是Android系统的命名都是以点心来命名的,下述表是15个Android版本名称,对应API号以及发布时间!
系统版本名称
API版本号
发布时间
Android1.5:Cupcake:纸杯蛋糕
3
2009.4.30
Android1.6:Donut:甜甜圈
4
2009.9.15
Android2.0/2.0.1/2.1:Eclair:松饼
5/6/7
2009.10.26
Android2.2/2.2.1:Froyo:冻酸奶
8
2010.5.20
Android2.3:Gingerbread:姜饼
9
2010.12.7
Android3.0:Honeycomb:蜂巢
11
2011.2.2
Android3.1:Honeycomb:蜂巢
12
2011.5.11
Android3.2:Honeycomb:蜂巢
13
2011.7.13
Android4.0:IceCreamSandwich:冰激凌三文治
14
2011.10.19
Android4.1:JellyBean:果冻豆
16
2012.6.28
Android4.2:JellyBean:果冻豆
17
2012.10.30
Android4.3:JellyBean:果冻豆
18
2013.7.25
Android4.4:KitKat:奇巧巧克力
19
2013.11.01
Android5.0:Lollipop:棒棒糖
21
2014.10.16
AndroidM:预览版
22
2015.5.28
好了,除了上面这些公共版本外,当然还有一些其他的版本,截止2015.1,各个版本的市场份额如下:

看完上面的信息,我们可能有这样的一个疑问:那么多的系统版本,我们开发的时候要针对哪个版本进行开发?这就是作为一个Android必须面对的Android的"碎片化"问题了,而这个问题又分为两个:①系统碎片化:我们开发App时可能需要做到低版本兼容,比如,最低兼容至2.3版本;由于各种Rom定制的盛行,国人都喜欢对原生系统做一些更改,这导致了在原生系统上可行,而在定制Rom上不可行的问题,比如相机调用~②屏幕碎片化:市面上各种各样屏幕尺寸的手机,4.3寸,4.5寸,4.7寸,5.0寸,5.3寸...等等,除了手机外,还有Android平板,所以开发时我们可能要处理这个屏幕适配的问题,当然,刚学我们并不需要去考虑这些复杂的东西,后续实际开发我们再来深究!
2.Android系统特性与平台架构
系统特性:
·应用程序框架支持组件的重用与替换(app发布时遵守了框架的约定,其他app也可以使用该模块)
·Dalvik虚拟机:专门为移动设备优化
-集成的浏览器:开源的WebKit引擎
·SQLite结构化的数据存储
·优化的图形库,多媒体支持,GSM电话技术,蓝牙等
·采用软件叠层方式构建

平台架构图:1.2开发环境搭建

分类Android基础入门教程
现在主流的Android开发环境有:①Eclipse
+ADT+SDK②AndroidStudio+SDK③IntelliJIDEA+SDK现在国内大部分开发人员还是使用的Eclipse,而谷歌宣布不再更新ADT后,并且官网也去掉了集成Android开发环境的Eclipse下载链接,各种现象都表示开发者最后都终将过渡到Android
Studio,当然这段过渡时间会很长,但如果你是刚学Android的话建议直接冲AndroidStudio着手;而且很多优秀的开源项目都是基于Android
Studio!当然,在本教程中对两种开发环境都会进行一个介绍,用哪个取决与你自己~还有一个IntelliJ,和Android
Studio差不多的,并不对此进行讲解!
1.JDK安装与配置
·Step1:下载JDK可以到官网进行下载:Jdk官方下载也可到笔者网盘下载:笔者网盘PS:这个随便下一个都可以,关系不大,32位的只能下32位哦!
·Step2:JDK安装傻瓜式的下一步即可!
·Step3:环境变量的配置配置环境变量是为了方便我们一些命令行的操作,后续会用到!右键我的电脑——>高级——>环境变量新建JAVA_HOME修改PATH变量,别把原本的东西删掉!!!!新建CLASSPATH验证环境是否配置完成打开电脑的cmd(命令行),win键
+R输入cmd,然后在命令行依次javac和java,出现如图效果表示配置完成:

2.开发工具二选一
一开始也说了开发环境IDE的现状,另外前面忘记说一点:AndroidStudio是比较吃配置的,如果电脑不怎么好,建议还是先使用Eclipse进行Android开发,下面先说下我们熟悉IDE开发APP的流程,按照下述流程来熟悉IDE的使用:
然后下面两个选一个,开始我们的Android开发之路吧!
Eclipse+ADT+SDK:AndroidStudio+SDK

3.相关术语的解析
1.Dalvik:Android特有的虚拟机,和JVM不同,Dalvik虚拟机非常适合在移动终端上使用!
2.AVD:(androidvirtualmachine):安卓虚拟设备,就是安卓的模拟器
3.ADT:(androiddevelopmenttools)安卓开发工具
4.SDK:(softwaredevelopmentkit)软件开发工具包,就是安卓系统,平台架构等的工具集合,如adb.exe
5.DDMS:(dalvikdebugmonitorservice)安卓调试工具
6.adb:安卓调试桥,在sdk的platform-tools目录下,功能很多,命令行必备
7.DX工具:将.class转换成.dex文件
8.AAPT:(androidassetpackingtool),安卓资源打包工具
9.R.java文件:由aapt工具根据App中的资源文件自动生成,可以理解为资源字典
10.AndroidManifest.xml:app包名
+组件声明+
程序兼容的最低版本+
所需权限等程序的配置文件

后续内容对于初学者的你可能有点难度,但后面回头,你会发现这些东西很有用~看不懂的话,可以先跳过
4.ADB命令行的一些指令
执行ADB指令之前我们还需要为我们的SDK配置一下环境变量Step
1:
新建一个ANDROID_HOME的环境变量,把sdk根目录地址贴上去:Step
2:
更新Path环境变量,在Paht开头加上:%ANDROID_HOME%\tools;即可配置完了,接下来就来学习指令了:

5.APP程序打包与安装的流程:

6.APP的安装过程:
7.本节小结
本节我们对Android开发IDE的现状进行了分析,建议初学者硬件条件允许的话,使用Android
Studio来进行AndroidAPP的开发,讲述了JDK的安装与配置,以及熟悉IDE的流程,一些关键名称的解析,ADB命令行的常用指令,最后还有程序的打包安装和安装过程的解析!经过这章相信大家对Android开发有了个简单了解,了解开发一个程序的流程,以及对应的项目目录结构!相信大家会抱怨模拟器AVD跑得很慢,下节会给大家介绍一个比真机还快的Android模拟器——Genymotion的安装使用!

架构的简单理解:
1.Application(应用程序层)我们一般说的应用层的开发就是在这个层次上进行的,当然包括了系统内置的一组应用程序,使用的是Java语言
2.ApplicationFramework(应用程序框架层)无论系统内置或者我们自己编写的App,都需要使用到这层,比如我们想弄来电黑名单,自动挂断电话,我们就需要用到电话管理(TelephonyManager)通过该层我们就可以很轻松的实现挂断操作,而不需要关心底层实现
3.Libraries(库)+AndroidRuntime(Android运行时)Android给我们提供了一组C/C++库,为平台的不同组件所使用,比如媒体框架;而Android
Runtime则由Android核心库集+Dalvik虚拟机构成,Dalvik虚拟机是针对移动设备的虚拟机,它的特点:不需要很快的CPU计算速度和大量的内存空间;而每个App都单独地运行在单独的Dalvik虚拟机内每个app对于一条Dalvik进程)而他的简单运行流程如:
4.Linux内核这里就是涉及底层驱动的东西了,一些系统服务,比如安全性,内存管理以及进程管理等
3.本节小结:
本节对Android的历史背景以及现状进行了了解,然后简单分析了Android的系统特性以及系统架构,这些概念性的东西,我们了解了解即可,而下一节我们将开始Android环境的搭建!

1.前言

这里我们有两条路可以选,直接使用封装好的用于开发Android的ADTBundle,或者自己进行配置因为谷歌已经放弃了ADT的更新,官网上也取消的下载链接,这里提供谷歌放弃更新前最新版本的
ADTBundle供大家下载!

2.直接使用打包好的Eclipse
32位版:adt-bundle-windows-x86-20140702.zip(百度网盘)64位版:adt-bundle-windows-x86_64-20140702.zip(Google地址)下载解压,然后直接跳到4.来创建一个Helloworld工程!

3.自己配置Eclipse+ADT+SDK
Eclipse可自行到Eclipse官网下载:Eclipse官方下载而SDK和ADT可以到AndroidDevTools处下载:AndroidDevTools官网这里给我们提供了很多Android开发相关的工具,而且不用翻墙,必备开发网站!务必Mark!不同版本配置间可能会有一些问题!笔者用的是旧版本的(很旧),又需要的也可以下载:
Eclipse:eclipse-jee-helios-win32.zipADT:ADT-15.0.0.zipSDK:android-sdk-windows.rar搭建流程:1.解压Eclipse:到解压的文件夹中找到eclipse.exe运行,运行后设置工程代码的存放位置(工作空间)2.ADT配置:依次点击菜单栏:help->Install
newsoftware
->Add->Local...->选中下载加压后的ADT的文件夹->accept->重启Eclipse->看菜单栏是否出现Android小图标如果出现表示安装完成PS:期间可能出现一个waring,直接忽视~3.SDK解压配置:依次点击菜单栏:windows->Rreferences->Android->选中解压的SDK包->OK->打开重新验证4.创建AVD(安卓模拟器):依次点击菜单栏:手机小图标->New->选定系统版本->Skin屏幕分辨率->设置下SD卡大小->完成->start即可PS:第一次启动AVD的话可能很慢,需要等等~

4.第一个程序HelloWorld工程创建与运行
1.New->AndroidAppProject如果找不到,可以去Other
->android找到,也是一样的:2.然后依次输入工程信息:3.运行创建好的程序4.从模拟器上看到运行效果:

5.项目的目录结构分析
先来看下我们的工程目录图:接下来我们需要知道的部分:
·src目录:包含App所需的全部程序代码文件,我们大多数时候都是在这里编写我们的Java代码的
·gen目录:只关注R.java文件,它是由ADT自动产生的,里面定义了一个R类,可以看作一个id(资源编号)的字典,包含了用户界面,图形,字符串等资源的id,而我们平时使用资源也是通过R文件来调用的,同时编译器也会看这个资源列表,没有用到的资源不会被编译进去,可以为App节省空间
·assets目录:存放资源,而且不会再R.java文件下生成资源id,需要使用AssetsManager类进行访问
·libs目录:存放一些jar包,比如v4,v7的兼容包,又或者是第三方的一些包
·res资源目录:存放资源的,drawable:存放图片资源;layout:存放界面的布局文件,都是XML文件;
values:包含使用XML格式的参数的描述文件,如string.xml字符串,color.xml颜色,style.xml风格样式等
·AndroidManifest.xml配置文件:系统的控制文件,用于告诉Android系统App所包含的一些基本信息,比如组件,资源,以及需要的权限,以及兼容的最低版本的SDK等

6.几个常用的视图
点击菜单栏上的:Windows->showview打开对应的视图即可:
点击other,下述是Android中一些常用的视图:
其实主要的还是Logcat的使用,因为和Java不同,我们的App运行在虚拟机上,而我们的控制台却并不会显示相关信息,只有安装状态而已,所以我们会在Logcat上查看程序运行的日志信息:
7.本节小结
本节我们学习了使用Eclipse搭建我们的Android开发环境,懒人版和动手搭建版,两者都可以;接着我们又介绍了下Eclipse开发Android项目的目录结构的一些信息,在下一节中我们将深入HelloWorld工程,了解其中的代码!

Android常见的十个高级控件

自动完成文本框。在Android开发中提供了两种智能输入框——AutoCompleteTextView和MultiAutoCompleteTextView。它们的功能类似于百度在搜索栏输入信息的时候,弹出与输入信息接近的提示信息,然后用户选择点击需要的信息,自动完成文本输入。AutoCompleteTextView和MultiAutoCompleteTextView都是可编辑的文本视图,前者能够实现动态匹配输入的内容,后者则能够对用户键入的文本进行有效地扩充提示。MultiAutoCompleteTextView可以在输入框一直增加选择值。

Android:控件AutoCompleteTextView自动提示
在输入框中输入我们想要输入的信息就会出现其他与其相关的提示信息,这种效果在Android中是用AutoCompleteTextView实现的。
<AutoCompleteTextView

android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/autotext"
/>

publicclassMainActivity
extendsActivity{
privateAutoCompleteTextViewautotext;
privateArrayAdapter<String>arrayAdapter;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.test);

autotext=(AutoCompleteTextView)findViewById(R.id.autotext);
String[]arr={"aa","aab","aac"};
arrayAdapter=
newArrayAdapter<String>(this,android.R.layout.simple_list_item_1,arr);
autotext.setAdapter(arrayAdapter);
}

}

AutoCompleteTextView常用属性
android:completionHint
设置出现在下拉菜单中的提示标题
android:completionThreshold
设置用户至少输入多少个字符才会显示提示
android:dropDownHorizontalOffset
下拉菜单于文本框之间的水平偏移。默认与文本框左对齐
android:dropDownHeight
下拉菜单的高度
android:dropDownWidth
下拉菜单的宽度
android:singleLine
单行显示
android:dropDownVerticalOffset
垂直偏移量
相关文章:

进度条与拖动条。进度条是需要长时间加载某些资源时,为用户显示加载的进度的控件。它还有一个次要的进度条,用来显示中间的进度。而在不确定模式下,进度条显示循环动画。拖动条则是主要是完成于用户的简单交互。用户可以通过拖动滑块,来调节当前进度,比如播放进度,调节音量大小,对拖动条的设置可以在XML的文件中使用属性进行设置。Android拖动条(SeekBar)实例附完整demo项目代码
1、拖动条的事件

实现SeekBar.OnSeekBarChangeListener接口。需要监听三个事件:

数值改变(onProgressChanged)

开始拖动(onStartTrackingTouch)

停止拖动(onStopTrackingTouch)
onStartTrackingTouch开始拖动时触发,与onProgressChanged区别是停止拖动前只触发一次

而onProgressChanged只要在拖动,就会重复触发。
2、拖动条的主要属性和方法

setMax

设置拖动条的数值

setProgress

设置拖动条当前的数值

setSeconddaryProgress

设置第二拖动条的数值,即当前拖动条推荐的数值
代码:

1
packagecom.zdztools.seekbartest;
2
3
importandroid.app.Activity;
4
importandroid.os.Bundle;
5
importandroid.util.Log;
6
importandroid.widget.SeekBar;
7
importandroid.widget.TextView;
8
importandroid.widget.SeekBar.OnSeekBarChangeListener;
9
10
publicclassMainActivity
extendsActivity{
11protected
staticfinalStringTAG="MainActivity";
12privateSeekBarseek;
13privateTextViewmyTextView;
14
15@Override
16protected
voidonCreate(BundlesavedInstanceState){
17super.onCreate(savedInstanceState);
18setContentView(R.layout.activity_main);
19
20myTextView=(TextView)findViewById(R.id.myTextView);
21seek=(SeekBar)findViewById(R.id.mySeekBar);
22//初始化
23seek.setProgress(60);
24seek.setOnSeekBarChangeListener(seekListener);
25myTextView.setText("当前值为:-"+60);
26}
27
28privateOnSeekBarChangeListenerseekListener=newOnSeekBarChangeListener(){
29@Override
30publicvoidonStopTrackingTouch(SeekBarseekBar){
31Log.i(TAG,"onStopTrackingTouch");
32}
33
34@Override
35publicvoidonStartTrackingTouch(SeekBarseekBar){
36Log.i(TAG,"onStartTrackingTouch");
37}
38
39@Override
40publicvoidonProgressChanged(SeekBarseekBar,
intprogress,
41booleanfromUser){
42Log.i(TAG,"onProgressChanged");
43myTextView.setText("当前值为:-"+progress);
44
45}
46};
47}

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">

<TextView

android:id="@+id/myTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="20dip"
android:text=""
android:textSize="16sp"
android:textStyle="bold"/>

<SeekBar

android:id="@+id/mySeekBar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>

</LinearLayout>

凌晨;两点半
以前的态度,决定了现在的你;现在的态度,决定将来的你!

Android自学之进度条ProgressBar

进度条(ProgressBar)也是UI界面中的一种非常使用的组件,通常用于向用户显示某个耗时完成的百分比。因此进度条可以动态的显示进度,因此避免长时间地执行某个耗时操作时,让用户感觉程序失去了响应,从而更好的提高用户界面的有好性。

Android支持几种风格的进度条,通过Style属性可以为进度条ProgressBar指定风格,该属性支持一下几个属性值。

·@android:style/widget.ProgressBar.Horizontal————水平进度条
·@android:style/widget.ProgressBar.Inverse————不断跳跃、旋转画面进度条
·@android:style/widget.ProgressBar.Large————大进度条
·@android:style/widget.ProgressBar.Large.Inverse————不断跳跃、旋转画面的大进度条
·@android:style/widget.ProgressBar.Small————小进度条
·@android:style/widget.ProgressBar.Smal.Inversel————不断跳跃、旋转画面的小进度条
除此之外,ProgressBar还支持下表的常用XML属性

XML属性

说明

android:max

设置该进度条的最大值

android:progress

设置该进度条的已完成进度值

android:progressDrawable

设置该进度条的轨道的绘制形式

android:progressBarStyle

默认进度条样式

android:progressBarStyleHorizontal

水平进度条样式

android:progressBarStyleLarge

大进度条样式

android:progressBarStyleSmall

小进度条样式

上表中的android:progressDrawable用于指定进度条的轨道的绘制形式,该属性可以指定一个LayerDrawable对象(该对象可以通过在xml文件中用<layer-list>元素进行配置)的引用。

ProgressBar提供了如下方法来操作完成百分比:

·setProgress(int):设置进度完成百分比。
·incrementProgressBy(int):设置进度条的进度增加或减少。当参数为正数时增加,反之则减少。
下面的程序简单的示范了进度条的用法,改程序的界面布局文件只是定义了一个简单的进度条,并指定了style属性@android:style/widget.ProgressBar.Horizontal;即水平进度条,界面布局文件如下:

Layout/main.xml

1<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

2xmlns:tools="http://schemas.android.com/tools"

3android:orientation="vertical"

4android:layout_width="match_parent"

5android:layout_height="match_parent">

6

7<TextView

8android:layout_width="wrap_content"

9android:layout_height="wrap_content"

10android:text="任务完成的进度"/>

11

12<!--定义一个水平的进度条-->

13<ProgressBarandroid:id="@+id/bar"

14android:layout_width="fill_parent"

15android:layout_height="wrap_content"

16android:max="100"

17style="@android:style/Widget.ProgressBar.Horizontal"/>

18

19

20<!--定义一个水平的进度条,并改变轨道外观-->

21<ProgressBarandroid:id="@+id/bar2"

22android:layout_width="fill_parent"

23android:layout_height="wrap_content"

24android:max="100"

25style="@android:style/Widget.ProgressBar.Horizontal"

26android:progressDrawable="@drawable/my_bar"/>

27</LinearLayout>


上面的代码layout/main.xml里面有两个水平的进度条,但是第二个我们改变的轨道外观,外观被定义为@drawable/my_bar,因此我们还需要看看

drawable-mdpi/my_bar.xml

1<?xmlversion="1.0"encoding="UTF-8"?>

2<layer-listxmlns:android="http://schemas.android.com/apk/res/android">

3<!--定义轨道的背景-->

4<itemandroid:id="@android:id/background"

5android:drawable="@drawable/no"/>

6<!--定义轨道上已完成部分的样式-->

7<itemandroid:id="@android:id/progress"

8android:drawable="@drawable/ok"/>

9</layer-list>


drawable-mdpi/my_bar.xml这个文件定义了轨道的背景为no这张图片,已完成的部分为ok这张图片。

主程序用了一个数组填充的任务模拟了耗时操作,并以进度条来标识任务的完成百分比。

com.example.progressbar.ProgressBarTest.java

1packagecom.example.progressbar;

2

3importandroid.support.v7.app.ActionBarActivity;

4importandroid.support.v7.app.ActionBar;

5importandroid.support.v4.app.Fragment;

6importandroid.os.Bundle;

7importandroid.os.Handler;

8importandroid.os.Message;

9importandroid.view.LayoutInflater;

10importandroid.view.Menu;

11importandroid.view.MenuItem;

12importandroid.view.View;

13importandroid.view.ViewGroup;

14importandroid.widget.ProgressBar;

15importandroid.os.Build;

16

17publicclassProgressBarTestextendsActionBarActivity{

18

19//该程序模拟填充长度为100的数组

20privateint[]data=newint[100];

21inthasData=0;

22//记录ProgressBar的完成进度

23intstatus=0;

24

25@Override

26protectedvoidonCreate(BundlesavedInstanceState){

27super.onCreate(savedInstanceState);

28setContentView(R.layout.main);

29//获得界面布局里面的进度条组件

30finalProgressBarbar=(ProgressBar)findViewById(R.id.bar);

31finalProgressBarbar2=(ProgressBar)findViewById(R.id.bar2);

32//创建一个负责更新进度条的Handler

33finalHandlermHandler=newHandler(){

34@Override

35publicvoidhandleMessage(Messagemsg){

36

37if(msg.what==0x111){

38bar.setProgress(status);

39bar2.setProgress(status);

40}

41}

42};

43

44//启动线程来执行任务

45newThread(){

46publicvoidrun(){

47while(status<100){

48//获取耗时操作的完成百分比

49status=doWork();

50//发送消息到Handler

51Messagem=newMessage();

52m.what=0x111;

53//发送消息

54mHandler.sendMessage(m);

55}

56

57};

58}.start();

59

60}

61

62//模拟一个耗时的操作

63privateintdoWork(){

64data[hasData++]=(int)(Math.random()*100);

65

66try{

67Thread.sleep(100);

68}catch(InterruptedExceptione){

69e.printStackTrace();

70}

71

72returnhasData;

73}

74}


运行后的效果图:

显示在标题上的进度条

  评分条。评分条是基于SeekBar和ProgressBar的扩展,用星型来显示等级评定,一般默认是5颗星。用户可以通过触屏点击或者轨迹球左右移动来进行星型等级评定。RatingBar有三种风格:RatingBarStyle(默认风格),RatingBarStyleSmall(小风格),RatingBarStyledicator(大风格)。

  滚动视图(ScollView),即在一个屏幕不能完全显示所有需要显示的信息的情况下,使用到的控件。它支持垂直滚动,其使用非常简单,与布局的使用完全一致,需要将其他布局嵌套在ScollView之内。高级控件之滚动视图(ScrollView)

标签:android控件ScrollView
2016-12-0619:02578人阅读评论(0)收藏举报
分类:
android(184)高级控件(12)

版权声明:本文为博主原创文章。只要评论中留言就可以转载。

目录(?)[+]

一.滚动视图的基础概念

滚动视图用于为其它组件添加滚动条,在默认的情况下,当窗体中内容比较多,而一屏显示不下时,超出的部分不能被用户所看到.因为Android的布局管理器本身没有提供滚动屏幕的功能.如果要让其滚动,就要使用滚动视图ScrllView.

滚动视图是FrameLayout的子类,因此,在滚动视图中,可以添加任何想要放入其中的组件,但是一个滚动视图中只能放一个组件,如果要放置多个,可以先放一个存布局管理器.再将要放置的组件放置到该布局管理器中,在滚动视图中,使用比较多的是线性布局管理器.

(一)滚动视图(ScrollView)的XML配置:

<ScrollView

android:id=
"@+id/myscollView"

android:layout_width=
"match_parent"[/code]
android:layout_height=
"wrap_content"
>

//这里只能放一个布局或控件

//一般是放LinearLayout布局

</ScrollView>


·1

·2

·3

·4

·5

·6

·7

·1

·2

·3

·4

·5

·6

·7


(二)水平滚动视图(HorizontalScrollView)

HorizontalScrollView和ScrollView差不多,只是滚动方式为横向

XML配置:

<HorizontalScrollView

android:[code]id=
"@+id/scrollView1"[/code]
android:[code]layout_width=
"match_parent"[/code]
android:[code]layout_height=
"wrap_content"
>

</HorizontalScrollView>


·1

·2

·3

·4

·5

·1

·2

·3

·4

·5


滚动视图的作用:

1.滚动视图使用后能让里面的视图控件没展示的部分滚动后可以展示

比如一个TextView默认情况文本过大后,超出屏幕或框体的内容是不能显示出来的,但是如果把这个TextView放到一个滚动视图中,就能上下滚动显示没有显示的文本内容。

2.水平滚动的视图内显示横向拉伸的布局的内容

比如一个水平的LinearLayout放置十个按钮,那么只能显示五个,如果把这个LinearLayout放在一个水平滚动的视图中,就可以水平的拖动视图显示后面的按钮。

值得注意的是ListView是默认带滚动的,不需要滚动视图的包裹。

android的五六布局(线性布局,相对布局,绝对布局,表格布局,网格布局,层布局)和简单控件(TextView,ImageView等等)默认是不能滚动显示的,除非放到滚动视图中。

还有一点值得注意的是,如果ListView放到ScrollView中去这里ListView要自定义的拉长,否则会默认显示ListView中的一行数据,要拉伸才显示其他内容。

二.简单展示的示例程序

(一)布局文件activity_main.xml设计

<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent">


<ScrollView[/code]
android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:scrollbars="none">


<LinearLayout[/code]
android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">


<TextView[/code]
android:id="@+id/tv_title"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>


<TextView[/code]
android:id="@+id/tv_content"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>

</LinearLayout>[/code]
</ScrollView>[/code]

</RelativeLayout>


·1

·2

·3

·4

·5

·6

·7

·8

·9

·10

·11

·12

·13

·14

·15

·16

·17

·18

·19

·20

·21

·22

·23

·24

·25

·26

·27

·1

·2

·3

·4

·5

·6

·7

·8

·9

·10

·11

·12

·13

·14

·15

·16

·17

·18

·19

·20

·21

·22

·23

·24

·25

·26

·27


(二)java代码设计

package[code]com.example.lesson7_scrollview;


import[code]android.app.Activity;

import[code]android.os.Bundle;

import[code]android.widget.TextView;


/**

*ScrollView的简单展示

*/

public[code]
classMainActivityextendsActivity{[/code]

@Override[/code]
protected
void
onCreate
(BundlesavedInstanceState){

super
.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

TextViewtvTile=(TextView)findViewById(R.id.tv_title);

tvTile.setTextSize(
30
);

tvTile.setText(
"文章标题:。。。"
);

TextViewtv=(TextView)findViewById(R.id.tv_content);

tv.setTextSize(
20
);

CharSequencetext=
"锅盔的原材料都是庄稼人自家酿种的。"[/code]
+
"\n"
+
"面粉是自家地里种的小麦磨成的;"[/code]
+
"\n"
+
"是自家饲养的鸡产的;香豆子,"
+
"\n"[/code]
+
"是自家地埂上撒出来的。这些材料,"
+
"\n"[/code]
+
"也是靠老天的眷顾,才有的。山区,"
+
"\n"[/code]
+
"就是靠天吃饭。万一哪一年,"
+
"\n"[/code]
+
"老天一生气不下雨,山就荒了,"
+
"\n"[/code]
+
"地也荒了,人也慌了,"
+
"\n"

+
"妈妈的锅盔也会瘪了。"
+
"\n"[/code]
+
"妈妈经过泡发面、和面、醒面等几道程序,"
+
"\n"[/code]
+
"把这些材料依次揉进面里,"
+
"\n"[/code]
+
"再切成碗口大的面团,揉成馒头,再用擀杖稍稍一擀,"[/code]
+
"\n"[/code]
+
"或用手掌稍稍一按,就成了一寸多高、盘子大小的圆饼。"[/code]
+
"\n"
+
"灵巧、细心、唯美的妈妈总不忘在饼上面"[/code]
+
"\n"
+
"用菜刀画出美丽对称的图案:三角形、四边形、菱形等等。"
+
"\n"[/code]
+
"妈妈的爱,就在那揉、擀、按、画的过程中,"
+
"\n"[/code]
+
"一点一点渗进锅盔里,流进我的血脉里。弄好的锅"
;

tv.setText(text);


}


}


·1

·2

·3

·4

·5

·6

·7

·8

·9

·10

·11

·12

·13

·14

·15

·16

·17

·18

·19

·20

·21

·22

·23

·24

·25

·26

·27

·28

·29

·30

·31

·32

·33

·34

·35

·36

·37

·38

·39

·40

·41

·42

·43

·1

·2

·3

·4

·5

·6

·7

·8

·9

·10

·11

·12

·13

·14

·15

·16

·17

·18

·19

·20

·21

·22

·23

·24

·25

·26

·27

·28

·29

·30

·31

·32

·33

·34

·35

·36

·37

·38

·39

·40

·41

·42

·43


程序运行后的显示界面:

页面往下拉显示的界面:

如果ListView或GridView放在ScrollVIew中要做的处理:

如果是ListView在ScrollView中时的处理:

package[code]com.lwz.mathbox.weight;


import[code]android.content.Context;

import[code]android.util.AttributeSet;

import[code]android.widget.ListView;


/**

*可滚动的ListView,这里是因为这个ListView被包裹在一个ScrollView中才需要设置纵向拉伸

*/


public[code]
classScrollListViewextendsListView{[/code]
public
ScrollListView
(Contextcontext){

super
(context);

}


public
ScrollListView
(Contextcontext,AttributeSetattrs){

super
(context,attrs);

}


@Override[/code]
protected
void
onMeasure
(
int
widthMeasureSpec,
int
heightMeasureSpec){

int
height=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>
2
,MeasureSpec.AT_MOST);

super
.onMeasure(widthMeasureSpec,height);

}

}


·1

·2

·3

·4

·5

·6

·7

·8

·9

·10

·11

·12

·13

·14

·15

·16

·17

·18

·19

·20

·21

·22

·23

·24

·25

·1

·2

·3

·4

·5

·6

·7

·8

·9

·10

·11

·12

·13

·14

·15

·16

·17

·18

·19

·20

·21

·22

·23

·24

·25


如果是GridView在ScrollView中时的处理:

package[code]com.lwz.mathbox.weight;


import[code]android.content.Context;

import[code]android.util.AttributeSet;

import[code]android.widget.GridView;


/**

*重写网格View,设置高度

*可滚动的GridView,这里是因为这个GridView被包裹在一个ScrollView中才需要设置纵向拉伸

*/


public[code]
classScrollGridViewextendsGridView{[/code]
public
ScrollGridView
(Contextcontext){

super
(context);

}


public
ScrollGridView
(Contextcontext,AttributeSetattrs){

super
(context,attrs);

}


@Override[/code]
protected
void
onMeasure
(
int
widthMeasureSpec,
int
heightMeasureSpec){

int
height=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>
2
,MeasureSpec.AT_MOST);

super
.onMeasure(widthMeasureSpec,height);

}

}


·1

·2

·3

·4

·5

·6

·7

·8

·9

·10

·11

·12

·13

·14

·15

·16

·17

·18

·19

·20

·21

·22

·23

·24

·25

·26

·1

·2

·3

·4

·5

·6

·7

·8

·9

·10

·11

·12

·13

·14

·15

·16

·17

·18

·19

·20

·21

·22

·23

·24

·25

·26


使用的时候把这两个类分别当中ListView和GridView使用就可以了。

比如:

<ScrollView

android:layout_width=
"match_parent"[/code]
android:layout_height=
"match_parent"
>


<LinearLayout

android:layout_width=
"match_parent"[/code]
android:layout_height=
"match_parent"[/code]
android:orientation=
"vertical"
>


<TextView

android:layout_width=
"match_parent"[/code]
android:layout_height=
"wrap_content"[/code]
android:background=
"@color/hint_color"[/code]
android:padding=
"10dp"[/code]
android:text=
"历史记录"[/code]
/>


<TextView

android:id=
"@+id/tv_history"[/code]
android:layout_width=
"match_parent"[/code]
android:layout_height=
"wrap_content"[/code]
android:padding=
"10dp"[/code]
android:text=
"当前还没有历史记录"
/>

//
包名
+
类名

<
com.lwz.mathbox.weight.ScrollGridView[/code]
android:id=
"@+id/gv_topic"[/code]
android:layout_width=
"match_parent"[/code]
android:layout_height=
"wrap_content"[/code]
android:background=
"@color/hint_color"[/code]
android:horizontalSpacing=
"1dp"[/code]
android:numColumns=
"2"[/code]
android:verticalSpacing=
"1dp"
/>


<TextView

android:layout_width=
"match_parent"[/code]
android:layout_height=
"wrap_content"[/code]
android:background=
"@color/hint_color"[/code]
android:padding=
"10dp"[/code]
android:text=
"社区热门"[/code]
/>

//
包名
+
类名

<
com.lwz.mathbox.weight.ScrollListView[/code]
android:id=
"@+id/lv_topic"[/code]
android:layout_width=
"match_parent"[/code]
android:layout_height=
"match_parent"
/>


</LinearLayout>

</ScrollView>


  列表视图(ListView)就是将数据闲时候在一个垂直且可滚动的列表中的一种控件,数据来源于ListAdapter,包括图片,文本等。

  下拉列表(Spinner),每次只显示用户选中的元素,当用户再次点击时,会弹出选择列表供用户选择,而选择列表中的元素同样是来自适配器。

  选项卡(TabHost)控件可以实现多个标签样式的效果。单击每个选项卡,打开其对应的内容界面。TabHost是整个Tab的容器,包括TadWidget和FrameLayout。

  页面滑动切换控件(ViewPager),android的左右滑动在实际编程经常能用到,比如查看多张图片,左右切换tab页。ViewPager是google
SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换。这个附加包是android-support-v4.jar,在最后的源码中会提供给大家,在libs文件夹中。

  图片切换控件。ImageSwitcher是Android中控制图片展示效果的一个控件,如:幻灯片效果...,在Android开发中,可以通过使用图片切换控件ImageSwitcher来实现浏览多张图片的功能。在xml布局文件中,我们使用LinearLayout对整个界面进行垂直布局。在界面的顶端设置了一个水平居中的ImageSwitcher控件,用来显示多张图片。

  网格视图(GridView)。网格布局:是一个ViewGroup以网格显示它的子视图(view)元素,即二维的、滚动的网格。网格元素通过ListAdapter自动插入到网格。Android中GridView的视图排列方式与矩阵类似,当屏幕上有很多元索(文字、图片或其他元素)需要显示时,可以使用GridView。

2.3.7ProgressBar(进度条)
分类Android
基础入门教程

本节引言:
本节给大家带来的是Android基本UI控件中的ProgressBar(进度条),ProgressBar的应用场景很多,比如用户登录时,后台在发请求,以及等待服务器返回信息,这个时候会用到进度条;或者当在进行一些比较耗时的操作,需要等待一段较长的时间,这个时候如果没有提示,用户可能会以为程序Carsh或者手机死机了,这样会大大降低用户体验,所以在需要进行耗时操作的地方,添加上进度条,让用户知道当前的程序在执行中,也可以直观的告诉用户当前任务的执行进度等!使用进度条可以给我带来这样的便利!好了,开始讲解本节内容~
对了,ProgressBar官方API文档:ProgressBar

1.常用属性讲解与基础实例
从官方文档,我们看到了这样一个类关系图:
ProgressBar继承与View类,直接子类有AbsSeekBar和ContentLoadingProgressBar,其中AbsSeekBar的子类有SeekBar和RatingBar,可见这二者也是基于ProgressBar实现的
常用属性详解:
·android:max:进度条的最大值
·android:progress:进度条已完成进度值
·android:progressDrawable:设置轨道对应的Drawable对象
·android:indeterminate:如果设置成true,则进度条不精确显示进度
·android:indeterminateDrawable:设置不显示进度的进度条的Drawable对象
·android:indeterminateDuration:设置不精确显示进度的持续时间
·android:secondaryProgress:二级进度条,类似于视频播放的一条是当前播放进度,一条是缓冲进度,前者通过progress属性进行设置!
对应的再Java中我们可调用下述方法:
·getMax():返回这个进度条的范围的上限
·getProgress():返回进度
·getSecondaryProgress():返回次要进度
·incrementProgressBy(intdiff):指定增加的进度
·isIndeterminate():指示进度条是否在不确定模式下
·setIndeterminate(booleanindeterminate):设置不确定模式下
接下来来看看系统提供的默认的进度条的例子吧!
系统默认进度条使用实例:
运行效果图:
实现布局代码:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<!--系统提供的圆形进度条,依次是大中小-->

<ProgressBar
style="@android:style/Widget.ProgressBar.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

<ProgressBar
style="@android:style/Widget.ProgressBar.Large"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

<!--系统提供的水平进度条-->
<ProgressBar
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="18"
/>

<ProgressBar
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:indeterminate="true"
/>

</LinearLayout>

好吧,除了第二个能看,其他的就算了...系统提供的肯定是满足不了我们的需求的!下面我们就来讲解下实际开发中我们对进度条的处理!

2.使用动画来替代圆形进度条
第一个方案是,使用一套连续图片,形成一个帧动画,当需要进度图的时候,让动画可见,不需要的时候让动画不可见即可!而这个动画,一般是使用AnimationDrawable来实现的!好的,我们来定义一个AnimationDrawable文件:
PS:用到的图片素材:进度条图片素材打包.zip
运行效果图:
<p实现步骤:
在res目录下新建一个:anim文件件,然后创建amin_pgbar.xml的资源文件:

<?xmlversion="1.0"encoding="utf-8"?>

<animation-list
xmlns:android="http://schemas.android.com/apk/res/android"

android:oneshot="false"
>

<item
android:drawable="@drawable/loading_01"

android:duration="200"/>

<item
android:drawable="@drawable/loading_02"

android:duration="200"/>

<item
android:drawable="@drawable/loading_03"

android:duration="200"/>

<item
android:drawable="@drawable/loading_04"

android:duration="200"/>

<item
android:drawable="@drawable/loading_05"

android:duration="200"/>

<item
android:drawable="@drawable/loading_06"

android:duration="200"/>

<item
android:drawable="@drawable/loading_07"

android:duration="200"/>

<item
android:drawable="@drawable/loading_08"

android:duration="200"/>

<item
android:drawable="@drawable/loading_09"

android:duration="200"/>

<item
android:drawable="@drawable/loading_10"

android:duration="200"/>

<item
android:drawable="@drawable/loading_11"

android:duration="200"/>

<item
android:drawable="@drawable/loading_12"

android:duration="200"/>

</animation-list>

接着写个布局文件,里面仅仅有一个ImageView即可,用于显示进度条,把src设置为上述drawable资源即可!最后到MainActivity.java

public
classMainActivity
extendsAppCompatActivity
{

private
ImageViewimg_pgbar;
private
AnimationDrawablead;

@Override
protected
voidonCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img_pgbar=
(ImageView)findViewById(R.id.img_pgbar);
ad=
(AnimationDrawable)img_pgbar.getDrawable();
img_pgbar.postDelayed(new
Runnable()
{
@Override
public
voidrun()
{
ad.start();
}
},
100);
}

}

这里只是写了如何启动动画,剩下的就你自己来了哦~在需要显示进度条的时候,让ImageView可见;在不需要的时候让他隐藏即可!另外其实Progressbar本身有一个indeterminateDrawable,只需把这个参数设置成上述的动画资源即可,但是进度条条的图案大小是不能直接修改的,需要Java代码中修改,如果你设置了宽高,而且这个宽高过大的时候,你会看到有多个进度条...自己权衡下吧~


3.自定义圆形进度条
相信你看完2会吐槽,卧槽,这么坑爹,拿个动画来坑人,哈哈,实际开发中都这样,当然上述这种情况只适用于不用显示进度的场合,如果要显示进度的场合就没用处了,好吧,接下来看下网上一个简单的自定义圆形进度条!代码还是比较简单,容易理解,又兴趣可以看看,或者进行相关扩展~
运行效果图:
实现代码:
自定义View类:

/**
*CreatedbyJayon2015/8/50005.
*/
public
classCirclePgBar
extendsView
{

private
PaintmBackPaint;
private
PaintmFrontPaint;
private
PaintmTextPaint;
private
floatmStrokeWidth=
50;
private
floatmHalfStrokeWidth=mStrokeWidth
/2;
private
floatmRadius=
200;
private
RectFmRect;
private
intmProgress=
0;
//目标值,想改多少就改多少
private
intmTargetProgress=
90;
private
intmMax=
100;
private
intmWidth;
private
intmHeight;

public
CirclePgBar(Contextcontext)
{
super(context);
init();
}

public
CirclePgBar(Contextcontext,
AttributeSetattrs)
{
super(context,attrs);
init();
}

public
CirclePgBar(Contextcontext,
AttributeSetattrs,
intdefStyleAttr)
{
super(context,attrs,defStyleAttr);
init();
}

//完成相关参数初始化
private
voidinit()
{
mBackPaint=
newPaint();
mBackPaint.setColor(Color.WHITE);
mBackPaint.setAntiAlias(true);
mBackPaint.setStyle(Paint.Style.STROKE);
mBackPaint.setStrokeWidth(mStrokeWidth);

mFrontPaint=
newPaint();
mFrontPaint.setColor(Color.GREEN);
mFrontPaint.setAntiAlias(true);
mFrontPaint.setStyle(Paint.Style.STROKE);
mFrontPaint.setStrokeWidth(mStrokeWidth);

mTextPaint=
newPaint();
mTextPaint.setColor(Color.GREEN);
mTextPaint.setAntiAlias(true);
mTextPaint.setTextSize(80);
mTextPaint.setTextAlign(Paint.Align.CENTER);
}

//重写测量大小的onMeasure方法和绘制View的核心方法onDraw()
@Override
protected
voidonMeasure(intwidthMeasureSpec,
intheightMeasureSpec)
{
super.onMeasure(widthMeasureSpec,heightMeasureSpec);
mWidth=getRealSize(widthMeasureSpec);
mHeight=getRealSize(heightMeasureSpec);
setMeasuredDimension(mWidth,mHeight);

}

@Override
protected
voidonDraw(Canvascanvas)
{
initRect();
floatangle
=mProgress/
(float)mMax
*360;
canvas.drawCircle(mWidth
/2,mHeight
/2,mRadius,mBackPaint);
canvas.drawArc(mRect,
-90,angle,
false,mFrontPaint);
canvas.drawText(mProgress
+"%",mWidth
/2
+mHalfStrokeWidth,mHeight
/2+mHalfStrokeWidth,mTextPaint);
if
(mProgress<mTargetProgress)
{
mProgress+=
1;
invalidate();
}

}

public
intgetRealSize(intmeasureSpec)
{
intresult
=1;
intmode
=MeasureSpec.getMode(measureSpec);
intsize
=MeasureSpec.getSize(measureSpec);

if
(mode==MeasureSpec.AT_MOST
||mode==
MeasureSpec.UNSPECIFIED)
{
//自己计算
result=
(int)
(mRadius*
2+mStrokeWidth);
}
else{
result=size;
}

returnresult;
}

private
voidinitRect()
{
if
(mRect==null)
{
mRect=
newRectF();
intviewSize
=(int)
(mRadius*
2);
intleft
=(mWidth-viewSize)
/2;
inttop
=(mHeight
-viewSize)
/2;
intright
=left+viewSize;
intbottom
=top+viewSize;
mRect.set(left,top,right,
bottom);
}
}

}

然后在布局文件中加上:

<com.jay.progressbardemo.CirclePgBar
android:layout_width="match_parent"
android:layout_height="match_parent"/>

就是这么简单~


本节小结:
本节给大家介绍了Android中的常用控件:ProgressBar讲解了基本用法,以及实际开发中对于进度条的两种实现方法,第二个自定义进度条可以自行完善,然后用到实际开发中~!好的,本节就到这里,谢谢~
</p

2.3.8SeekBar(拖动条)

分类Android
基础入门教程

本节引言:

本节我们继续来学习Android的基本UI控件中的拖动条——SeekBar,相信大家对他并不陌生,最常见的地方就是音乐播放器或者视频播放器了,音量控制或者播放进度控制,都用到了这个SeekBar,我们先来看看SeekBar的类结构,来到官方文档:SeekBar
嘿嘿,这玩意是ProgressBar的子类耶,也就是ProgressBar的属性都可以用咯!而且他还有一个自己的属性就是:android:thumb,就是允许我们自定义滑块~
好的,开始本节内容!

1.SeekBar基本用法

好吧,基本用法其实很简单,常用的属性无非就下面这几个常用的属性,Java代码里只要setXxx即可:

android:max="100"//滑动条的最大值
android:progress="60"//滑动条的当前值
android:secondaryProgress="70"//二级滑动条的进度
android:thumb="@mipmap/sb_icon"//滑块的drawable
接着要说下SeekBar的事件了,SeekBar.OnSeekBarChangeListener我们只需重写三个对应的方法:

onProgressChanged:进度发生改变时会触发
onStartTrackingTouch:按住SeekBar时会触发
onStopTrackingTouch:放开SeekBar时触发
简单的代码示例:

效果图:

实现代码:

publicclassMainActivityextendsAppCompatActivity{


privateSeekBarsb_normal;

privateTextViewtxt_cur;

privateContextmContext;


@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mContext=MainActivity.this;

bindViews();

}


privatevoidbindViews(){

sb_normal=(SeekBar)findViewById(R.id.sb_normal);

txt_cur=(TextView)findViewById(R.id.txt_cur);

sb_normal.setOnSeekBarChangeListener(newSeekBar.OnSeekBarChangeListener(){

@Override

publicvoidonProgressChanged(SeekBarseekBar,intprogress,booleanfromUser){

txt_cur.setText("当前进度值:"+progress+"/100");

}


@Override

publicvoidonStartTrackingTouch(SeekBarseekBar){

Toast.makeText(mContext,"触碰SeekBar",Toast.LENGTH_SHORT).show();

}


@Override

publicvoidonStopTrackingTouch(SeekBarseekBar){

Toast.makeText(mContext,"放开SeekBar",Toast.LENGTH_SHORT).show();

}

});

}

}


2.简单SeekBar定制:

本来还想着自定义下SeekBar的,后来想想,还是算了,涉及到自定义View的一些东西,可能初学者并不了解,看起来也有点难度,关于自定义View的还是放到进阶那里吧,所以这里就只是简单的定制下SeekBar!定制的内容包括滑块,以及轨道!
代码实例:

运行效果图:

代码实现:1.滑块状态Drawable:sb_thumb.xml

<?xmlversion="1.0"encoding="utf-8"?>

<selectorxmlns:android="http://schemas.android.com/apk/res/android">

<itemandroid:state_pressed="true"android:drawable="@mipmap/seekbar_thumb_pressed"/>

<itemandroid:state_pressed="false"android:drawable="@mipmap/seekbar_thumb_normal"/>

</selector>



贴下素材:

2.条形栏Bar的Drawable:sb_bar.xml

这里用到一个layer-list的drawable资源!其实就是层叠图片,依次是:背景,二级进度条,当前进度:

<?xmlversion="1.0"encoding="utf-8"?>

<layer-list

xmlns:android="http://schemas.android.com/apk/res/android">

<itemandroid:id="@android:id/background">

<shape>

<solidandroid:color="#FFFFD042"/>

</shape>

</item>

<itemandroid:id="@android:id/secondaryProgress">

<clip>

<shape>

<solidandroid:color="#FFFFFFFF"/>

</shape>

</clip>

</item>

<itemandroid:id="@android:id/progress">

<clip>

<shape>

<solidandroid:color="#FF96E85D"/>

</shape>

</clip>

</item>

</layer-list>


3.然后布局引入SeekBar后,设置下progressDrawable与thumb即可!

<SeekBar

android:id="@+id/sb_normal"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:maxHeight="5.0dp"

android:minHeight="5.0dp"

android:progressDrawable="@drawable/sb_bar"

android:thumb="@drawable/sb_thumb"/>


就是这么简单!

本节小结:

好的,关于SeekBar就到这里,谢谢大家~

2.3.9RatingBar(星级评分条)

分类Android
基础入门教程

本节引言:

上一节的SeekBar是不是很轻松咧,本节我们学的这个RatingBar(星级评分条)也非常简单,相信在某宝,买过东西的对这个应该不陌生,收到卖家的包裹,里面很多时候会有个小纸片,五星好评返还多少元这样,而评分的时候就可以用到我们这个星级评分条了~先来瞅瞅官方文档官方文档:RatingBar我们可以看到,这玩意和SeekBar的类结构是一样的,也是ProgressBar的子类:
也就是说他同样有用ProgressBar的相关属性,接下来我们来探究RatingBar特有的属性!

1.RatingBar基本使用:

先来看看5.0的原生SeekBar长什么样:

——相关属性:

android:isIndicator:是否用作指示,用户无法更改,默认false

android:numStars:显示多少个星星,必须为整数

android:rating:默认评分值,必须为浮点数

android:stepSize评分每次增加的值,必须为浮点数

除了上面这些,还有两种样式供我们选择咧,但是不建议使用,因为这两种样式都好丑...
他们分别是:

style="?android:attr/ratingBarStyleSmall"

style="?android:attr/ratingBarStyleIndicator"

——事件处理:只需为RatingBar设置OnRatingBarChangeListener事件,然后重写下onRatingChanged()方法即可!

实现代码如下:

publicclassMainActivityextendsAppCompatActivity{

privateRatingBarrb_normal;

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

rb_normal=(RatingBar)findViewById(R.id.rb_normal);

rb_normal.setOnRatingBarChangeListener(newRatingBar.OnRatingBarChangeListener(){

@Override

publicvoidonRatingChanged(RatingBarratingBar,floatrating,booleanfromUser){

Toast.makeText(MainActivity.this,"rating:"+String.valueOf(rating),

Toast.LENGTH_LONG).show();

}

});

}

}


2.定制环节:

嘿嘿,我们很多时候不会用星星作为评分标准的,我们来改改呗~
把星星改成其他的,比如笑脸,两个素材:

接下来和前面的SeekBar一样编写一个layer-list的文件:

ratingbar_full.xml:

<?xmlversion="1.0"encoding="utf-8"?>

<layer-listxmlns:android="http://schemas.android.com/apk/res/android">

<itemandroid:id="@android:id/background"

android:drawable="@mipmap/ic_rating_off1"/>

<itemandroid:id="@android:id/secondaryProgress"

android:drawable="@mipmap/ic_rating_off1"/>

<itemandroid:id="@android:id/progress"

android:drawable="@mipmap/ic_rating_on1"/>

</layer-list>


接着在style.xml中自定义下RatingBarStyle,在style.xml加上这个:

<stylename="roomRatingBar"parent="@android:style/Widget.RatingBar">

<itemname="android:progressDrawable">@drawable/ratingbar_full</item>

<itemname="android:minHeight">24dip</item>

<itemname="android:maxHeight">24dip</item>

</style>


最后在布局中的Ratingbar组件设置下:

<RatingBar

android:id="@+id/rb_normal"

style="@style/roomRatingBar"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>


运行效果图:

好的,效果还可以哈,至于间距问题,就需要对图片坐下处理了,就是需要切图的时候在图片左右预留点空格~!

本节小结:

好的,关于RatingBar的使用就到这里,和前面的SeekBar其实大同小异,蛮轻松的~嗯,谢谢~

2.4.1ScrollView(滚动条)

分类Android
基础入门教程

本节引言:

本节带来的是Android基本UI控件中的第十个:ScrollView(滚动条),或者我们应该叫他竖直滚动条,对应的另外一个水平方向上的滚动条:HorizontalScrollView,先来一发官方文档的链接:ScrollView,我们可以看到类的结构如下:
嘿嘿,原来是一个FrameLayout的容器,不过在他的基础上添加了滚动,允许显示的比实际多的内容!
另外,只能够往里面放置一个子元素,可以是单一的组件,又或者一个布局包裹着的复杂的层次结构!
一般对于可能显示不完的情况,我们可以直接在布局的外层套上一个:ScrollView或者HorizontalScrollView!就这么简单~!

可能遇到的一些需求

好的,就不一个个扣文档了,直接说实际开发中可能会遇到的一些需求吧:

另外有一个很典型的问题就是:ScrollView和ListView的嵌套问题,这个放到ListView那一章节再来讲解~

1.滚动到底部:

我们可以直接利用ScrollView给我们提供的:fullScroll()方法
scrollView.fullScroll(ScrollView.FOCUS_DOWN);滚动到底部
scrollView.fullScroll(ScrollView.FOCUS_UP);滚动到顶部
另外用这玩意的时候要小心异步的玩意,就是addView后,有可能还没有显示完,如果这个时候直接调用该方法的话,可能会无效,这就需要自己写handler来更新了~
代码示例:

效果图:

实现代码:

布局比较简单,就不贴了,直接贴MainActivityMainActivity.java

publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{


privateButtonbtn_down;

privateButtonbtn_up;

privateScrollViewscrollView;

privateTextViewtxt_show;


@Override

publicvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

bindViews();

}



privatevoidbindViews(){

btn_down=(Button)findViewById(R.id.btn_down);

btn_up=(Button)findViewById(R.id.btn_up);

scrollView=(ScrollView)findViewById(R.id.scrollView);

txt_show=(TextView)findViewById(R.id.txt_show);

btn_down.setOnClickListener(this);

btn_up.setOnClickListener(this);


StringBuildersb=newStringBuilder();

for(inti=1;i<=100;i++){

sb.append("呵呵*"+i+"\n");

}

txt_show.setText(sb.toString());


}


@Override

publicvoidonClick(Viewv){

switch(v.getId()){

caseR.id.btn_down:

scrollView.fullScroll(ScrollView.FOCUS_DOWN);

break;

caseR.id.btn_up:

scrollView.fullScroll(ScrollView.FOCUS_UP);

break;

}

}

}


当然除了这种方法还,你还可以使用另一种复杂一点的写法:

publicstaticvoidscrollToBottom(finalViewscroll,finalViewinner){

HandlermHandler=newHandler();

mHandler.post(newRunnable(){

publicvoidrun(){

if(scroll==null||inner==null){

return;

}

intoffset=inner.getMeasuredHeight()-scroll.getHeight();

if(offset<0){

offset=0;

}

scroll.scrollTo(0,offset);

}

});

}


scrollTo()参数依次为x,y滚到对应的x,y位置!

2.设置滚动的滑块图片

这个更加简单:垂直方向滑块:android:scrollbarThumbVertical

水平方向滑块:android:scrollbarThumbHorizontal

3.隐藏滑块

好吧,这个好像没什么卵用:

方法有两种:1.android:scrollbars="none"

2.Java代码设置:scrollview.setVerticalScrollBarEnabled(false);

4.设置滚动速度:

这个并没有给我们提供可以直接设置的方法,我们需要自己继承ScrollView,然后重写一个publicvoidfling(intvelocityY)的方法:

@Override

publicvoidfling(intvelocityY){

super.fling(velocityY/2);//速度变为原来的一半

}


本节小结:

好的,能想到的ScrollView的东西就这么多,因为平时这个用得并不多,一般直接套在外面而已,另外,问题最多的一般是ScrollView和ListView的嵌套问题~如果有什么补充欢迎提出,谢谢

2.4.2Date&Time组件(上)
分类Android
基础入门教程

本节引言:
本节给大家带来的是Android给我们提供的显示时间的几个控件,他们分别是:TextClock,AnalogClock,Chronometer,另外其实还有个过时的DigitalClock就不讲解了!好的,开始本节内容!

1.TextClock(文本时钟)
TextClock是在Android4.2(API17)后推出的用来替代DigitalClock的一个控件!

TextClock可以以字符串格式显示当前的日期和时间,因此推荐在Android4.2以后使用TextClock。

这个控件推荐在24进制的android系统中使用,TextClock提供了两种不同的格式,一种是在24进制中显示时间和日期,另一种是在12进制中显示时间和日期。大部分人喜欢默认的设置。
可以通过调用:TextClock提供的is24HourModeEnabled()方法来查看,系统是否在使用24进制时间显示!
在24进制模式中:
·如果没获取时间,首先通过getFormat24Hour()返回值;
·获取失败则通过getFormat12Hour()获取返回值;
·以上都获取失败则使用默认;
另外他给我们提供了下面这些方法,对应的还有get方法:
AttributeName
RelatedMethod
Description
android:format12Hour
setFormat12Hour(CharSequence)
设置12时制的格式
android:format24Hour
setFormat24Hour(CharSequence)
设置24时制的格式
android:timeZone
setTimeZone(String)
设置时区
其实更多的时间我们是花在时间形式定义上,就是里面这个CharSequence!这里提供下常用的写法以及结果:

<TextClock
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:format12Hour="MM/dd/yyh:mmaa"/>
<TextClock
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:format12Hour="MMMdd,yyyyh:mmaa"/>
<TextClock
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:format12Hour="MMMMdd,yyyyh:mmaa"/>
<TextClock
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:format12Hour="E,MMMMdd,yyyyh:mmaa"/>
<TextClock
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:format12Hour="EEEE,MMMMdd,yyyyh:mmaa"/>
<TextClock
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:format12Hour="Noteworthyday:'M/d/yy"/>

运行结果:
PS:另外minsdk
要大于或者等于17哦!

2.AnalogClock(模拟时钟)
就是下图这种:
官网中我们可以看到这样三个属性:
依次是:表背景,表时针,分时针的图片,我们可以自行定制:
示例代码如下:

<AnalogClock
android:layout_width="100dp"
android:layout_height="100dp"
android:dial="@mipmap/ic_c_bg"
android:hand_hour="@mipmap/zhen_shi"
android:hand_minute="@mipmap/zhen_fen"
/>

运行结果:

3.Chronometer(计时器)
如题,就是一个简单的计时器,我们直接上使用示例吧:
使用示例:
实现代码:
布局代码:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<Chronometer
android:id="@+id/chronometer"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="#ff0000"
android:textSize="60dip"
/>

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="10dip"
android:orientation="horizontal">

<Button
android:id="@+id/btnStart"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="开始记时"
/>

<Button
android:id="@+id/btnStop"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="停止记时"
/>

<Button
android:id="@+id/btnReset"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="重置"
/>

<Button
android:id="@+id/btn_format"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="格式化"
/>
</LinearLayout>

</LinearLayout>

MainActivity.java

public
classMainActivity
extendsAppCompatActivity
implementsView.OnClickListener,Chronometer.OnChronometerTickListener{

private
Chronometerchronometer;
private
Buttonbtn_start,btn_stop,btn_base,btn_format;

@Override
protected
voidonCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}

private
voidinitView()
{
chronometer=
(Chronometer)findViewById(R.id.chronometer);
btn_start=
(Button)findViewById(R.id.btnStart);
btn_stop=
(Button)findViewById(R.id.btnStop);
btn_base=
(Button)findViewById(R.id.btnReset);
btn_format=
(Button)findViewById(R.id.btn_format);

chronometer.setOnChronometerTickListener(this);
btn_start.setOnClickListener(this);
btn_stop.setOnClickListener(this);
btn_base.setOnClickListener(this);
btn_format.setOnClickListener(this);

}

@Override
public
voidonClick(Viewv)
{
switch
(v.getId()){
caseR.id.btnStart:
chronometer.start();//
开始计时
break;
caseR.id.btnStop:
chronometer.stop();//
停止计时
break;
caseR.id.btnReset:
chronometer.setBase(SystemClock.elapsedRealtime());//
复位
break;
caseR.id.btn_format:
chronometer.setFormat("Time:%s");//
更改时间显示格式
break;
}
}

@Override
public
voidonChronometerTick(Chronometerchronometer)
{
Stringtime
=chronometer.getText().toString();
if(time.equals("00:00")){
Toast.makeText(MainActivity.this,"时间到了~",Toast.LENGTH_SHORT).show();
}
}
}

运行截图:

本节小结:
本节跟大家简单的介绍了TextClock,AnalogClock,Chronometer这三个组件,从篇幅就可以看出其实这几个东西用得并不多,几乎是没用过...知道下就好,用法也超简单...
就这样吧,本节就到这里~谢谢
2.4.4Adapter基础讲解
分类Android
基础入门教程

本节引言
从本节开始我们要讲的UI控件都是跟Adapter(适配器)打交道的,了解并学会使用这个Adapter很重要,
Adapter是用来帮助填充数据的中间桥梁,简单点说就是:将各种数据以合适的形式显示到view上,提供给用户看!

1.MVC模式的简单理解
在开始学习Adapter之前我们要来了解下这个MVC模式概念:举个例子:大型的商业程序通常由多人一同开发完成,比如有人负责操作接口的规划与设计,
有人负责程序代码的编写如果要能够做到程序项目的分工就必须在程序的结构上做适合的安排,如果,接口设计与修改都涉及到程序代码的改变的话,那么两者的分工就会造成执行上的困难良好的程序架构师将整个程序项目划分为如图的三个部分:
关系图解析:
·Model:通常可以理解为数据,负责执行程序的核心运算与判断逻辑,,通过view获得用户输入的数据,然后根据从数据库查询相关的信息,最后进行运算和判断,再将得到的结果交给view来显示
·view:用户的操作接口,说白了就是GUI,应该使用哪种接口组件,组件间的排列位置与顺序都需要设计
·Controller:控制器,作为model与view之间的枢纽,负责控制程序的执行流程以及对象之间的一个互动
而这个Adapter则是中间的这个Controller的部分:Model(数据)
--->Controller(以什么方式显示到)--->View(用户界面)
这就是简单MVC组件的简单理解!

2.Adapter概念解析
官方文档:Adapter
首先我们来看看他的继承结构图:
上面就是Adapter以及继承结构图了,接着我们介绍一下实际开发中还用到的几个Adapter吧!
·BaseAdapter:抽象类,实际开发中我们会继承这个类并且重写相关方法,用得最多的一个Adapter!
·ArrayAdapter:支持泛型操作,最简单的一个Adapter,只能展现一行文字~
·SimpleAdapter:同样具有良好扩展性的一个Adapter,可以自定义多种效果!
·SimpleCursorAdapter:用于显示简单文本类型的listView,一般在数据库那里会用到,不过有点过时,不推荐使用!
其实一个BaseAdapter就够玩的了,至于其他的,实际开发中用得不多,后面用到在讲解~

3.代码示例:
好的,多说无益,写代码最实际,接下来我们来用写几个简单的Adapter实例,帮助我们了解Adapter给我们带来的便利,另外,因为Adapter需要结合ListView,
GridView等等控件讲解,一些高级一点的用法我们都放在ListView那里讲!这里就简单演示下效果,另外这里用到的控件是ListView,下一节就会讲解,现在看不懂也没关系!

1)ArrayAdapter使用示例:
运行效果图:
代码实现:

public
classMainActivity
extendsAppCompatActivity
{

@Override
protected
voidonCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//要显示的数据
String[]strs
={"基神","B神","翔神","曹神","J神"};
//创建ArrayAdapter
ArrayAdapter<String>adapter
=new
ArrayAdapter<String>
(this,android.R.layout.simple_expandable_list_item_1,strs);
//获取ListView对象,通过调用setAdapter方法为ListView设置Adapter设置适配器
ListViewlist_test
=(ListView)findViewById(R.id.list_test);
list_test.setAdapter(adapter);
}
}

一些相关的东西:
1.除了通过数组外,我们还可以写到一个数组资源文件中:
比如:在res\valuse下创建一个数组资源的xml文件:arrays.xml

<?xmlversion="1.0"encoding="utf-8"?>

<resources>
<string-array
name="myarray">

<item>语文</item>

<item>数学</item>

<item>英语</item>

</string-array>
</resources>

接着布局的listview属性设置下这个列表项:

<ListView
android:id="@id/list_test"

android:layout_height="match_parent"

android:layout_width="match_parent"

android:entries="@array/myarray"/>

就可以了~
当然我们也可以在Java代码中这样写:

ArrayAdapter<CharSequence>adapter
=ArrayAdapter.createFromResource(this,
R.array.myarray,android.R.layout.simple_list_item_multiple_choice);

同样也是可以的!
2.一开始也说了这个ArrayAdapter支持泛型,那么集合必不可少啦,比如,这样写:

List<String>data
=new
ArrayList<String>();
data.add("基神");
data.add("B神");
ArrayAdapter<String>adapter
=new
ArrayAdapter<String>
(this,android.R.layout.simple_expandable_list_item_1,data);

就可以了~
3.我们看到了在实例化ArrayAdapter的第二个参数:android.R.layout.simple_expandable_list_item_1其实这些是系统给我们提供好的一些ListView模板,有下面几种:
simple_list_item_1:
单独一行的文本框simple_list_item_2:
两个文本框组成simple_list_item_checked:
每项都是由一个已选中的列表项simple_list_item_multiple_choice:
都带有一个复选框simple_list_item_single_choice:
都带有一个单选钮

2)SimpleAdapter使用示例:
SimpleAdapter:简单的Adapter,看似简单,功能强大,下面我们来写个稍微复杂一点的列表布局吧!
运行效果图:
代码实现:
先来编写一个列表项目每一项的布局:
list_item.xml

<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">

<!--定义一个用于显示头像的ImageView-->
<ImageView
android:id="@+id/imgtou"
android:layout_width="64dp"
android:layout_height="64dp"
android:baselineAlignBottom="true"
android:paddingLeft="8dp"
/>

<!--定义一个竖直方向的LinearLayout,把QQ呢称与说说的文本框设置出来
-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="8dp"
android:textColor="#1D1D1C"
android:textSize="20sp"
/>

<TextView
android:id="@+id/says"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="8px"
android:textColor="#B4B4B9"
android:textSize="14sp"
/>

</LinearLayout>

</LinearLayout>

接下来是MainActivity.java:

public
classMainActivity
extendsAppCompatActivity
{

private
String[]names
=newString[]{"B神",
"基神",
"曹神"};
private
String[]says
=newString[]{"无形被黑,最为致命",
"大神好厉害~",
"我将带头日狗~"};
private
int[]imgIds
=newint[]{R.mipmap.head_icon1,R.mipmap.head_icon2,
R.mipmap.head_icon3};

@Override
protected
voidonCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

List<Map<String,
Object>>listitem
=new
ArrayList<Map<String,
Object>>();
for
(inti=
0;i
<names.length;i++)
{
Map<String,
Object>showitem
=new
HashMap<String,
Object>();
showitem.put("touxiang",imgIds[i]);
showitem.put("name",names[i]);
showitem.put("says",says[i]);
listitem.add(showitem);
}

//创建一个simpleAdapter
SimpleAdaptermyAdapter
=new
SimpleAdapter(getApplicationContext(),listitem,R.layout.list_item,
newString[]{"touxiang",
"name",
"says"},new
int[]{R.id.imgtou,R.id.name,
R.id.says});
ListViewlistView
=(ListView)findViewById(R.id.list_test);
listView.setAdapter(myAdapter);
}
}

好的,上面就是SimpleAdapter的简单用法了,有点意思~

3)SimpleCursorAdapter使用示例:
虽然这东西过时了,不过对于不怎么会SQLite的初学者来说,用起来还是蛮方便的!记得前面我们学ContentProivder写过的读取联系人的例子么?之前是通过打印Log的方式显示出来,现在我们通过这个SimpleCursorAdapter把它显示到ListView上!
实现效果图
代码实现
先写下listView每个item的布局:
list_item.xml:

<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">

<TextView
android:id="@+id/list_name"
android:layout_width="0dp"
android:layout_height="64dp"
android:layout_weight="1"
android:gravity="center"
android:text="小猪"
android:textColor="#0000FF"
android:textSize="18sp"
/>

<TextView
android:id="@+id/list_phone"
android:layout_width="0dp"
android:layout_height="64dp"
android:layout_weight="1"
android:gravity="center"
android:text="13798989898"
android:textColor="#EA5C4D"
android:textSize="18sp"
/>

</LinearLayout>

接着activity_main布局和前面的一样,就是简单的ListView,然后是
MainActivity.java:

public
classMainActivity
extendsAppCompatActivity
{

@Override
protected
voidonCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListViewlist_test
=(ListView)findViewById(R.id.list_test);
//读取联系人
Cursorcursor
=getContentResolver()
.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
null,null,
null);
SimpleCursorAdapterspcAdapter
=new
SimpleCursorAdapter(this,R.layout.list_item,cursor,
new
String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER},
new
int[]{R.id.list_name,R.id.list_phone});
list_test.setAdapter(spcAdapter);
}
}

最后AndroidManifest.xml里加个读联系人的权限就可以了!

<uses-permission
android:name="android.permission.READ_CONTACTS"/>

一问一答:
:就这么简单?

——:是的,直接获取到Cursor,然后绑定就好了,无需你自己再写什么SQL语句!

:你说这东西过时了,那拿什么来代替?

——:一般的做法是自己重写BaseAdapter,获取到数据集合后跟对应的控件进行绑定!

:这个SimpleCursorAdapter还有没有要注意的地方?

——:有,使用SimpleCursorAdapter的话,绑定的数据库表中一定要有id这个字段,
或者asid;而且在绑定时取出的数据必须包含这个id项,否则的话会报以下错误!java.lang.IllegalArgumentException:column
'
id'doesnotexist**

本节小结:
好的,关于Adapter的基础讲解就到这里,当然我们这里讲解的三个Adapter,我们实际开发中...
基本上用不到,哈哈,除了SimpleAdapter偶尔可能会用下,一般我们都是重写BaseAdapter的!

另外,关于BaseAdapter的,有很多东西要讲解,就把他丢到ListView那里一起讲,毕竟Adapter
总是和View沾边,而且ListView是我们用得最多的一个空间~嗯,本节就到这里,谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: