android基础控件

 

 

Android:Dalvik VM          安卓虚拟机DVM

Android SDK 

*底层是linux内核

- 安全管理

- 内存管理

- 进程管理

- 电源管理

- 硬件驱动

Jvm:     .java-> .class ->.jar               jdk--javac              基于栈的架构

Dvm:    .java->.class ->.dex -> .odex             sdk--dex              基于寄存器架构

*开发环境

- android  studio

- SDK工具包:

--  eclipse + ADT插件、Android SDK、Android Platform-tools

--  最新的Android开发平台、最新的模拟器镜像

*下载SDK之后,打开

      - eclipse 优化之后专做移动开发

- SDKManager.exe              sdk更新的管理器,可以下载不同平台的sdk

- SDK standarddevelop kits 标准开发工具包,提供开发的环境

-- tools 存放开发常用的工具包

API下面内容

---   sdk platForm  开发的环境  jar包

---   samples for SDK 开发的实例代码

---  arm system image 模拟器镜像 使用的arm处理器(模拟器)

---  x86 image 模拟器镜像 使用intel处理器

---  mips image 开源处理器平台,MIPS处理器架构

---  google apis  Google提供的一些jar包(地图,经纬度转换)

---  sources for Androidsdk  sdk的源代码(作参考Google源代码)

**常见的分辨率:

VGA :     480*640  标准的视频接口分辨

QBVGA:  240*320

HVGA :  480 *320  模拟常用

WVGA:   480*800

FWVGA:     480*854

**一个android工程的目录结构

- .settings              eclipse配置文件的目录

- assets          资产目录 里面可以放置应用程序依赖的一些文件

- bin                     存放编译的结果,.class  .dex .apk(可以供安装)

- gen            自动生成的目录,里面是自动生成的代码,不能被修改

- libs             三方的库函数

- res               资源目录,存放图片,存放String,应用程序的名称、图标

- src               java代码

- AndroidManifest  声明应用程序版本、图标、名称

 

*点击事件的四种写法:

1. .匿名内部类(new 接口)  简单

 

btn_call.setOnClickListener(newOnClickListener()

{

@Override

public void onClick(Viewv) {

EditText et_number = (EditText)

findViewById(R.id.et_number);

String number =et_number.getText().toString().trim();

// 获取文本框的内容

if ("".equals(number)){

// context 上下文 duration显示土司的时长

Toast.makeText(MainActivity.this, "号码不能为空",

Toast.LENGTH_LONG).show();

return;

}

Intent intent = newIntent();// 创建意图对象

intent.setAction(Intent.ACTION_CALL);

intent.setData(Uri.parse("tel:"+number));

startActivity(intent);

}

});

 

2写一个内部类  一目了然

 

private class MyButtonListenerimplementsOnClickListener{

@Override

public void onClick(Viewv) {

EditText et_number = (EditText)

findViewById(R.id.et_number);

String number =

et_number.getText().toString().trim();

// 获取文本框的内容

if ("".equals(number)){

Toast.makeText(MainActivity.this, "号码不能为空",

Toast.LENGTH_LONG).show();

return;

}

System.out.println("number--"+number);

Intent intent = newIntent();

// 创建意图对象

intent.setAction(Intent.ACTION_CALL);

intent.setData(Uri.parse("tel:"+number));

startActivity(intent);

}}

 

3.当前activity实现onclicklistener接口

      - 如果布局文件里面有大量的view对象需要实现点击事件,推荐使用

 

//第一步:Activity实现OnClickListener接口

public class SecondActivityextendsActivity implements

OnClickListener {

@Override

protected void onCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_second);

//第二步:得到button,并且设置点击监听为:this

Button btnCall = (Button) findViewById(R.id.btn_call);

btnCall.setOnClickListener(this);

}

//第三步:重写OnClickListener接口的onClick方法

@Override

public void onClick(Viewv) {

//根据vid来区分点击的是哪个按钮

switch (v.getId()){

case R.id.btn_call:

//DoSomething

break;

}}

}

 

4.在布局文件绑定一个点击事件调用的方法(XML文件中布局Onclick)

- 不推荐使用. 代码可读性降低.

1. 在布局文件中添加android:onClick属性

<Button

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="点击我"

android:onClick="btnCall"/>

2. 在相应的java代码中定义call方法

该方法的形参必须为View对象,且只能有一个。修饰符必须是Public

public void btnCall(Viewview) {

Toast.makeText(getApplicationContext(),

"点击了我", Toast.LENGTH_SHORT).show();

}

 

 

*adb : android debug bridge  安卓调试桥

常见adb 指令:

adb devices 列出有多少个设备连接在电脑上.

adb install 安装指令

adb uninstall 卸载指令

adb push 把电脑上的一个文件 放在模拟器或者手机里面

adb pull 把模拟器或者手机里面的内容  拷贝到电脑系统里面

adb shell 来到模拟器linux系统的终端里.

adb -s emulator-5554 指定特定的设备.

DDMS : delvik debug manager system

url : 同一资源定位符

uri : 统一资源标识符

 

*工程目录结构:

.settings eclipse 配置文件的目录

assets    资产目录  里面可以放置应用程序依赖的一些文件.

bin       存放编译的结果.  .class .dex .apk

gen       自动生成的目录里面是自动生成的代码 不能去修改.

libs      三方的库函数 libs

res       资源目录 存放图片,字符串等等 存放string , 应用程序的名称

src       java代码

AndroidManifest.xml   xml清单文件指定应用程序的版本 应用程序图标 应用程序名称

R.java 作用 生成资源文件的引用

 

 

 

 

 

 

 

 

 

 

 

 

 

 UI布局

1.1 了解Android UI控件 

1.2 掌握LinearLayout布局  

1.3 掌握RelativeLayout相对布局

1.4 掌握LinearLayout与RelativeLayout的组合嵌套应用

1.5 了解FrameLayout 

 AbsoluteLayout      绝对布局(已过期,不建议使用)

    RelativeLayout     相对布局

    LinearLayout       线性布局

    FrameLayout        帧布局

    TableLayout        表格布局,是LinearLayout的子类

    GridLayout         网格布局(4.0推出)

目前推荐使用RelativeLayout、LinearLayou、FrameLayout三种布局。

 

* LinearLayout布局

**线性布局控制其中的控件按照横向或纵向方式排列。并且线性布局不会换行,当控件排列到窗体边缘,后面的控件就被隐藏,而不会显示出来。

**线性布局的默认方向是水平方向(Horizontal)。

垂直方向:Vertical;

 

 

属性

介绍

可选项值

android:layout_width

定义控件的宽度

fill_parent/match_parent 

wrap_content/绝对数值

android:layout_height

定义控件的高度

match_parent

“填充满”父容器

和fill_parent效果一样

wrap_content

根据容器内的东西决定组件的大小

 

android:orientation

定义布局内控件或组件的排列方式

vertical 、 horizontal

android:background

设置控件的背景颜色或背景图片

背景色使用RGB三原色

android:background="#123456"

ARGB:带透明度的RGB三原色

android:background="#99123456"

白色:#ffffff    黑色:#000000

android:id

设置控件的id。这样就可以在R.java中自动生成相应的值,在程序中通过findViewById就可以调用。

android:id = "@+id/id的名字"

 

 

设置背景图片              android:background="@drawable/img001" 

背景图片和背景颜色不能同时设置

android:layout_weight

权重属性。在一般开发中主要用于适配多种屏幕

按照给定的比例分配当前父容器的剩余空间。

LinearLayout为横向时,影响的是组件的宽度属性

LinearLayout为纵向时,影响的是组件的高度属性

一般会将影响的宽度或高度属性设置为0dp,平均分配屏幕

android:layout_gravity

线性布局内部组件设置的在布局中的对齐方式

(布局内部组件)

子UI组件在LinearLayout中的对其方式
top,bottom,left,right,center,center_vertical,

center_horizontal


LinearLayout为横向时,垂直方向的对其功能有效
LinearLayout为纵向时,水平方向的对其功能有效

android:gravity

(组件内部的对其方式)

布局或组件内部内容的对其方式
top,bottom,left,right,center,center_vertical,

center_horizontal

 

android:layout_margin

一个组件与相邻组件的距离

top,bottom,left,right

android:layout_padding

组件内部内容与组件边界的距离
top,bottom,left,right

layout_gravity=”center”;表示线性布局相对于view居中

gravity =”center” 表示线性布局内的内容居中!!!

Layout_weight;权重,占比越大,尺寸占得越大。

f:设置透明度,值0,1之间

android:alpha="0.1"

 

外边距:控件外部,控件之间的距离

layout_margin:四个方向

layout_marginLeft,Right,Top,Bottom

 

 

h:gravity:用来控制View中内容的位置

       1)、如果使用在布局标签中,设置布局中控件的位置

       2)、如果使用在控件中(比如,TextView,Button……),设置控件中文字的位置

       android:gravity="bottom|center",底部居中

       android:gravity="right|bottom",右下角

layout_gravity:控件对应与布局的对齐方法,使用在控件中

垂直布局中,设置bottom不起作用

水平布局中,设置right不起作用

 

*掌握RelativeLayout相对布局

即子控件的位置可以取决于兄弟控件或者父控件的位置

与LinearLayout相比,减少嵌套使用,界面代码简洁

android:layout_alignParentLeft="true"

android:layout_alignParentRight="true"

android:layout_alignParentBottom="true"

android:layout_alignParentTop="true"

与相对布局的对其方式

有四个方向

于View对其

android:layout_alignBottom="@+id/button1"

android:layout_alignTop="@+id/button1"

android:layout_alignLeft="@+id/button1"

android:layout_alignRight="@+id/button1"

与button1组件的对其方式有四个方向

与button1对其

android:layout_toRightOf="@+id/button1"

android:layout_toLeftOf="@+id/button1"

android:layout_above="@+id/button1"

android:layout_below="@+id/button1"

在button1组件的那个位置
有四个方向

android:layout_centerHorizontal="true"

android:layout_centerVertical="true"

android:layout_centerInParent="true"

在相对布局中的对其方式

android:layout_alignBaseline="@+id/button1"

组件的文字底部与button1的文字的底部对其

组件之间不能相互依赖,不然会出错

 

 

*掌握LinearLayout与RelativeLayout的组合嵌套应用 

 

*了解FrameLayout  

 

 android:visibility="gone":当前控件是否可见

                      visible:当前控件可见

                      invisible:当前控件不可见,但仍然占据空间大小

                      gone:当前控件不可见,也不占据空间大小

 

*表格布局:

 

 

*layout_column=”1”  始终在第一列

*layout——span=“2” 当前列会占用两列的空间

Tablelayout可以不写宽高,默认是匹配父元素,也改不了

 

*绝对布局:

3、网格布局:GridLayout

与LinearLayout类似,需要指定布局的方向

android:orientation:horizontal,vertical

指定网格的行数和列数

android:rowCount="4"

android:columnCount="4"

网格合并

android:columnSpan="2",跨列合并

android:rowSpan="2",跨行合并

合并之后设置为填充

android:layout_gravity="fill",fill_horizontal,fill_vertical

 

指定控件在网格中显示的位置,索引从0开始

android:layout_row="0"

android:layout_column="1"

根据是否知道程序的源代码:

白盒测试:  知道源代码,根据源代码进行测试.

黑盒测试:  没有程序的源代码, 只是测试程序的功能.

根据测试的粒度 (模块的大小)

单元测试 unit test

方法测试 function test

集成测试 intergration test

系统测试 system test

根据测试的次数 暴力程度

冒烟测试 smoke test

压力测试 pressure test

日志的等级

ERROR > WARN> INFO > DEBUG > VERBOSE

 

文件访问权限

- rw- rw- --- 私有

- rw- rw- r-- 可读

- rw- rw- -w- 可写

- rw- rw- rw- 可读可写

android系统有一个特点 每个应用程序 都是一个单独的用户.

一个应用程序创建的文件默认模式是私有的模式,

别的应用程序不可以访问这个应用程序私有的数据.

ctrl + H

访问模式(上下文引用)

context.getFilesDir();   /data/data/当前应用程序包名/files

context.getCacheDir();   /data/data/当前应用程序包名/cache

安装一个apk后 系统拷贝这个apk /data/app/xx.apk

context.getPackageCodePath()

直接获取一个文件的输入流

FileInputStreamfis = context.openFileInput("info.txt");

等价于

File file = newFile(context.getFilesDir(),"info.txt");

FileInputStreamfis = new FileInputStream(file);

直接获取一个文件的输出流

context.openFileOutput("info.txt",Context.MODE_PRIVATE); //文件是私有模式

等价于

File file = newFile(context.getFilesDir(),"info.txt");  //在当前应用程序的目录下创建一个files目录 里面有一个文件 info.txt

FileOutputStreamfos = new FileOutputStream(file);

Context.MODE_APPEND追加模式 新的数据会被保存到旧的数据的后面.

1.android测试

[monkey测试程序]

cmd adb -shell

monkey + 次数

------------------

[单元测试]

拷贝junit下清单文件中的

 

拷贝

<!--测试指令集-->

 <instrumentation

       android:name="android.test.InstrumentationTestRunner"

       android:targetPackage="com.example.testadd" />

放置在<manifest>结点下

 

拷贝

<!--测试的指令集需要的函数库-->

<uses-libraryandroid:name="android.test.runner" />

放置在<application>结点下

建立Test类 继承AndroidTestCase类  建立Test方法  在OutLine视图下 右键运行想要测试的方法Run As android junit test

 

assertEquals方法用来测试期望的结果是否正确

assertEquals( 期望的值,result);

-------------------

2.日志的打印

Log.e(tag,message);      //Error

Log.w(tag,message);      //Warn

Log.i(tag,message);              //Info

Log.d(tag,message);       //Debug

Log.v(tag,message);       //Verbose

-------------------

3.Contexte

context.getFilesDir();   /data/data/当前应用程序包名/files

context.getCacheDir();   /data/data/当前应用程序包名/cache

-----------------------

获取一个文件的输入流

File file = newFile(context.getFilesDir(),"info.txt");

FileInputStream fis = newFileInputStream(file);

等价于

FileInputStream fis =context.openFileInput("info.txt");

----------------------

获取一个文件的输出流

Filefile = new File(context.getFilesDir(),"info.txt"); 

//Filefile =new File(getCacheDir(),”info.txt”);

//在当前应用程序的目录下 创建一个files目录 里面有一个文件 info.txt

FileOutputStream fos = newFileOutputStream(file);

等价于

context.openFileOutput("info.txt",Context.MODE_PRIVATE); //文件是私有模式

Context.MODE_ 有四种模式   私有,可读,可写,追加模式

------------------------

SD卡

sd卡是在目录"/mnt/sdcart"下

在根目录里有个链接也可访问到"sdcard"

这个方法可以快捷准确的获取到SD卡的目录:

Filefile = new File(Environment.getExternalStorageDirectory(),“sdcard/info.txt”);

//Filefile = new File(“sdcard/info.txt”);

推荐用方法获取路径;

当对SD卡下的文件进行读写操作的时候 需要申请权限"android.permission.WRITE_EXTERNAL_STORAGE"

------------------------

检查SD卡的状态

获取SD卡的状态 返回一个字符串

Environment.getExternalStorageState().equals(str);

-str有如下几种情况:分别对应不同的状态

MEDIA_UNKNOWN:不能识别sd卡

MEDIA_REMOVED:没有sd卡

MEDIA_UNMOUNTED:sd卡存在但是没有挂载

MEDIA_CHECKING:sd卡正在准备

MEDIA_MOUNTED:sd卡已经挂载,可用//常用这个

 

常用的SD卡状态:

Environment.MEDIA_MOUNTED  //SD卡挂载

 

文件访问权限(继承了LUNIX):drwxrwx--x(10个字母)

*d:   表示是文件还是文件夹

*rwx(第一个):文件拥有者对这个文件的权限(文件创建者)

*rwx(第二个):表示跟文件拥有者同组的用户的权限

*--x;表示其他用户的权限

以上。r表示可读,w表示可写,x表示可执行

 

-----------------------------

要会看android系统的源码

ctrl + f来搜索android的功能 对应的代码

步骤:

先启动android 进入设置界面,来看想要获取的功能

[获取SD卡的可用空间大小]

protected void onCreate(BundlesavedInstanceState) {

              super.onCreate(savedInstanceState);

              setContentView(R.layout.activity_main);

 

              Filepath = Environment.getExternalStorageDirectory();

              StatFsstat = new StatFs(path.getPath());

              longblockSize = stat.getBlockSize();

              longavaliableBlocks = stat.getAvailableBlocks();

              longsize = blockSize*avaliableBlocks;

 

              StringsizeStr = Formatter.formatFileSize(this, size);

              TextViewtv_info = (TextView) findViewById(R.id.tv_size);

              tv_info.setText("sd卡可用空间的大小为:"+sizeStr);

       }

-----------------------------------------------

sharedpreference

用来将信息存放在XML文件中

对应XML文件位置在data/data/包名/shared_prefs中

使用步骤:

1.初始化

SharedPreferences sp =this.getSharedPreferences("文件名称",Context.MODE_ [对应模式]);

2.创建对应的编辑器

Editor editor = sp.edit();

3.设置对应的信息

editor.putBoolean("checked",true);

4.信息设置完后要记得执行方法

edit.commit();

如果想要获取存入的值

sp.getBoolean("checked");

--------------------------------------------------

生成XML文件

1.(不能用)组品字符串生成xml文件 需要对特殊字符转义

2.利用xml序列化的api生成xml文件

 

 

 

public static void createXml(Contextcontext,String username,String password)throws Exception{

              //XML文件的序列化器生成xml文件

              XmlSerializerserializer = Xml.newSerializer();

              Filefile = new File(context.getFilesDir(),"confit.xml");

              FileOutputStreamfos = new FileOutputStream(file);

              //初始化xml文件序列化器

              serializer.setOutput(fos,"utf-8");

              serializer.startDocument("utf-8",true);

              serializer.startTag(null,"map");

             

                     serializer.startTag(null,"String");

                     serializer.attribute(null,"name", "username");

                     serializer.text(username);

                     serializer.endTag(null,"String");

             

                     serializer.startTag(null,"String");

                     serializer.attribute(null,"name", "password");

                     serializer.text(password);

                     serializer.endTag(null,"String");

                    

              serializer.endTag(null,"map");

              serializer.endDocument();

              fos.close();

       }________________________________________

Eclipse快捷键:

ctrl + f 寻找和替换

ctrl + shift + f 快速对齐

ctrl + / 注释

ctrl + 鼠标左键  可以点击进去看方法的源码

 

测试的面试题:

 Junit测试

面试中有可能会被问到,你们公司以前是怎么去测试的?

你可以说我们公司比较规范,有的功能会用Junit测试。也可以说,

我们就是手工测试,自己测试没问题了,提交给测试人员去测试。

然后他们提交bug,我们修复。

 日志信息

面试中,会被问到,你是怎么解决bug的?

一般说下,断点调试,变量分析,日志跟踪即可。

变量分析就是断点调试过程中,对变量的值进行监控,看是否为null

,或者不正常。

基本UI

TextView,用于显示文本

设置文本android:text="@string/textView"

大小android:textSize="20sp"

文字颜色android:textColor="#f00"

文字样式android:textStyle="bold|italic"

设置链接android:autoLink= web,email,phone,map,all

单行显示文本android:singleLine="true"

设置文本省略的位置android:ellipsize:start,middle,end(默认)

//设置滚动的次数android:marqueeRepeatLimit="marquee_forever"

//是否获得焦点android:focusable="true"

以触摸的方式获得焦点android:focusableInTouchMode="true"

internationalization:i18n

 

EditText,输入文本,获得光标时,显示指定的软键盘

android:hint="",提示内容

android:inputType="",指定输入内容的类型

 

Button按钮控件:

OnClickListener点击事件

OnLongClickListener长点击事件(包含点击事件);

layout

控件单位用:dp

字体单位用:sp

 

margin:控件距离View的距离。marginTop、marginBottom、marginLeft、marginRight

padding:页边距(比如字体到框框的距离)paddingTop、padding

 

 

ListView ???GridView ???

 

添加事件监听

a:创建子类,实现接口android.view.View.OnClickListener

b:使用匿名内部类

c:在布局文件中,给Button标签添加onClick属性,值为方法名

该方法的声明规则:public修饰,无返回值,参数为View类型,例如

public void send(View v){}

多个按钮处理单击事件:

a:使用OnClickListener接口

       1)、创建类,实现接口

       2)、使用MainActivity实现接口

b:在Button标签中添加onClick属性,指定同一个方法

 

RadioButtons 单选框控件

RadioButton 放在RadioGroup;(方法内用switch做判断内嵌套if)

RadioGroup横向纵向设置:orientation

public void onRadioButtonClicked(Viewview){

       RadioButtonbutton=(RadioButton )view;

       booleanisChecked =button.isChecked();

}

注册监听:radio.setOnClickListener(this);

 

吐司

Toast.makeText(this, "btn1",Toast.LENGTH_LONG).show();

 

Switch开关控件(方法内用if做判断)//互斥按钮

ToggleButton  和Switch是并列关系

public void onToggleClicked(View view){

       booleanisChecked =((Switch)view).isChecked();

}

注册监听; radio.setOnClickListener(this);

Text Fields控件:                     EditText  :点击获取相应键盘

editText.setOnKeyListener(new OnkeyListener({….})) 设置文本的键盘事件

比如设置回车键弹出登录吐司;

editText1.setOnKeyListener(new OnKeyListener() {

           publicboolean onKey(View v, int keyCode, KeyEvent event) {

              if(keyCode==KeyEvent.KEYCODE_ENTER){

                  Toast.makeText(MainActivity.this, "登录", 1).show();

              }          

              returnfalse;}});  }   

 

AutoCompleteTextView控件: 适配器文本框控件  此时的文本框用这个:提示文本控件

Adapter:适配器(接口);比如文本输入时下方非提示内容;

之类:ArrayAdapter<T>;BaseAdapter;

       它是View和AdapterView的桥梁;数据和控件之间的桥梁,负责接收数据;并且给每一条数据提供一个展示的view塞到不同的展示空间里面。

       AutoCompleteTextView:提示文本

       textView.setAdapter(adapter);//将适配器的内容放到AutoCompleteTextView

Context :Activity继承自Context ;

步骤解析:

A:创建资源;a:写一个方法getDataSource(),返回一个list集合

                     b:在resource 资源XML中,stringArray中添加数据

B:设置Adapter得到相应的值

1、a:adapter = newArrayAdapter<String>(this,

           android.R.layout.simple_list_item_1,getDataSource());

  b:String[] country=getResources().getStringArray(R.array.countries);

adapter=newArrayAdapter<String>(this,

android.R.layout.simple_list_item_1 ,country);

2、adapter = ArrayAdapter.createFromResource(this, R.array.cities_bigcity,    android.R.layout.simple_spinner_item);

//参数不一样

C:将适配器加到文本框中                 textView.setAdapter(adapter);

 

Checkboxes  :复选框控件

       CheckBox       ;多项选择框

1、Spinner控件的使用   2、Pickers日期和日历控件   3、Activity窗体介绍

4、Activity生命周期    4、Activity启动和值传递

 

Spinners  : 下拉单选框           下拉框也需要有一个适配器来提示内容

       监听:实现OnItemSelectedListener接口;

       监听事件:spinner.setOnItemSelectedListener(this);

注册监听:setOnItemSelectedListener

重写onItemSelected方法,参数说明如下;

parent:代表Spinner控件

view:代表Spinner的每个列表项,或者说是每行

position:位置,数据在适配器中的位置

id:被选择的行号

步骤解析:

A:创建资源;a:写一个方法getDataSource(),返回一个list集合

                     b:在resource 资源XML中,stringArray中添加数据

B:获取资源:

a:adapter=new ArrayAdapter<String>(MainActivity.this,

android.R.layout.simple_spinner_dropdown_item, getDataSource());

adapter = ArrayAdapter.createFromResource(this, R.array.cities_bigcity,android.R.layout.simple_spinner_item);

b:String[] country=getResources().getStringArray(R.array.countries);

adapter=newArrayAdapter<String>(this,

android.R.layout.simple_list_item_1 ,country);

C:把适配器加到spinner下拉选择框中;设置监听事件:

adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

       spinner.setAdapter(adapter);

       spinner.setOnItemSelectedListener(this);

 

Pickers日期和日历控件:

 DatePicker 日期控件; init

 

TimePicker:时间控件:

       监听:setOnTimeChangedListener

AnalogClock : 图表时钟控件

DigitalClock :数字时间控件,但是已经过时用TextColock代替;

       事件监听:timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {

           @Override

           publicvoid onTimeChanged(TimePicker view, int hourOfDay, int minute) {

              String value = hourOfDay+""+minute+"";

              Toast.makeText(MainActivity.this, value, 1).show();

           }});

= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = === = = = = = =

1.progressBar控件        2.SeekBar拖动控件      3.RatingBar评分控件   4.ScrollView滚动布局

5.HorizontalScrollView水平滚动布局

 

1.progressBar控件      进度条控件(默认横向样式,刻度100)

       下载的进度条!圆形的等待进度条

       *setProgress()  设置刻度条,长度

       *android:max    XML文件中设置最大值

 

SeekBar拖动控件:带圆球的能拖动的进度条控件;是progressBar的子类;

例如用于音量调节

       事件:SeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener )

RatingBar评分控件: 五星好评控件;是SeekBar的子类

       ratingBarStyleSmall:小样式                ratingBarStyleIndicator大样式

       setNumStras(int):设置星星的个数

       事件:ratingBar.setOnRatingBarChangeListener(newOnRatingBarChangeListener)

ScrollView     滚动布局(纵向) 

       产生的条件:内容高度大于手机屏幕高度会产生滚动布局;

       只有一个子元素;是线性布局;  必须是纵向

       不能和TextView一起用

======================================================================

1、  ListView列表控件  2、自定义适配器Adapter  3、ListView结合Json展示数据

4、ListView实现图文混排  5、ListView集合网络HTTP操作。 

Adapter:抽象方法  position位置

       getCount() :获取适配器选项的个数(容器的个数);抽象方法

       getItem(intposition) :获取适配器当中的某一个值;

       getItemId(intposition):获取ID

       getItemViewType(intposition);根据不同的Item用不同的界面显示出来

       isEmpty() 判断是否为空

getView()获取某个选项显示在view上

 

ListView列表控件:列表下拉控件,一定要大于屏幕的长度

ListView一旦创建,其height的属性是内容包裹,这是错误的;要修改成match_parent匹配父窗口;否则性能下降!

 

Adapter的匹配使用的控件:autoAutoCompleteTextView、spinner、ListView

 

Android四大组件

 

四大组件:    Activity、Services、

Content Providers(内容提供者)、broadcastreceiver(广播)

 

第一大组件:

Activity窗体介绍:       一个Activity就是一个活动窗口

-Fragments:代码片段(平板开发)

-Loaders:异步加载

-Tasks and Bask Stack(回退栈)

 

*当前的窗口叫做活动窗口;任意一个窗口都可以开启另外一个窗口;其他界面会被系统压到一个栈里面;

*回退栈:栈的原理是后进先出(窗口,点一下出来,再点再出,想看第一个窗口,按返回键,依次返回;就是回退栈!);

*Create activity:创建一个活动窗口:在创建Android工程时勾选即可!

       - 这个工程里面会写一个MainActivity类继承自Activity,里面有一个OnCreate方法;这个类就是一个活动窗口;

       - Activity里面最重要的方法:

-- onCreate();这个是必须要实现这个方法;启动activity

              --onPause () ; 暂时离开activity;用于数据保存!

 

*声明了一个activity,清单文件Manifest中做了什么:

       - 四大组件的标签都会出现在<application>标签中,有多少个activity窗体必须在清单文件中声明多少个窗体;

       -intent 意图(为什么程序一执行就会找到activity呢,因为activity中有<intent-filter>标签),intent就是动作,意图的意思;其标签内含有一个Main的action的标签,在任意activity窗体中加入这段代码表示当前窗体(activity)就是主窗体!就是一个入口

              --intent-filter是一个意图过滤器。用来处理用户的一些请求。

*启动一个另外的窗口:startActivity();    

设置当前启动界面setContentView(R.layout.next);

       - intent的几种写法:

第一种:

Intent intent =newIntent(MainActivity.this,NextActivity.class);

       startActivity(intent);

    第二种:

       Intent intent=new Intent();

       intent.setClass(MainActivity.this, NextActivity.class);

startActivity(intent);

//当不许要传递数据到第二个页面,而第二个页面要回传数据时;使用startActivityForResult()

startActivityForResult();

 

 

    第三种:

       在清单文件的NextActivity中添加action动作和category意图过滤器

       Intentintent=new Intent(“action名称”);

startActivity(intent);

 

*意图可以传值;

Intent.putExtra(name,value);//value可以是任何类型的值;

也可以是bundle类型;把伞的数据,方法bundle集合中;

*意图获取值:

Intent intent=getIntent();

String name=intent.getStringExtra(“name”);

 

*回传值:A窗口打开B子窗口,B把数据回传给A

startActivityForResult()代替startActivity()

子窗口必须重写onActivityResult()方法,并且在这个方法当中得到这个返回的结果

 

*线程保护状态

保存值:OnSaveInstanceState(Bundle outState){

outstate.putString(“name”,”helloworld”)      }

取值:OnRestoreInstanceState(savedInstanceState){

Stringname=savedInstanceState.getString(“name”);    }

现场保护、线程保护状态

Activity横竖屏幕切换或者非正常退出,需要保存一些数据,之后将其还原

 

onSaveInstanceState(BundleoutState) 保存数据

 

onPuase-onSaveInstanceState-onStop-onDestroy

 

onRestoreInstanceState(BundlesavedInstanceState) 恢复数据

 

onStart-onRestoreInstanceState-onResume

保存现场状态:

1、存到数据库(永久存储)

2、 保存到XML(临时和永久)

-->

2Intent,意图

启动Activity

各个组件之间的通信使用“意图”

// 参数1:当前页面,传递上下文

// 参数2:跳转的目的页面,传递Class类型的对象

// Intent intent =new Intent(this, NextActivity.class);

Intent intent = newIntent();

intent.setClass(MainActivity.this,NextActivity.class);

// 启动意图

startActivity(intent);

 

 

 

3、页面之间的传值  bundle:相当于map集合,存储的是键值对!!

a:

A页面,可以使用Intent对象的putExtra方法设置名值对

B页面,首先获得意图(getIntent()),之后使用相应的getStringExtragetIntExtra等方法获得值

b:使用Bundle传递数据

A页面,创建Bundle对象,之后使用put**方法,封装数据

Bundle bundle = newBundle();

//封装数据,设置键值对

bundle.putString("phone","110");

intent.putExtra("bundle",bundle);

B页面,使用Intent对象获得Bundle,之后使用相应的get**方法获得值

Bundle bundle =intent.getBundleExtra("bundle");

String phone =bundle.getString("phone");

c:

A页面,intent.putExtras(bundle);

B页面,Bundle bundle = intent.getExtras();

可以获得之前(MainActivity)使用putExtra封装的数据

d:传递对象,要求类可序列化

A页面,封装对象

intent.putExtra("p",p);

或者

bundle.putSerializable("p",p);

B页面,获得对象

Person p = (Person)intent.getSerializableExtra("p");

或者

Person p = (Person)bundle.getSerializable("p");

 

*关闭Activity

*finish();//结束Activity生命周期

*生命周期确切存在三种状态:     lifecycle

-Resumed:(重新启动、回到屏幕前面即用户可以操作)、

-Paused:暂停、长时间暂停可能被系统关闭(暂用内存比较大的时候)

-Stopped:停止状态、在内存中保持着,但是不能自动回到窗体当中,需要内存的情况下被系统关闭!比Paused的关闭的概率高!

==================================================================

5、生命周期

onCreate:第一次被调用。仅仅被调用一次。创建activity,初始化view或者绑定数据时调用。下一个方法是:onStart();

onStart:显示页面    

onResume:获得用户焦点,可以与用户进行交互

 

onPause:失去用户焦点,暂停与用户的交互

onStop:关闭页面,后台执行

onDestroy:销毁页面;

 

onRestart页面启动并回退,重新显示给用户,

级联操作onStart-onResume方法,可以与用户进行交互

 

一个程序开始执行:    onCreate--> onStart--> onResume开始交互

一个电话进来:      onPause--> onStop

挂掉电话:         onRestart--> onStart--> onResume

最后:             onPause-->onStop--> onDestroy

 

 

 

======================================================================

1、AsyncTask异步任务  2、AsyncTask下载网络图片    3、AsyncTask解析json和Xml数据

4、Android单元测试    5、GSON和FastJson工具类介绍

 

单元测试:AndroidManifest.xml文件-->Instrumentation-->add(Targetpackage,Name)保存

回到AndroidManifest.xml文件(发现多了targetOackage)-->在<application>节点下面添加单元测试包<uses-libraryandroid:name=”android.test.runner”> (自动生成保证正确)

在代码包下新建一个包****test-->在其下新建一个类继承AndroidTestCase;

 

 

 

 

 

 

 

 

 

======================================================================

1、Dialogs对话框使用;    2、自定义对话框         3、日期和日历控件对话框

4、Toast吐司对话框

 

*Dialogs对话框使用:是一个很小的窗口,让用户做决定。或者提交信息。通常是一个弹出窗体。而不是占满屏幕;比如:删除文件的对话框;网络异常的对话框;

       - 使用:不建议直接创建一个Dialog,而是建议使用它的几个之类:

 

*AlertDialog:警告框!可以显示一个标题,和1、2、3个按钮,或者自定义布局(确定、取消、忽略)需要AlertDialog。Builder

 

       - 用其内部类创建一个AlertDialog

              AlertDialog.Builder   builder=new AlertDialog.Builder();

-setTitle(“这是标题”);setMessage(“这是内容”);setIcon();设置图标

-setNegativeButton(“取消”,new事件) 设置取消按钮

-setNeutralButton(“忽略”, new事件) 设置中立按钮

-setPositiveButton(“确定”, new事件) 设置确定按钮

 

       事件一般是:OnDialogInterface.onClickListener()

       new 事件写为new DialogInterface. onClickListener()

 

       对话框消失:builder.dismiss();

 

*单选对话框:需要AlertDialog。Builder

 

SingleChoiceItems()

       问题:怎么获取witch角标的元素????

           publicvoid onClick(DialogInterface dialog, int which) {

              // TODO Auto-generated method stub

             

              Toast.makeText(MainActivity.this, "-->", 1).show();

*多选对话框:需要AlertDialog。Builder

       setMultiChoiceItems()

-多选对话框:勾选对话框选项并点击按钮,对话框才会消失

-setMultiChoiceItems(items,checkedItems,listener):

Items是一个数组,提供多选的选项。

checkedItems是默认的选项按钮,可以设置为null,也可以设置为boolean[]{true,false,true}

listener是事件可以写为new DialogInterface. OnDialogInterface.onClickListener()

 

 

*自定义对话框  需要AlertDialog。Builder

       Positive、Negative、Neutral

       -加载view:

              Viewview = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog,null);

//dialog是要加载的view

Builder.setView(view);

 

 

*DatePickerDialog日期对话框

可以直接new

事件:OnDateSetListener()

 

*TimePickerDialog时间对话框

          可以直接new

 

*toast 吐司

       makeText();

       show();

时长:duration();分为1和0

              -Toast.LENGTH_SHORT和Toast.LENGTH_LONG

       改变吐司的位置setGravity(int,int,int);

-toast. setGravity(Gravity.TOP|Gravity.LEFT,0,0);//左上面

 

*ProgressDialog加载数据横向或者圆形进度条对话框(0-10000刻度)

直接new

-setCancelable(false);设置点击空白区域不能取消事件//测试用true

-setProgressStyle(ProgressDialog.STYLE_HORIZONTAL):                 默认是圆形;STYLE_HORIZONTAL长条形;STYLE_SPINNER圆形

-setMax(100);最大刻度(100刻度)

-setProgress(int a);(0-10000)

-setSecondaryProgress(80);//第二进度条比如看视频的缓冲条

-dismiss

 

*自定义吐司:自定义布局

              - Toast toast = newToast(getApplactionContext());//后面可以设置属性

       -布局加载:View layout=LayoutInflater.form(MainActivity.this).inflate(R.layout.ts);

                            -setView(view)

 

 

 

 

 

 

 

 

 

 

 

 

      =================================================================

1、Android线程的概念       2、AsyncTask异步任务       3、HTTP网络访问图片

4、HTTP使用GET和POST方式提交      5、HTTP解析JSON和XML数据

 

 

1、Android线程的概念:主界面在运行,称UI主线程

*主线程不能访问网络;因为会阻塞!所以提交数据或者请求数据,需要在另一个线程中进行,这时候系统就要创建一个线程,并不是每一个都创建。线程和view交互。所有UI都运行在UI主线程,就会产生阻塞(anr )5秒钟,系统会杀死软件(弹出等待或卸载)。所以工作不能放在主线程

* 安卓UI是不安全的,所以UI主线程不能当做工作线程,所以安卓设置线程的模式:

        -不要阻塞UI主线程(不在UI主线程访问数据,请求数据)

        -UI控件也不要访问网络(控件都是在主线程)

*为了避免UI主线程阻塞;可以用handler机制来处理;或者用AsynTask异步任务(是一个线程框架);(没有学习handler之前可以用AsyncTask来做);

        -在工作线程中可能是阻塞的操作,把结果发布给UI;

*怎么用?

        -声明一个类来继承AsyncTask和实现doInBackground()方法;doInBackground()是一个线程

        -为了更新UI,可以实现onPostExecute()这个方法,把线程结果传递到UI上,然后就可以安全的更新UI。如果想执行这个线程,在UI中调用execute()方法;

      

*AsyncTask:

       三个参数:    Params :地址(String)

Progress :下载过来进度的单位,刻度(Integer)

Result :返回结果(byte[])

没有参数就(void,void,void)

四个步骤:  onPreExecute(), 在异步任务执行之前执行,用来构建异步任务,比如弹出进度对话框

doInBackground(),在后台执行线程。计算结果返回给最后一步,在步骤中间,可以把刻度进度发布给UI线程、发布给onProgressUpdate(),

onProgressUpdate(), 进度条更新

onPostExecute       (),

      

- *HttpClient:

*使用步骤:

*1、创建HttpClient对象  newDefaultHttpClient();

*2、创建请求对象 get请求--HttpGet对象  post请求--HttpPost对象

*3、设置传递参数

*4、请求连接得到响应信息 HttpResponse

*5、验证响应码--getStatusLine().getStatusCode()200进行操作

*6、读取内容  2种方式第一种使用HttpEntity getContent 第二种使用EntityUtils工具类toByteArray方法

*

*位图:无损压缩

Bitmap bitmap =BitmapFactory.decodeByteArray(result,0,result.length);

imageView.setImageBitmap(bitmap);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值