Android 基础入门教程

660课时
526学过
8分

2. 基本 UI 控件

View与ViewGroup的概念

LinearLayout(线性布局)

weight(权重)属性详解

为LinearLayout设置分割线

LinearLayout的简单例子

LinearLayout注意事项

RelativeLayout(相对布局)

TableLayout(表格布局)

如何确定行数与列数

TableLayout三个常用属性

TableLayout使用实例

FrameLayout(帧布局)

FrameLayout常用属性

FrameLayout实例演示1

FrameLayout实例演示2

FrameLayout实例演示3

GridLayout(网格布局)

GridLayout使用实例

GridLayout用法归纳

AbsoluteLayout(绝对布局)

AbsoluteLayout使用示例

TextView(文本框)

TextView基础属性详解

TextView实例演示1

TextView实例演示2

TextView实例演示3

使用autoLink属性识别链接类型

TextView玩转HTML

SpannableString&SpannableStringBuilder定制文本

设置TextView字间距和行间距

TextView自动换行

EditText(输入框)

EditText设置默认提示文本

获得焦点后全选组件内所有文本内容

限制EditText输入类型

设置最小行、最多行和单行等

设置文字间隔和英文字母大写类型

控制EditText距离

设置EditText获得焦点

EditText光标位置的控制

带表情的EditText的简单实现

带删除按钮的EditText

Button(按钮)与ImageButton(图像按钮)

StateListDrawable简介

实现按钮的按下效果

使用颜色值绘制圆角按钮

实现Material Design水波效果的Button

ImageView(图像视图)

src属性和background属性的区别

adjustViewBounds设置缩放是否保存原图长宽比

scaleType设置缩放类型

最简单的绘制圆形的ImageView

RadioButton(单选按钮)&Checkbox(复选框)

RadioButton基本用法与事件处理

CheckBox基本用法与事件处理

自定义点击效果

改变文字与选择框的相对位置

修改文字与选择框的距离

开关按钮ToggleButton和开关Switch

ToggleButton核心属性讲解

Switch核心属性讲解

ToggleButton和Switch使用示例

ProgressBar(进度条)

ProgressBar常用属性讲解与基础实例

使用动画来替代圆形进度条

自定义圆形进度条

SeekBar(拖动条)

SeekBar基本用法

简单SeekBar定制

RatingBar(星级评分条)

RatingBar基本使用

RatingBar定制环节

ScrollView(滚动条)

Date & Time组件(上)

TextClock(文本时钟)

AnalogClock(模拟时钟)

Chronometer(计时器)

Date & Time组件(下)

DatePicker(日期选择器)

TimePicker(时间选择器)

CalendarView(日历视图)

Adapter基础讲解

MVC模式的简单理解

Adapter概念解析

Adapter代码示例

ListView简单使用

BaseAdapter优化

ListView的焦点问题

ListView之checkbox错位问题解决

ListView的数据更新问题

构建一个可复用的自定义BaseAdapter

ListView Item多布局的实现

GridView(网格视图)的基本使用

Spinner(列表选项框)的基本使用

AutoCompleteTextView(自动完成文本框)的基本使用

ExpandableListView(可折叠列表)的基本使用

ViewFlipper(翻转视图)的基本使用

Toast(吐司)的基本使用

Notification(状态栏通知)详解

AlertDialog(对话框)详解

其他几种常用对话框基本使用

PopupWindow(悬浮框)的基本使用

菜单(Menu)

ViewPager的简单使用

DrawerLayout(官方侧滑菜单)的简单使用

4. 四大控件

Activity初学乍练

Activity的概念与Activity的生命周期图

Activity/ActionBarActivity/AppCompatActivity的区别

Activity的创建流程

onCreate()一个参数和两个参数的区别

启动一个Activity的几种方式

横竖屏切换与状态保存的问题

系统给我们提供的常见的Activity

Activity初窥门径

Activity间的数据传递

多个Activity间的交互(后一个传回给前一个)

知晓当前是哪个Activity

随时关闭所有Activity

完全退出App的方法

双击退出程序的两种方法

为Activity设置过场动画

Bundle传递数据的限制

使用命令行查看当前所有Activity的命令

设置Activity全屏的方法

onWindowFocusChanged方法妙用

定义对话框风格的Activity

Activity登堂入室

Activity,Task和Back Stack的一些概念

Task的管理

Activity的四种加载模式详解

Activity拾遗

Service初涉

线程的相关概念

Service与Thread线程的区别

Service的生命周期图

生命周期解析

生命周期验证

Service进阶

IntentService的使用

Activity与Service通信

一个简单前台服务的实现

简单定时后台线程的实现

Service精通

IBinder和Binder是什么?

Binder机制浅析

为何Android使用Binder机制来实现进程间的通信?

AIDL是什么?

AIDL实现两个进程间的简单通信

AIDL实现两个进程间的简单通信-服务端

AIDL实现两个进程间的简单通信-客户端

传递复杂数据的AIDL Service

直接通过Binder的onTransact完成跨进程通信

Android 5.0后Service一些要注意的地方

BroadcastReceiver牛刀小试

BroadcastReceiver是什么?

两种广播类型

接收系统广播

发送广播

BroadcastReceiver庖丁解牛

本地广播

Android 4.3以上版本监听开机启动广播的问题解决

常用的系统广播总结

ContentProvider初探

ContentProvider概念讲解

使用系统提供的ContentProvider

自定义ContentProvider

通过ContentObserver监听ContentProvider的数据变化

ContentProvider再探:Document Provider

简单走下文档

Android 4.4 获取资源路径问题

Intent的基本使用

显式Intent与隐式Intent的区别

Intent的七个属性

显式Intent使用示例

隐式Intent详解

常用系统Intent合集

Action在哪里查?

Intent之复杂数据的传递

Intent传递简单数据

Intent传递数组

Intent传递集合

Intent传递对象

Intent传递Bitmap

定义全局数据

单例模式传参

7. 网络编程

Android网络编程要学的东西与Http协议学习

Android与互联网交互的三种方式

初识Http协议

什么是Http协议?

Http 1.0 与 Http 1.1的区别

Http协议的底层工作流程

Http协议的业务流程

Http的几种请求方式

Get和Post的对比

Http状态码合集

Http协议的特点

Android Http请求头与响应头

HTTP请求之消息头

HTTP响应之响应头

代码验证响应头的作用

Android HTTP请求方式:HttpURLConnection

HttpURLConnection的介绍

HttpURLConnection的使用步骤

HttpURLConnection使用示例

Cookie问题的处理

使用HttpURLConnection发送PUT请求

Android HTTP请求方式:HttpClient

HttpClient使用流程

HttpClient使用示例

HttpClient抓数据示例

使用HttpPut发送Put请求

Android XML数据解析

XML数据要点介绍

三种解析XML方法的比较

SAX解析XML数据

DOM解析XML数据

PULL解析XML数据

参考代码下载

Android JSON数据解析

Json是什么?

Json与XML的比较

Json的格式规范

Android给我们提供的Json解析类

Json字符串解析示例1

Json字符串解析示例2

Android 文件上传

项目用到的图片上传的关键方法

使用HttpConnection上传文件

Android 文件下载(1)

普通单线程下载文件

普通多线程下载

使用DownloadManager更新应用并覆盖安装

示例代码下载

Android 文件下载(2)

Android多线程断点下载的代码流程解析

Step 1:创建一个用来记录线程下载信息的表

Step 2:创建一个数据库操作类

Step 3:创建一个文件下载器类

Step 4:自定义一个下载线程类

Step 5:创建一个DownloadProgressListener接口监听下载进度

Step 6:编写我们的布局代码

Step 7:MainActivity的编写

Step 8:AndroidManifest.xml文件中添加相关权限

参考代码下载

Android 调用 WebService

WebService简介

去哪里获取WebService服务

第三方jar包的准备

获取相关的一些参数

注册并启用相关WEB服务

调用WebService的代码示例

参考代码下载

WebView(网页视图)基本用法

什么是WebView?

WebView相关方法

WebView常见需求1:根据URL加载网页

WebView常见需求2:滚动事件的监听

WebView常见需求3:滚动条的问题

WebView常见需求4:设置缩放以及自适应屏幕

WebView常见需求5:获取WebView的Cookie数据

WebView常见需求6:设置WebView的Cookie数据

示例代码下载

WebView和JavaScrip交互基础

核心步骤讲解

HTML通过JS显示Toast与普通列表的对话框

HTML通过JS调用三种不同的对话框

HTML通过JS读取Android联系人并显示

示例代码下载

Android 4.4后WebView的一些注意事项

多线程

线程阻塞

evaluateJavascript() 方法

处理WebView中url的跳转

UserAgent变化

使用addJavascriptInterface()的注意事项

Remote Debugging

N5读取联系人的问题解决

WebView文件下载

调用其它浏览器下载文件

自己写线程下载文件

WebView缓存问题

缓存的分类

为WebView开启缓存功能

删除WebView的缓存数据

示例代码下载

WebView处理网页返回的错误码信息

页面错误,加载自定义网页

页面错误,显示相应的View

示例代码下载

Socket学习网络基础准备

OSI七层网络模型浅析

TCP/IP四层模型

TCP/UDP区别讲解

Java中对于网络提供的几个关键类

基于TCP协议的Socket通信(1)

什么是Socket?

Socket通信模型

Socket服务端的编写

Socket客户端的编写

增强版案例:小猪简易聊天室

基于TCP协议的Socket通信(2)

运行效果图

实现流程图

代码示例

示例代码下载

基于UDP协议的Socket通信

服务端实现步骤

客户端实现步骤

8. 绘画与动画

Android中的13种Drawable小结 Part 1

Drawable资源使用注意事项

ColorDrawable

NiewPatchDrawable

ShapeDrawable

GradientDrawable

Android中的13种Drawable小结 Part 2

BitmapDrawable

InsetDrawable

ClipDrawable

RotateDrawable

AnimationDrawable

Android中的13种Drawable小结 Part 3

LayerDrawable

TransitionDrawable

LevelListDrawable

StateListDrawable

Bitmap(位图)全解析 Part 1

了解Bitmap,BitmapFactory,BitmapFacotry.Options

Bitmap常用方法

获取Bitmap位图

获取Bitmap的相关信息

抠图片上的某一角下来

使用Bitmap进行截屏

Bitmap引起的OOM问题

什么是OOM?为什么会引起OOM?

避免Bitmap引起的OOM技巧小结

及时回收图像

其他方法

三个绘图工具类详解

Paint(画笔)

Canvas(画布)

Path(路径)

动手试试

绘图类实战示例

Paint API之MaskFilter(面具)

BlurMaskFilter(模糊效果)

EmbossMaskFilter(浮雕效果)

注意事项

示例代码下载

Paint API之 Xfermode与PorterDuff详解(一)

AvoidXfermode

PixelXorXfermode

示例代码下载

Paint API之Xfermode与PorterDuff详解(二)

写个例子来验证前面的这个图

示例代码下载

Paint API之Xfermode与PorterDuff详解(三)

实现流程分析

代码实现

示例代码下载

Paint API之Xfermode与PorterDuff详解(四)

要实现的效果图以及实现流程分析

代码实现

示例代码下载

Paint API之ColorFilter(颜色过滤器)(1/3)

相关常识的普及

ColorMatrix的解读

写代码来验证ColorMatrix所起的作用

使用ColorMatrix的三个方法处理图像

示例代码下载

Paint API之ColorFilter(颜色过滤器)(2/3)

代码示例

示例代码下载

Paint API之ColorFilter(颜色过滤器)(3/3)

测试代码示例

示例代码下载

Paint API之PathEffect(路径效果)

子类作用与构造方法参数分析

写代码来验证各自的效果

示例代码下载

Paint API之Shader(图像渲染)

使用代码示例

示例代码下载

Paint几个枚举/常量值以及ShadowLayer阴影效果

get枚举用法

Paint.Style

Paint.Cap

Paint.Join

Paint.Align

Paint.FontMetrics和Paint.FontMetricsInt

ShadowLayer设置阴影效果

Paint API之Typeface(字型)

字体的可选风格

可选字体对象(Typeface)

自定义创建字型

使用代码示例

示例代码下载

Canvas API详解(Part 1)

translate(平移)

rotate(旋转)

scale(缩放)

skew(倾斜)

Canvas图层的概念以及save()和restore()详解

saveLayer()与restoreToCount()讲解

示例代码下载

Canvas API详解(Part 2)剪切方法合集

Region.Op组合方式详解

Region.Op使用实例

clipRect方法详解

clipPath方法详解

示例代码下载

Canvas API详解(Part 3)Matrix和drawBitmapMesh

Matrix中的几个常用的变换方法

Matrix使用示例

drawBitmapMesh扭曲图像

示例代码下载

Android动画合集之帧动画

帧动画概念以及用法

使用示例1

使用示例2

示例代码下载

Android动画合集之补间动画

补间动画的分类和Interpolator

各种动画的详细讲解

写个例子来体验下

动画状态的监听

为View动态设置动画效果

为Fragment设置过渡动画

为Activity设置过场动画

进入APP后登陆注册按钮从底部弹出动画效果

示例代码下载

Android动画合集之属性动画-初见

属性动画概念

ValueAnimator简单使用

ObjectAnimator简单使用

组合动画与AnimatorListener

使用XML来编写动画

示例代码下载

Android动画合集之属性动画-又见

Evaluator介绍

Evaluator使用示例

Evaluator示例增强版

Interpolator(补间器)

Interpolator的内部实现机制

自定义Interpolator

ViewPropertyAnimator

示例代码下载

10. 系统服务

TelephonyManager(电话管理器)

获得TelephonyManager的服务对象

调用拨号器拨打电话号码

获取Sim卡信息与网络信息

获取手机的信号强度

监听手机的所有来电

黑名单来电自动挂断

示例代码下载

SmsManager(短信管理器)

调用系统发送短信功能

调用系统提供的短信接口发送短信

AudioManager(音频管理器)

获得AudioManager对象实例

相关方法详解

使用示例

Vibrator(振动器)

获得Vibrator实例

可以使用的相关方法

使用示例:设置频率不同的震动器

示例代码下载

AlarmManager(闹钟服务)

Timer类与AlarmManager类区别

获得AlarmManager实例对象

相关方法讲解

使用示例:一个简单的定时任务

代码示例下载

PowerManager(电源服务)

PowerManager是什么

wakelock锁介绍

PowerManager怎么用

需要的权限

WindowManager(窗口管理服务)

WindowManager介绍

如何获得WindowManager实例

WindowManager使用实例1

WindowManager使用实例2

WindowManager使用实例3

WindowManager使用实例4

代码示例下载

LayoutInflater(布局服务)

Layout是什么?

LayoutInflater的用法

纯Java代码加载布局

纯Java代码加载布局的流程

Java代码动态添加控件或xml布局

LayoutInflater的inflate()方法源码

WallpaperManager(壁纸管理器)

WallpaperManager的基本用法

调用系统自带的壁纸选择功能

将Activity的背景设置为壁纸背景

定时换壁纸的Demo

示例代码下载

传感器专题1:相关介绍

如何查看自己手机所支持的传感器有哪些?

Sensor传感器相关的方法以及使用套路

示例代码下载

传感器专题2:方向传感器

三维坐标系的概念

方向传感器的三个值

简单的Demo帮助我们理解三个值的变化

一个简易版的文字指南针示例

示例代码下载

传感器专题3:加速度/陀螺仪传感器

加速度传感器(Accelerometer sensor)

简易计步器的实现

陀螺仪传感器(Gyroscope sensor)

示例代码下载

传感器专题4:其他传感器了解

磁场传感器(Magnetic field sensor)

距离传感器(Proximity sensor)

光线传感器(Light sensor)

气压传感器(Pressure sensor)

温度传感器(Temperature sensor)

传感器模拟工具:SensorSimulator

Android GPS初涉

定位相关的一些API

获取LocationProvider的例子

判断GPS是否打开以及打开GPS的两种方式

动态获取位置信息

临近警告(地理围栏)

示例代码下载

课程评价 (0)

请对课程作出评价:
0/300

学员评价

暂无精选评价
10分钟

Spinner(列表选项框)的基本使用

本节引言:

本来本节是想给大家介绍一个Gallery(画廊)的一个控件的,后来想想还是算了,因为 在Android 4.1后就已经被弃用了,尽管我们可以通过兼容不来使用Gallery,不过想想 还是算了,因为Gallery在每次切换图片的时候,都需要重新创建视图,这样无疑会造成 很大资源浪费!我们可以通过其他方法来实现Gallery效果,比如通过HorizontalScrollView 来实现水平滚动效果,或者编写一个水平方向的ListView~有兴趣自己谷歌! 本节学习的是一个叫做Spinner的Adapter控件! 应用场景:当我们的app需要用户输入数据时,除了让用户自己打字以外,还有一种比较贴心的设计: 列出一组选项让用户从中挑选,从而方便了我们的用户! 话不多说,开始学习Spinner的基本用法~

1.相关属性

  • android:dropDownHorizontalOffset:设置列表框的水平偏移距离
  • android:dropDownVerticalOffset:设置列表框的水平竖直距离
  • android:dropDownSelector:列表框被选中时的背景
  • android:dropDownWidth:设置下拉列表框的宽度
  • android:gravity:设置里面组件的对其方式
  • android:popupBackground:设置列表框的背景
  • android:prompt:设置对话框模式的列表框的提示信息(标题),只能够引用string.xml 中的资源id,而不能直接写字符串
  • android:spinnerMode:列表框的模式,有两个可选值: dialog:对话框风格的窗口 dropdown:下拉菜单风格的窗口(默认)
  • 可选属性:android:entries:使用数组资源设置下拉列表框的列表项目

2.使用示例:

对了,Spinner会默认选中第一个值,就是默认调用spinner.setSection(0), 你可以通过这个设置默认的选中值,另外,会触发一次OnItemSelectedListener 事件,暂时没找到解决方法,下面折衷的处理是:添加一个boolean值,然后设置 为false,在onItemSelected时进行判断,false说明是默认触发的,不做任何操作 将boolean值设置为true;true的话则正常触发事件! 示例中写了两个不同的Spinner,从数据源,列表框风格等进行对比~ 接下来我们来看下

效果图

代码实现

这里依然使用的我们前面的可复用BaseAdapter:

第一个Spinner的数据源编写:

res/values下编写一个:myarrays.xml的文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="data">
        <item>英勇青铜</item>
        <item>不屈白银</item>
        <item>荣耀黄金</item>
        <item>华贵铂金</item>
        <item>璀璨钻石</item>
        <item>超凡大师</item>
        <item>最强王者</item>
    </string-array>
</resources>

接着是第二个Spinner的布局:item_spin_hero.xml

<?xml version="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"
    android:padding="5dp">

    <ImageView
        android:id="@+id/img_icon"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:src="@mipmap/iv_lol_icon1" />

    <TextView
        android:id="@+id/txt_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="15dp"
        android:text="德玛西亚"
        android:textSize="16sp" />

</LinearLayout>

再接着编写一个Entitiy实体类:Hero.java

/**
 * Created by Jay on 2015/9/24 0024.
 */
public class Hero {

    private int hIcon;
    private String hName;

    public Hero() {
    }

    public Hero(int hIcon, String hName) {
        this.hIcon = hIcon;
        this.hName = hName;
    }

    public int gethIcon() {
        return hIcon;
    }

    public String gethName() {
        return hName;
    }

    public void sethIcon(int hIcon) {
        this.hIcon = hIcon;
    }

    public void sethName(String hName) {
        this.hName = hName;
    }
}

最后是MainActivity的布局与Java代码部分:

布局文件:activity_main.xml

<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"
    android:padding="5dp"
    tools:context=".MainActivity">
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="选择您的排位分段"
        android:textColor="#44BDED"
        android:textSize="18sp" />

    <Spinner
        android:id="@+id/spin_one"
        android:layout_width="100dp"
        android:layout_height="64dp"
        android:entries="@array/data"
        android:prompt="@string/spin_title"
        android:spinnerMode="dialog" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="选择你的拿手英雄~"
        android:textColor="#F5684A"
        android:textSize="18sp" />

    <Spinner
        android:id="@+id/spin_two"
        android:layout_width="wrap_content"
        android:layout_height="64dp" />

</LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {

    private Spinner spin_one;
    private Spinner spin_two;
    private Context mContext;
    //判断是否为刚进去时触发onItemSelected的标志
    private boolean one_selected = false;
    private boolean two_selected = false;
    private ArrayList<Hero> mData = null;
    private BaseAdapter myAdadpter = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = MainActivity.this;
        mData = new ArrayList<Hero>();
        bindViews();
    }


    private void bindViews() {
        spin_one = (Spinner) findViewById(R.id.spin_one);
        spin_two = (Spinner) findViewById(R.id.spin_two);

        mData.add(new Hero(R.mipmap.iv_lol_icon1,"迅捷斥候:提莫(Teemo)"));
        mData.add(new Hero(R.mipmap.iv_lol_icon2,"诺克萨斯之手:德莱厄斯(Darius)"));
        mData.add(new Hero(R.mipmap.iv_lol_icon3,"无极剑圣:易(Yi)"));
        mData.add(new Hero(R.mipmap.iv_lol_icon4,"德莱厄斯:德莱文(Draven)"));
        mData.add(new Hero(R.mipmap.iv_lol_icon5,"德邦总管:赵信(XinZhao)"));
        mData.add(new Hero(R.mipmap.iv_lol_icon6,"狂战士:奥拉夫(Olaf)"));

        myAdadpter = new MyAdapter<Hero>(mData,R.layout.item_spin_hero) {
            @Override
            public void bindView(ViewHolder holder, Hero obj) {
                holder.setImageResource(R.id.img_icon,obj.gethIcon());
                holder.setText(R.id.txt_name, obj.gethName());
            }
        };
        spin_two.setAdapter(myAdadpter);
        spin_one.setOnItemSelectedListener(this);
        spin_two.setOnItemSelectedListener(this);

    }


    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        switch (parent.getId()){
            case R.id.spin_one:
                if(one_selected){
                    Toast.makeText(mContext,"您的分段是~:" + parent.getItemAtPosition(position).toString(),
                            Toast.LENGTH_SHORT).show();
                }else one_selected = true;
                break;
            case R.id.spin_two:
                if(two_selected){
                    TextView txt_name = (TextView) view.findViewById(R.id.txt_name);
                    Toast.makeText(mContext,"您选择的英雄是~:" + txt_name.getText().toString(),
                            Toast.LENGTH_SHORT).show();
                }else two_selected = true;
                break;
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
}

另外关于Spinner的OnItemSelectedListener,以及如何获得选中项的值,就自己看上面的 代码啦~

3.代码示例下载:

SpinnerDemo.zip

本节小结

好的,本节给大家介绍了Spinner(下拉选项框)的使用,例子还是蛮有趣的,哈哈~! 别问我哪个区什么段位,我可是人机小王子,可惜一直在青铜分段苦苦挣扎~ 你知道为什么的

,好吧,本节就到这里~