分类目录归档:大话Android应用开发

Android Studio 第6节 使用第三方java库

更新时间 修改意见
2016-08-02 陈敏

第6节 使用第三方java库

在程序开发的过程中,我们经常会使用到第三方提供的库文件,借助它们完成程序的功能。这些库文件就像是一个一个车轮,我们没有必要自己去又去造一遍车轮,既然有现成的,拿过来直接使用就好了。

6.1 直接使用第三方库的jar包

  1. 首先将第三方java库准备好,放到电脑本地的磁盘上;
  2. 将下载的java库文件(例如一个叫做arity-2.1.2.jar的java包)复制到项目工程所在的工程名\app\libs目录下,如果这个目录不存在,就自己创建一个;
  3. 在Android Studio左边的项目浏览区,选择Project视图;
  4. app->libs->arity-2.1.2,jar上点击右键,选择Add as Library...
  5. 在弹出的选择框中,点击OK

至此一个第三方提供的java库,就成功添加到项目工程了。

上面的操作实质上是在项目工程的app\build.grandle文件中加入了编译依赖,

6.2 不手动下载第三方库的jar包

Android Studio支持一种非常方便的第三方库依赖方式。例如要添加一个第三方的http访问库android-async-http。

  1. 编辑app\build.grandle文件,其中加入编译依赖,

  2. 一旦该文件被修改,在编辑窗口的右上角,会出现Sync Now的按钮,点击 重新刷新一下工程就完成了。

用这种方式添加第三方库,需要知道库的引用名字。这些库可以在jCenter的官方网站查找。通过官网提供的搜索引擎寻找你需要的第三方库,然后添加到项目工程的配置文件当中就可以了。


其中的原理大概是这样的:

Android Studio拥有一个强大的插件工具,帮助开发者直接使用发布到网络上的第三方库。这种库大致来自两个渠道:jCenterMarven Central

开发者在这两个地方注册,把希望分享给大众使用的第三方库,传到这里,通过网站审核就可以了正式发布了。

Android Studio默认选择了jCenter作为第三方库的供应者,所以我们需要寻找合适的第三方库的时候,可以优先去jCenter找。也可以将Android Studio的库查找源修改成Marven Central。不过这里我们就不介绍了。


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/

Android Studio 第5节 Android Device Monitor

更新时间 修改意见
2016-08-02 陈敏

第5节 Android Device Monitor

Android Studio的ADM是我们动态调试程序时重要的帮手。通过它我们可以查看程序输出的log,可以查看系统内存的占用情况,可以看到系统CPU的运行情况。

5.1 Logcat功能

Logcat用来查看程序输出的log。我们可以选择log的类型(v d i w e)来过滤log。

每一条log由时间戳,应用包名,log类型,TAG和 内容组成:

有时候log太多,会影响我们的判断,可以自定义过滤器
首先,选择编辑过滤器,

然后输入想要过滤的内容,

之后logcat获取的log就只有匹配设置的log了。
还有一个非常有用的功能是重启ADB。ADB有时候会因为种种原因而无法与设备相连,这时候通过下图的按钮重启ADB就能解决问题。

5.2 其它工具

ADM还提供了设备截屏,设备录像等功能。
设备截屏能将设备上正在显示的内容以截取图片或视频的形式保存到电脑上。

关于调试,Android Studio还提供了内存监控工具,CPU监控工具,以及Hierarchy Viewer等其它工具。我们将在各位有了更多的知识储备后,做专题介绍。


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/

Android Studio 第4节 调试初步

更新时间 修改意见
2016-08-02 陈敏

第4节 调试初步

Android Studio提供了部署应用到设备上运行的方法和不少方便的调试工具。这里我们先介绍几个最为简单常用的方法。

4.1 部署应用

将应用程序通过Android Studio运行到设备上有两个方式:“run app”和“debug app”。

“debug app”模式下,程序运行起来之后可以直接进入断点调试模式,对代码进行静态调试;而“run app”只能通过“attach”的方式进入断点调试模式。这两种方式可以通过菜单项启动,也可以通过快捷键开始,由于经常使用,我们最好熟练的使用快捷键方式。能否熟练的使用快捷键也是区分的高手与新手的重要指标。

4.2 静态调试方法

静态调试就是冻结应用运行的状态,仿佛时间停止了一般,然后我们逐一观察此时程序的各个参数是否符合我们的预期。
首先,在希望代码暂停运行的地方打断点——在代码前点击一下,出现一个红色的圆点,如果想取消,再点击一次即可。

然后,用debug run的方式部署程序。
当程序运行到这段代码的这个位置时,程序将停止下来,切换到“Debug”窗口。这时,我们就可以观察各个参数了。

例如上图右半区域就列出了停止时,各个变量的值;左边区域展示了当时函数到调用栈(谁调用的这个函数)情况。我们可以逐一分析,详细观察,看这些值是否符合我们的预期。
尝试下面的功能,看看程序运行的走向是如何进行的:

这些都是断点调试经常使用到的、由我们控制程序运行步骤的功能,所以尽量记住它们对应的快捷方式。

4.3 动态调试方法

对于那些和时间相关的程序(不能让程序暂停,等你慢慢观察),我们就不能使用静态调试方法了,得采用动态调试,添加log的方式。
Log的中文名字叫做日志,在编程界表示程序运行过程中打印出的信息。根据log我们就知道现在程序运行到什么地方了,log还可以携带程序中某些变量的信息输出,让我们更精准的知道程序当前运行的状态。在代码中添加一段函数,就能通过特别的工具输出这些log。
在Android代码中添加log的方式如下图:

红色区域表示我们要添加的代码。这里面使用了Android提供的Log库。
Android应用开发的Log库提供了几种不同等级的log:verbose debug info warning error,我们可以根据自己log的需要加不同等级的log,使用的形势为:

X代表v d I w e,例子中我们用的w,我们在应用中调试程序,通常就使用d。
Log输出的结果是我们通过ADB工具,在电脑端观察到的。在Android Studio中,就是通过Android Device Monitor观察到的(实际上ADM也是利用ADB工具实现的观察)。


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/

Android Studio 第3节 编辑工具

更新时间 修改意见
2016-08-02 陈敏

第3节 编辑工具

3.1 代码编辑

通过Project浏览器,双击打开任意的java文件,代码编辑器会对里面的代码做高亮处理,让开发者容易的看到哪些是语法关键字,哪些是变量,哪些是函数名。当输入代码的时候,还会自动提示出开发者可能最想使用的代码内容。非常的方便。

##3.2 UI所见即所得
通过Project浏览器,双击打开res目录下的layout子目录中的任意布局文件(xxx.xml),会出现对应的设备上的预览效果。
当选择不同的预览设备时,预览界面会根据不同的设备做相应的变化。这个功能在做多尺寸设备的界面布局设计时非常有用。


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/

Android Studio 第2节 工程目录

更新时间 修改意见
2016-08-02 陈敏

第2节 工程目录

2.1 工程结构的不同视图

浏览当前的项目工程是最经常遇到的,当选择“Project”浏览方式的时候,它就像资源管理器的树形结构展开。所以当你希望看看磁盘上实实在在存在的关于这个项目的文件夹和目录的时候,就可以使用Projcect浏览方式

其它浏览方式也很多,

它会从不同的角度来展示一个工程的方方面面。大家可以切换看看,不同的效果。我们刚开始接触就使用“Project”浏览方式吧,它和项目的文件目录结构很相似。随着经验的增加,会逐步发现其他浏览模式的方便之处。

2.2 目录结构介绍

在“Project”浏览方式下,我们目前只关注以下几个文件和文件夹:

  1. app文件夹:这是工程产生后,Android Studio自动创建的module所在文件夹。Module是Android Studio工程中的一个功能单位。我们应用程序的源码和资源文件就放在这个module当中。目前来说,我们需要使用到并修改到的内容,都在这个文件夹里面。其它的可以暂时不管。

  2. build.grandle文件:这是module编译时的配置文件,样子大概如下图。

    现在我们只介绍“defaultConfig”选项中的参数:

    minSdkVersion——这个应用允许安装的最低API Level,例如这里写的21,说明这个应用只能安装到21和21版本以上的安卓设备上(即Android5.0 Android6.0),其它的安卓设备(例如Android4.X)都不行。

    targetSdkVersion——这个应用的理想运行系统版本。例如targetSDKVersion指明这个应用使用的是23的SDK,那么说明该应用运行的理想系统版本是Andriod6.0,当在理想系统上运行该应用的时候,会省略软件的兼容性判断,提高程序的运行效率。

    versionName——版本号,这个号码可以通过查看该应用在设备上的详细信息获取(通常在设备的“设置”->“应用管理”中)。

    至于里面的配置参数我们在今后使用到的时候再介绍,通常情况下,不需要做额外的修改了。大家可以通过图中的关键词,猜一猜这些字段是做什么用的。

  3. src文件夹里面有三个子文件夹:androidTest、test和main。androidTest和test从名字就知道,里面放的是和测试我们程序相关的内容。目前我们将重点放到介绍开发上,测试的内容以后再讲。

    main文件夹分了java和res两支,java存放的是java源代码,res存放的是资源文件。注意main文件夹下面的AndroidManifest.xml文件是当前Android应用自己的配置文件,我们将在开发过程当中重点详细的介绍。


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/

Android Studio 第1节 概述

更新时间 修改意见
2016-08-02 陈敏

第1节 概述

1.1 Android Studio介绍

Android studio是Google为Android应用开发提供的一个强大的集成开发环境(IDE),有着非常多的帮助开发者进行开发的工具。虽然Android应用也可以使用Eclipse开发,但是Android Studio将是Google未来唯一长期支持的开发工具。
Android Studio启动并打开工程后它的默认布局大体如下:

这些布局并不是一成不变的,我们可以通过拖动它们,调整它们的位置和大小,可以隐藏一些区域,在需要这些区域的时候再显示它们。


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/

布局与控件 第10节 ListView的Adapter

更新时间 修改意见
2016-08-02 陈敏

第10节 ListView的Adapter

安卓系统为ListView设计了多种Adapter作为它的搭档。每种Adapter不仅为ListView提供数据内容,也会告诉ListView如何展示这些数据-规定好列表项的长相。

这些Adapter都是从Adapter类继承而来的,它们的关系如下:

这里我们选择性的介绍常见的2种AdapterArrayAdapterSimpleAdapter

10.1 ArrayAdapter

ArrayAdapter是最简单的Adapter,我们在前面已经使用过它,

在创建ArrayAdapter的时候,

  1. 要声明这个Adapter要接受什么类型的数据,

  2. 指定布局文件的layout id

    这个布局就是一个TextView,只不过被指定了android:id@android:id/text1

    注意这里在给控件指定ID的时候用的是`@id/text1,而没有用+。这表明,这个ID值是已经存在的,而不需要编译器再单独分配。

    这样ArrayAdapter会自动寻找这个布局文件中ID名字为text1的控件,并认为它就是可以用来显示数据的TextView

    如果不想用系统给TextView指定的ID,也可以给自己定义的布局的TextView取个名字,例如show_content_textview

    然后向ArrayAdapter再传入一个ID,告诉它将要显示的文字,放到这个ID所指示的控件上,

  3. 传入要显示的数据内容,这个数据内容可以以数组的方式传入,也可以以List的方式放入,

10.2 SimpleAdapter

看得出ArrayAdapter是相当的简单,只能在单一的TextView上显示一条数据。如果有好几条不同类型的数据要显示到同一列表项的不同部位,那就不好办了。SimpleAdapter正好能帮我们解决这样的问题。虽然它叫Simple,不过不是说功能simple,而是使用很simple。

它的设计思路是,

  1. 每一条列表项上哪些控件希望显示数据都要告诉SimpleAdaperSimpleAdaper只要知道这些控件的ID就可以了。所以在创建的时候,需要传入这些控件的ID值(以数组的形式);

  2. 每一项待显示的数据,要和列表上的控件一一对应。这就需要一个翻译系统,给每个位置的数据取个名字,将待显示数据挨个放入键值对的列表中(map);并将每个位置的数据名字和控件ID值对应起来;

  3. SimpleAdapter在绑定数据到界面上的时候,就根据对应关系,一个一个把它们放上去。

例如,

  1. 准备要显示的数据,让每个数据项,和一个特定的名字(title pic content)对应上,

  2. 将特定的名称做成数组,和显示区域的ID一一对应上,例如,

    title <-> R.id.title_id
    pic <-> R.id.pic_id
    content <-> R.id.content_id

  3. 创建SimpleAdapter

10.3 自定义Adapter

虽然Android SDK为我们提供了好几种现成的Adapter使用,但有时它们也并不能完全符合我们的要求,要么用起来还是麻烦,要么大材小用。另外,为了把ListView介绍的全面一些,我们准备自定义一个Adapter。

10.3.1 定义数据项的布局

为了让列表的数据项按照我们设计的模样显示,我们需要为它设计一个布局,用展示的视频列表为例,加以说明。

数据项的布局定义在res\layout\video_item.xml文件中,

  1. 数据项显示在水平布局的LinearLayout中;
  2. 视频缩略图用ImageView控件显示,给它的android:scaleType属性设置center,让缩略图居中放置,背景设置成应用主题的色调colorPrimary
  3. 其他视频信息包含标题和创建时间,将它们竖直排列放在一个LinearLayout中,占用高度按照2:1分配,前者使用主题中较大的字体?android:attr/textAppearanceMedium,后者使用主题中较小的字体?android:attr/textAppearanceSmall
  4. 至于各个组件之间的间隔,根据自己的视觉偏好调整就好了,用android:paddingandroid:layout_margin设置;

10.3.2 定义数据项内容

为每个视频信息,定义一个数据结构VideoItem

10.3.3 定义Adapter

所有Adapter都是继承自BaseAdapter的,我们自定义的Adapter也继承自它。

  1. 继承BaseAdapter,准备实现必须实现的基类函数;

  2. 创建构造函数,在构造函数中,保存好布局ID,以便以后使用,通过Context获取Inflater,为以后数据项布局的创建做准备;保存要展示的数据项们;

  3. 实现getCount()函数,返回当前数据项的个数,

  4. 实现getItem()函数,根据传入的索引号,返回对应的数据项,

  5. 实现getItemId()函数,根据传入的索引号,返回对应项的id值,

  6. getView()函数中,创建数据项的布局,并为他们赋值,最后将这个布局返回给ListView,让它显示,

    这里的convertView就是数据项所代表的那个布局,当ListView刚创建,还没有产生任何数据项的时候,它就是为null的,此时我们就需要创建一个布局,并通过getView()将这个布局返回给ListView

    假如ListView上的数据项布局已经足够了,那么这里传入的convertView就不会再是“null”,而是之前的某个数据项布局,我们就不必为此重新创建了,只需要更新上面的内容就好。这样提高了界面刷新的效率。

    当然,这里还能通过其他方法减少使用findViewById(),进一步提高效率,不过目前就不改进了,先把功能实现完成。


综合以上内容,最后的代码就是,

10.3.4 使用自定义Adapter

  1. 在Video List的Activity创建之时,我们在onCreate()中创建并设置VideoAdapter

  2. 当列表中的数据有变化时,在主线程中更新数据列表,并使用notifyDataSetChanged()刷新,

10.3.5 改进提高效率

在前面实现自定义Adapter的getView()函数中,没有每次都创建一个convertView,而是复用已有的布局,这样就节省重新创建的资源。不过每次都使用findViewById()也会花掉不少的开销。

为此,我们可以引入一个数据结构,将这些控件保存下来,在使用的时候直接获取,不需要进行耗时的findViewById()操作了。

  1. 创建一个数据类,准备存放控件,

  2. 创建布局的时候,通过创建Holder将控件保存起来,

  3. 获取Holder,直接使用,提高效率,


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/

布局与控件 第9节 ListView

更新时间 修改意见
2016-08-02 陈敏

第9节 ListView

在应用界面当中,经常需要使用列表来展示内容。
Android SDK提供了ListView控件,来实现这种效果。

ListView需要和Adapter配合使用,ListView负责内容的显示,Adapter负责为ListView提供要展示的数据。

列表的设计采用了将数据与展示分离的模式-数视分离。ListView负责数据的展现,Adapter负责向ListView提供要展示的数据,以及每条列表上的数据如何显示。

这是程序设计中常常用到的一种设计方法。这一章节我们主要介绍ListView,而它的搭档Adapter将放到下一章节详细介绍,所以现在我们只需要知道Adapter用来存放数据、规定每条列表项长什么样子。

9.1 ListView的使用方法

使用ListView展示内容,通常分下面几个步骤,

  1. 在布局文件中设置ListView布局;

  2. 在Activity界面创建的时候(例如onCreate()当中),通过代码获取ListView

  3. 创建一个Adapter负责为ListView提供数据。Android SDK提供了很多类型的AdapterArrayAdapter CursorAdapter SimpleAdapter等等,它们都是BaseAdapter的子类,简化了Adapter的使用。要显示的数据和显示这项数据项的布局要设置给Adapter

    Android SDK提供了一些常用的数据项布局方式android.R.layout.simple_list_item_1 android.R.layout.simple_list_item_2等等。我们也可以自己设计每一项的布局方式,后面会讲到。

  4. Adapter设置给ListView,数据将以列表的形式被展示,

  5. 为显示的每个item添加,点击时代响应处理函数;

综合以上的代码,就是,

运行以后,就能看到a b c以列表的形式,在界面上展现出来了。

9.2 ListView内容的更新

如果需要展示的数据有变化,就需要更新ListView,需要注意,

  1. 界面的更新需要在主线程进行(UI线程),如果在其他线程更新,系统有可能报错,并提示你“不能在非UI线程更新界面元素”;
  2. 修改了Adapter中要展示的数据后,需要使用AdapternotifyDataSetChanged(),界面就会刷新,看到修改的效果;

例如,初始化显示列表,并显示内容

主线程中更新数据,并刷新,

9.3 常用效果

9.3.1 修改点按时的背景效果

列表项的背景颜色是可以根据点按的不同状态而变化的,例如点击列表项的时候,背景颜色变深一点,出于选中的状态,背景颜色与别的项不同等等。
这一切只需要为ListViewlistSelector属性设置上一个Selector就好了,例如,

其中,@color/normalres/values/colors.xml中,被设计成,

使用的时候就像这样,

大多数时候,希望那些没有被选中的列表项的背景颜色能和选中了但是没有被点击的列表项颜色一致,例如上面d列表项的背景要和c列表项没有被点击时一个颜色,那么可以为ListView的背景设置一个与没有点击的一样的颜色,

这里有个非常重要的地方需要注意:对于ListView来说,只有当列表项被点击(press)或者获取焦点(focus)的时候,它对应的列表项才会被使用ListView设置的这个Selector

所以对于那些没有被点击或者没有获取焦点的数据项,即使它们满足Selector中的某些条件,Selector也将完全不起作用。

9.3.2 修改分隔线

ListView中每一个列表项之间的分隔栏是可以进行调整的,可以通过android:divider属性设定它的颜色,通过android:dividerHeight属性设定它的高度,

9.3.3 添加header和footer

ListView的顶部和底部,可以各添加上自定义栏。不过添加的过程需要在代码中进行,

  1. 用java代码或者xml的方式,创建要添加到header或者footer的界面;
  2. 使用addHeaderView()将header界面添加到ListView的顶部;
  3. 使用addFooterView()将footer界面添加到ListView的底部;

9.3.4 ScrollBar

假如列表中的数据比较多,而用户又在上下滑动列表的时候,左边会出现一个滚动条,用来指示当前看到的内容在整个列表的比例位置。

可以通过android:scrollbars属性来设置这个bar是否需要显示,

  1. none:永远不显示;
  2. vertial:需要的时候显示在右边栏;
  3. horizontal:需要的时候显示在下边栏;

9.3.5 FastScroller

当列表中的数据非常多的时候,可以通过设置android:fastScrollEnabled属性,来启动FastScroller。可以让用户拖动右边的滑块,加快浏览的速度。不过,假如列表项不能占满4个屏幕的高度,那么即使设置了android:fastScrollEnabled属性,FastScroller也是不会出现的。毕竟数据少,也就不需要Fastscroller出马了。

Fastscroller的滑块和轨道是可以自定义的,在应用的主题中设定android:fastScrollTrackDrawableandroid:fastScrollThumbDrawable属性,就可以做出修改,

9.4 ListView的Choice Mode

ListView本身带有单选和多选功能,也就是说在单选模式下,它能够记住当前选中的唯一的列表项;在多选模式下,它能够记住目前选取的所有的列表项。

这种选择模式共有4种CHOICE_MODE_NONE CHOICE_MODE_SINGLE CHOICE_MODE_MULTIPLE CHOICE_MODE_MULTIPLE_MODAL

使用setChoiceMode()函数,就可以设置ListView的选择模式。

9.4.1 CHOICE_MODE_NONE

这是ListView默认的选择模式,当使用者点击列表项后,不会将任何点击的列表项当成被选择上的列表项。

9.4.2 CHOICE_MODE_SINGLE

使用这个选项模式,当使用者点击列表项后,会将最后一次点击的列表项当成被选择上的列表项。

每次点击列表项,可以在它的监听函数中得知哪个列表项被点击了,

以后就可以通过ListViewgetCheckedItemPositions()获取被选中的数据项的位置列表,

例如,当列表项按照序号为3->2->1-7的顺序被点击后,7将被记录下来,作为当前被选中的数据项。调用getCheckedItemPositions()后,将得到一个键值对,里面只会记录,

这里为了看到被选中的效果,采用了Android SDK提供的android.R.layout.simple_list_item_single_choice布局,作为列表项的布局。

9.4.3 CHOICE_MODE_MULTIPLE

使用这个选项模式,当使用者点击列表项后,会将所有点击的列表项当成被选择上的列表项。

每次点击列表项,可以在它的监听函数中得知哪个列表项被点击了,

通过ListViewgetCheckedItemPositions()获取被选中的数据项的位置列表,

例如,当列表项按照序号为3->2->1->7的顺序被点击后,3 2 1 7将被记录下来,作为当前被选中的数据项。调用getCheckedItemPositions()后,将得到一个个键值对,里面会记录,

这些记录,将按照列表项的位置从小到大排列。

如果用户在已经被选上的数据项上,又再次点击,这将取消对它的选择。例如,当列表项按照序号为3->2->1->7->2->1的顺序被点击后,就变成了,

对于被取消了选择的列表项,并不会从记录中移除,而是改变它的值成false

这里为了看到被选中的效果,采用了Android SDK提供的android.R.layout.simple_list_item_multiple_choice布局,作为列表项的布局。

9.4.4 CHOICE_MODE_MULTIPLE_MODAL

CHOICE_MODE_MULTIPLE_MODAL模式中,用户必须通过长按任意一个列表项,进入多选模式,否则不能进行多选。

这个模式的使用与CHOICE_MODE_MULTIPLE类似,不过它需要设置一个ActionMode,这样才能在长按列表项后,改变ActionBar的菜单栏,打开多选的菜单。

  1. 实现ListViewMultiChoiceModeListener接口,

  2. 使用创建的接口,传递给ListView

CHOICE_MODE_MULTIPLE_MODAL模式下,对列表项的点击,是在ListView.MultiChoiceModeListeneronItemCheckedStateChanged()函数中响应的。

这里为了看到被选中的效果,采用了Android SDK提供的android.R.layout.simple_list_item_multiple_choice布局,作为列表项的布局。

9.4.5 关于单选和多选的状态背景

前面的演示中,分别对不同的选择模式,使用了不同的数据项布局,

我们也可以选择自己的布局来实现。但是不管使用什么布局,我们都希望被选上的列表项有特别的效果,和其他没有被选上的数据项区别开。这里有两种方案,

  1. 使用实现了Clickable接口的控件或者布局,作为数据项的布局。例如前面我们使用的android.R.layout.simple_list_item_multiple_choice android.R.layout.simple_list_item_single_choice等,它们本身就是CheckedTextView。当点击它们的时候,它们就自带了勾选框,可以看到效果。

    所以,可以选择CheckBox Switch这类同样实现了Clickable接口的布局来表现;也可以自定义一个实现了Clickable接口的布局。这里用android.R.layout.simple_list_item_multiple_choice的实现来举个例子,

  2. 给数据项的布局使用一个Selector,告诉这个布局,当它被activated以后要怎么显示。比如,定义一个布局custom_item_layout.xml,

    给这个布局设计一个selector,增加对android:activated属性的设置,

    使用这个这个布局,

    当我们多选的时候,那些选中项,就变成黄色,看到如下的界面,


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/

布局与控件 第8节 VideoView

更新时间 修改意见
2016-08-02 陈敏

第8节 VideoView

播放视频可以使用Android SDK提供的现成的控件VideoView。它是对media playersurface的封装,对于初次进行视频播放开发的开发者来说,使用VideoView是最简单和方便的,不用关注太多细节上的实现方式。

8.1 VideoView的使用

VideoView的使用,非常简单,

  1. 在布局文件中放置一个VideoView控件,

  2. 在Activity当中,获取布局文件中的VideoView,然后设置要播放的视频地址,

    1. 使用字符串路径,视频的地址类似于:/storage/emulated/0/Video/【大自然】mothernature(蒋雯丽配音).mp4
    2. 使用uri路径;
  3. 使用VideoView提供的接口,控制视频播放的流程,

8.2 控制面板

还可以为VideoView添加控制面板-MediaController,这个面板集成了播放进度拖动、暂停、继续播放等功能,还可以自动隐藏或显示。

使用Android SDK自带的MediaController

如果VideoView有父布局,那么为它添加的MediaController就会附着在父布局的底部的。

因此为了界面美观,经常在布局文件中,将VideoView单独放到一个FrameLayout当中,并让它居中显示,


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/

布局与控件 第7节 TableLayout

更新时间 修改意见
2016-08-02 陈敏

第7节 TableLayout

TableLayout顾名思义,就是像表格一样的布局。它是LinearLayout的子类,所以拥有LinearLayout的所有属性。

7.1 TableLayout的行数

TableLayout需要与它的搭档TableRow配合使用,TableRow也是LinearLayout的子类,表示表格的每一行,例如一个表格有3行,它的布局文件就应该像这样,

TableRow可以不用指定它的android:layout_heightandroid:layout_width属性(对于其它类型的布局来说,这两个属性是必须要设置的,不然编译器会提示错误),默认情况下,android:layout_heightwrap_content,android:layout_widthmatch_parent

7.2 TableLayout的列数

每一个TableRow中包含的子控件(或者子布局)的个数,就是表格的列数。如果各个TableRow中包含的子控件个数不相同,那么就以最多的个数为准,作为整个表格的列数。

例如下面的布局,

效果如下,可以看到这是一个5*4的表格,有的行有2格、有的有3格、有的有4格,于是采用格数最多的作为表格的列数。这里因为屏幕空间比较大,并没有占据完整个屏幕。

7.3 TableLayout界面调整

7.3.1 表格的平分

很多时候,我们希望表格的每一行能够平均分配可用的空间,那么可以为每个TableRow设置android:layout_weight=1

表格的每一列能够平均分配可用的空间,那么可以为每个TableLayout添加android:stretchColumns="*",这样,剩余的空间就被拉伸平分了,

android:stretchColumns用来指定需要拉伸的单元格,*表示所有单元格。

也可以指定部分单元格拉伸,例如指定第2列赫第4列,

注意,可拉伸的单元格序号是从0开始;多个单元格,可以用逗号分隔开。

7.3.2 表格列的收缩

有的时候,如果一个单元格的内容过长,会影响到同一行其它列的显示效果,例如,

如果对TableLayout使用了android:shrinkColumns,并指定可以收缩的列为0,那么这一列的内容就可以朝着下方伸展,

注意,可收缩的单元格序号是从0开始;多个单元格,可以用逗号分隔开。

7.3.3 表格列的隐藏

要隐藏某一列也很容易,使用android:collapseColumns,将要隐藏的列的序号填入即可,例如,

可以看到,第一列已经被隐藏起来不见了。

注意,可收缩的单元格序号是从0开始;多个单元格,可以用逗号分隔开。

7.3.4 单元格的跨列

有时,希望一个按钮能够跨多列,可以使用android:layout_span属性,例如这里让按键0,跨两列

需要注意的是,TableLayout中的单元格并不能跨行合并显示。


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/