mirror of
https://github.com/Estom/notes.git
synced 2026-02-02 18:20:20 +08:00
Android&PHP
This commit is contained in:
28
Android/Activity.md
Normal file
28
Android/Activity.md
Normal file
@@ -0,0 +1,28 @@
|
||||
**Activity** 是用户可以执行的单一任务。Activity
|
||||
负责创建新的窗口供应用绘制和从系统中接收事件。Activity 是用 Java 编写的,扩展自
|
||||
[Activity](https://classroom.udacity.com/courses/ud851/lessons/93affc67-3f0b-4f9b-b3a4-a7a26f241a86/concepts/developer.android.com/reference/android/app/Activity.html)
|
||||
类
|
||||
|
||||
Activity 会创建**视图**来向用户显示信息,并使用户与 Activity 互动。视图是
|
||||
Android UI 框架中的类。它们占据了屏幕上的方形区域,负责绘制并处理事件。Activity
|
||||
通过读取 XML 布局文件确定要创建哪些视图(并放在何处)。正如 Dan 提到的,这些 XML
|
||||
文件存储在标记为 **layouts** 的 **res 文件夹**内。
|
||||
|
||||
Activity
|
||||
提供视图上的操作,UI类提供视图的展示格式,包括什么样的按钮,什么样的容器,什么样的文本框。
|
||||
|
||||
视图类型UI组件(具有互动性)、容器视图)容纳其他的UI组件或者视图。
|
||||
|
||||
视图的XML属性:
|
||||
|
||||
id,layout\_width,layout_height,layout_gravity,layout_margin,padding,
|
||||
|
||||
R 类
|
||||
|
||||
当你的应用被编译时,系统会生成
|
||||
[R](http://developer.android.youdaxue.com/reference/android/R.html)
|
||||
类。它会创建常量,使你能够动态地确定 res
|
||||
文件夹的各种内容,包括布局。要了解详情,请参阅关于[资源](http://developer.android.youdaxue.com/guide/topics/resources/accessing-resources.html)的文档。
|
||||
|
||||
本质上是 Android 会读取你的 XML 文件并为你的布局文件中的每个标记生成 Java
|
||||
对象。然后,你可以在 Java 代码中通过对 Java 对象调用方法修改这些对象。
|
||||
497
Android/Android布局属性大全.md
Normal file
497
Android/Android布局属性大全.md
Normal file
@@ -0,0 +1,497 @@
|
||||
第一类:属性值为true或false
|
||||
|
||||
android:layout_centerHrizontal 水平居中
|
||||
|
||||
android:layout_centerVertical 垂直居中
|
||||
|
||||
android:layout_centerInparent 相对于父元素完全居中
|
||||
|
||||
android:layout_alignParentBottom 贴紧父元素的下边缘
|
||||
|
||||
android:layout_alignParentLeft 贴紧父元素的左边缘
|
||||
|
||||
android:layout_alignParentRight 贴紧父元素的右边缘
|
||||
|
||||
android:layout_alignParentTop 贴紧父元素的上边缘
|
||||
|
||||
android:layout_alignWithParentIfMissing
|
||||
如果对应的兄弟元素找不到的话就以父元素做参照物
|
||||
|
||||
第二类:属性值必须为id的引用名”
|
||||
|
||||
android:layout_below 在某元素的下方
|
||||
|
||||
android:layout_above 在某元素的的上方
|
||||
|
||||
android:layout_toLeftOf 在某元素的左边
|
||||
|
||||
android:layout_toRightOf 在某元素的右边
|
||||
|
||||
android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐
|
||||
|
||||
android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐
|
||||
|
||||
android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐
|
||||
|
||||
android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐
|
||||
|
||||
第三类:属性值为具体的像素值,如30dip,40px
|
||||
|
||||
android:layout_marginBottom 离某元素底边缘的距离
|
||||
|
||||
android:layout_marginLeft 离某元素左边缘的距离
|
||||
|
||||
android:layout_marginRight 离某元素右边缘的距离
|
||||
|
||||
android:layout_marginTop 离某元素上边缘的距离
|
||||
|
||||
EditText的android:hint 设置EditText为空时输入框内的提示信息。
|
||||
|
||||
android:gravity
|
||||
|
||||
android:gravity属性是对该view 内容的限定.比如一个button 上面的text.
|
||||
你可以设置该text
|
||||
在view的靠左,靠右等位置.以button为例,android:gravity="right"则button上面的文字靠右
|
||||
|
||||
android:layout\_gravity
|
||||
|
||||
android:layout_gravity是用来设置该view相对与起父view 的位置.比如一个button
|
||||
在linearlayout里,你想把该button放在靠左、靠右等位置就可以通过该属性设置.以button为例,android:layout_gravity="right"则button靠右
|
||||
|
||||
android:scaleType:
|
||||
|
||||
android:scaleType是控制图片如何resized/moved来匹对ImageView的size。ImageView.ScaleType
|
||||
/ android:scaleType值的意义区别:
|
||||
|
||||
CENTER /center
|
||||
按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示
|
||||
|
||||
CENTER_CROP / centerCrop
|
||||
按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)
|
||||
|
||||
CENTER_INSIDE / centerInside
|
||||
将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
|
||||
|
||||
FIT_CENTER / fitCenter 把图片按比例扩大/缩小到View的宽度,居中显示
|
||||
|
||||
FIT_END / fitEnd 把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置
|
||||
|
||||
FIT_START / fitStart 把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置
|
||||
|
||||
FIT_XY / fitXY 把图片不按比例扩大/缩小到View的大小显示
|
||||
|
||||
MATRIX / matrix 用矩阵来绘制,动态缩小放大图片来显示。
|
||||
|
||||
\*\* 要注意一点,Drawable文件夹里面的图片命名是不能大写的。
|
||||
|
||||
\-------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
android:id
|
||||
|
||||
为控件指定相应的ID
|
||||
|
||||
android:text
|
||||
|
||||
指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串
|
||||
|
||||
android:gravity
|
||||
|
||||
指定View组件的对齐方式,比如说居中,居右等位置
|
||||
这里指的是控件中的文本位置并不是控件本身
|
||||
|
||||
android:layout\_gravity
|
||||
|
||||
指定Container组件的对齐方式.比如一个button
|
||||
在linearlayout里,你想把该button放在靠左、靠右等位置就可以通过该属性设置.以button为例,android:layout_gravity="right"则button靠右
|
||||
|
||||
android:textSize
|
||||
|
||||
指定控件当中字体的大小
|
||||
|
||||
android:background
|
||||
|
||||
指定该控件所使用的背景色,RGB命名法
|
||||
|
||||
android:width
|
||||
|
||||
指定控件的宽度
|
||||
|
||||
android:height
|
||||
|
||||
指定控件的高度
|
||||
|
||||
android:layout\_width
|
||||
|
||||
指定Container组件的宽度
|
||||
|
||||
android:layout\_height
|
||||
|
||||
指定Container组件的高度
|
||||
|
||||
android:layout\_weight
|
||||
|
||||
View中很重要的属性,按比例划分空间
|
||||
|
||||
android:padding\*
|
||||
|
||||
指定控件的内边距,也就是说控件当中的内容
|
||||
|
||||
android:sigleLine
|
||||
|
||||
如果设置为真的话,则控件的内容在同一行中进行显示
|
||||
|
||||
android:scaleType
|
||||
|
||||
是控制图片如何resized/moved来匹对ImageView的siz
|
||||
|
||||
android:layout\_centerHrizontal
|
||||
|
||||
水平居中
|
||||
|
||||
android:layout\_centerVertical
|
||||
|
||||
垂直居中
|
||||
|
||||
android:layout\_centerInparent
|
||||
|
||||
相对于父元素完全居中
|
||||
|
||||
android:layout\_alignParentBottom
|
||||
|
||||
贴紧父元素的下边缘
|
||||
|
||||
android:layout\_alignParentLeft
|
||||
|
||||
贴紧父元素的左边缘
|
||||
|
||||
android:layout\_alignParentRight
|
||||
|
||||
贴紧父元素的右边缘
|
||||
|
||||
android:layout\_alignParentTop
|
||||
|
||||
贴紧父元素的上边缘
|
||||
|
||||
android:layout\_alignWithParentIfMissing
|
||||
|
||||
如果对应的兄弟元素找不到的话就以父元素做参照物
|
||||
|
||||
android:layout\_below
|
||||
|
||||
在某元素的下方
|
||||
|
||||
android:layout\_above
|
||||
|
||||
在某元素的的上方
|
||||
|
||||
android:layout\_toLeftOf
|
||||
|
||||
在某元素的左边
|
||||
|
||||
android:layout\_toRightOf
|
||||
|
||||
在某元素的右边
|
||||
|
||||
android:layout\_alignTop
|
||||
|
||||
本元素的上边缘和某元素的的上边缘对齐
|
||||
|
||||
android:layout\_alignLeft
|
||||
|
||||
本元素的左边缘和某元素的的左边缘对齐
|
||||
|
||||
android:layout\_alignBottom
|
||||
|
||||
本元素的下边缘和某元素的的下边缘对齐
|
||||
|
||||
android:layout\_alignRight
|
||||
|
||||
本元素的右边缘和某元素的的右边缘对齐
|
||||
|
||||
android:layout\_marginBottom
|
||||
|
||||
离某元素底边缘的距离
|
||||
|
||||
android:layout\_marginLeft
|
||||
|
||||
离某元素左边缘的距离
|
||||
|
||||
android:layout\_marginRight
|
||||
|
||||
离某元素右边缘的距离
|
||||
|
||||
android:layout\_marginTop
|
||||
|
||||
离某元素上边缘的距离
|
||||
|
||||
android:paddingLeft
|
||||
|
||||
本元素内容离本元素右边缘的距离
|
||||
|
||||
android:paddingRight
|
||||
|
||||
本元素内容离本元素上边缘的距离
|
||||
|
||||
android:hint
|
||||
|
||||
设置EditText为空时输入框内的提示信息
|
||||
|
||||
android:LinearLayout
|
||||
|
||||
它确定了LinearLayout的方向,其值可以为vertical,
|
||||
表示垂直布局horizontal,表示水平布局
|
||||
|
||||
\-----------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
android:interpolator
|
||||
|
||||
可能有很多人不理解它的用法,文档里说的也不太清楚,其实很简单,看下面:interpolator定义一个动画的变化率(the
|
||||
rate of change)。这使得基本的动画效果(alpha, scale, translate,
|
||||
rotate)得以加速,减速,重复等。用通俗的一点的话理解就是:动画的进度使用
|
||||
Interpolator 控制。interpolator
|
||||
定义了动画的变化速度,可以实现匀速、正加速、负加速、无规则变加速等。Interpolator
|
||||
是基类,封装了所有 Interpolator 的共同方法,它只有一个方法,即 getInterpolation
|
||||
(float input),该方法 maps a point on the timeline to a multiplier to be applied
|
||||
to the transformations of an animation。Android 提供了几个 Interpolator
|
||||
子类,实现了不同的速度曲线,如下:
|
||||
|
||||
AccelerateDecelerateInterpolator
|
||||
在动画开始与介绍的地方速率改变比较慢,在中间的时侯加速
|
||||
|
||||
AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
|
||||
|
||||
CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
|
||||
|
||||
DecelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始减速
|
||||
|
||||
LinearInterpolator 在动画的以均匀的速率改变
|
||||
|
||||
对于 LinearInterpolator ,变化率是个常数,即 f (x) = x.
|
||||
|
||||
public float getInterpolation(float input) {
|
||||
|
||||
return input;
|
||||
|
||||
}
|
||||
|
||||
Interpolator其他的几个子类,也都是按照特定的算法,实现了对变化率。还可以定义自己的
|
||||
Interpolator 子类,实现抛物线、自由落体等物理效果。
|
||||
|
||||
Xml代码
|
||||
|
||||
\<!--
|
||||
|
||||
FrameLayout ——
|
||||
里面只可以有一个控件,并且不能设计这个控件的位置,控件会放到左上角
|
||||
|
||||
LinearLayout —— 里面可以放多个控件,但是一行只能放一个控件
|
||||
|
||||
TableLayout —— 这个要和TableRow配合使用,很像html里面的table
|
||||
|
||||
AbsoluteLayout —— 里面可以放多个控件,并且可以自己定义控件的x,y的位置
|
||||
|
||||
RelativeLayout —— 里面可以放多个控件,不过控件的位置都是相对位置
|
||||
|
||||
(界面的布局好像还可以直接引用一些view,如ScrollView等)
|
||||
|
||||
Xml代码
|
||||
|
||||
android:orientation ——
|
||||
它确定了LinearLayout的方向,其值可以为\*vertical,表示垂直布局 \*horizontal,
|
||||
表示水平布局
|
||||
|
||||
Xml代码
|
||||
|
||||
android:layout_width ——
|
||||
指在父控件中当前控件的宽,可以设定其确定的值,但一般使用下面两个值\*fill_parent,填满父控件的空白\*wrap_content,表示大小刚好足够显示当前控件里的内容
|
||||
|
||||
Xml代码
|
||||
|
||||
android:layout_height ——
|
||||
指明了在父控件中当前控件的高,可以设定其确定的值,但一般使用下面两个值\*fill_parent,填满父控件的空白\*wrap_content,表示大小刚好足够显示当前控件里的内容
|
||||
|
||||
Xml代码
|
||||
|
||||
android:id —— 为控件指定相应的ID
|
||||
|
||||
Xml代码
|
||||
|
||||
android:text ——
|
||||
指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串
|
||||
|
||||
Xml代码
|
||||
|
||||
android:grivity ——
|
||||
指定控件的基本位置,比如说居中,居右等位置。如果是没有子控件的view设置此属性,表示内容的对齐方式;如果是有子控件的view设置此属性,则表示子控件的对齐方式(重力倾向),其值需要多个时,用“\|”分开)
|
||||
|
||||
Xml代码
|
||||
|
||||
android:textSize —— 指定控件当中字体的大小
|
||||
|
||||
Xml代码
|
||||
|
||||
android:background ——
|
||||
指定该控件所使用的背景色,RGB命名法。如果设置一个透明的背景图片按钮android:background="@android:color/transparent"
|
||||
|
||||
Xml代码
|
||||
|
||||
android:width —— 指定控件的宽度
|
||||
|
||||
Xml代码
|
||||
|
||||
android:height —— 指定控件的高度
|
||||
|
||||
Xml代码
|
||||
|
||||
android:padding\* —— 指定控件的内边距,也就是说控件当中的内容
|
||||
|
||||
Xml代码
|
||||
|
||||
android:sigleLine —— 如果设置为真的话,则将控件的内容在同一行当中进行显示
|
||||
|
||||
Xml代码
|
||||
|
||||
android:src ——
|
||||
引用资源,例如:应用另一个XML,android:src="@drawable/imageselector"
|
||||
|
||||
Xml代码
|
||||
|
||||
android:layout_alignBottom ——
|
||||
属性是用来与某控件的底部对齐。例如:android:layout\_alignBottom="@id/TVfilepath"
|
||||
|
||||
Xml代码
|
||||
|
||||
android:layout_marginRight ——
|
||||
属性设置边缘空白,有上下左右之分。例如:android:layout\_marginRight="3dip"
|
||||
|
||||
Xml代码
|
||||
|
||||
android:layout_gravity属性设置该控件位于父控件的位置。例如:android:layout\_gravity="center_vertical"
|
||||
|
||||
Xml代码
|
||||
|
||||
第一类:属性值为true或false
|
||||
|
||||
android:layout_centerHorizontal ——
|
||||
如果值为真,该控件将被至于水平方向的中央(水平居中)
|
||||
|
||||
android:layout_centerVertical ——
|
||||
如果值为真,该控件将被至于垂直方向的中央(垂直居中)
|
||||
|
||||
android:layout_centerInParent ——
|
||||
如果值为真,该控件将被至于父控件水平方向和垂直方向的中央(相对于父元素完全居中 )
|
||||
|
||||
android:layout_alignParentBottom ——
|
||||
如果该值为true,则将该控件的底部和父控件的底部对齐(贴紧父元素的下边缘)
|
||||
|
||||
android:layout_alignParentLeft ——
|
||||
如果该值为true,则将该控件的左边与父控件的左边对齐(贴紧父元素的左边缘)
|
||||
|
||||
android:layout_alignParentRight ——
|
||||
如果该值为true,则将该控件的右边与父控件的右边对齐(贴紧父元素的右边缘)
|
||||
|
||||
android:layout_alignParentTop ——
|
||||
如果该值为true,则将空间的顶部与父控件的顶部对齐(贴紧父元素的上边缘)
|
||||
|
||||
android:layout_alignWithParentIfMissing ——
|
||||
如果对应的兄弟元素找不到的话就以父元素做参照物
|
||||
|
||||
Xml代码
|
||||
|
||||
第二类:属性值必须为id的引用名“@id/id-name”
|
||||
|
||||
android:layout_above —— 将该控件的底部至于给定ID的控件之上(在某元素的的上方)
|
||||
|
||||
android:layout_below —— 将该控件的顶部至于给定ID的控件之下(在某元素的下方 )
|
||||
|
||||
android:layout_toLeftOf ——
|
||||
将该控件的右边缘和给定ID的控件的左边缘对齐(在某元素的左边 )
|
||||
|
||||
android:layout_toRightOf ——
|
||||
将该控件的左边缘和给定ID的控件的右边缘对齐(在某元素的左边 )
|
||||
|
||||
android:layout_alignTop ——
|
||||
将给定控件的顶部边缘与给定ID控件的顶部对齐(本元素的上边缘和某元素的的上边缘对齐)
|
||||
|
||||
android:layout_alignBottom ——
|
||||
将该控件的底部边缘与给定ID控件的底部边缘(本元素的下边缘和某元素的的下边缘对齐 )
|
||||
|
||||
android:layout_alignLeft ——
|
||||
将该控件的左边缘与给定ID控件的左边缘对齐(本元素的左边缘和某元素的的左边缘对齐)
|
||||
|
||||
android:layout_alignRight ——
|
||||
将该控件的右边缘与给定ID控件的右边缘对齐(本元素的右边缘和某元素的的右边缘对齐)
|
||||
|
||||
android:layout_alignBaseline —— 该控件的baseline和给定ID的控件的baseline对齐
|
||||
|
||||
Xml代码
|
||||
|
||||
EditText的android:hint
|
||||
|
||||
设置EditText为空时输入框内的提示信息。
|
||||
|
||||
android:gravity
|
||||
|
||||
android:gravity属性是对该view 内容的限定.比如一个button 上面的text.
|
||||
你可以设置该text
|
||||
在view的靠左,靠右等位置.以button为例,android:gravity="right"则button上面的文字靠右
|
||||
|
||||
android:layout\_gravity
|
||||
|
||||
android:layout_gravity是用来 设置该view相对与起父view 的位置.比如一个button
|
||||
在linearlayout里,你想把该button放在靠左、靠右等位置就可以通过该属性设置.以button为例,android:layout_gravity="right"则button靠右
|
||||
|
||||
android:layout\_alignParentRight
|
||||
|
||||
使 当前控件的右端和父控件的右端对齐。这里属性值只能为true或false,默认false。
|
||||
|
||||
android:scaleType:
|
||||
|
||||
android:scaleType是控制图片如何
|
||||
resized/moved来匹对ImageView的size。ImageView.ScaleType /
|
||||
android:scaleType值的意义区别:
|
||||
|
||||
CENTER /center
|
||||
按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示
|
||||
|
||||
CENTER_CROP / centerCrop
|
||||
按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)
|
||||
|
||||
CENTER_INSIDE / centerInside
|
||||
将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
|
||||
|
||||
FIT_CENTER / fitCenter 把图片按比例扩大/缩小到View的宽度,居中显示
|
||||
|
||||
FIT_END / fitEnd 把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置
|
||||
|
||||
FIT_START / fitStart 把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置
|
||||
|
||||
FIT_XY / fitXY 把图片不按比例扩大/缩小到View的大小显示
|
||||
|
||||
MATRIX / matrix 用矩阵来绘制,动态缩小放大图片来显示。
|
||||
|
||||
\*\* 要注意一点,Drawable文件夹里面的图片命名是不能大写的
|
||||
|
||||
\--\>
|
||||
|
||||
http://panshengneng.iteye.com/blog/1187928
|
||||
|
||||
Layout_margn与padding的区别:
|
||||
|
||||
**layout_margn**是指组件距离父窗体的距离,而padding是指组件中的内容距离组件边缘的距离
|
||||
|
||||
与子对应的**Layout_grivaty**与**grivaty**这两者有点相似,**layout_grivaty**是指组件相对父窗体显示的位置,而**grivaty**是用来控制组件中的内容显示位置:比如
|
||||
|
||||
**layout_grivaty="center_vertical\|center_horizontal"**;表示组件显示是水平居中且垂直居中也就是组件位于屏幕的正中央
|
||||
|
||||
Android**:gravity="center_vertical\|center_horizontal"**表示组件中的内容显示位置是正中央。
|
||||
|
||||
我们也可以这样来理解,layout_margn与layout_grivaty都与布局有关,控制组件在屏幕中的显示位置
|
||||
|
||||
padding与grivaty都是用来控制内容在组件中的显示位置
|
||||
|
||||
那么,layout_margn与layout_grivaty有什么区别呢?grivaty与padding又有什么区别呢?
|
||||
|
||||
区别:layout_grivaty与grivaty的值都是给定的,我们只能在这些给定的属性中选择
|
||||
|
||||
layout_margn与padding的值我们可以任意给,相对于layout_grivaty和grivaty更灵活,我们根据需要选择合适的属性。
|
||||
493
Android/Android数据存储于IO接口.md
Normal file
493
Android/Android数据存储于IO接口.md
Normal file
@@ -0,0 +1,493 @@
|
||||
Android 内置了sqlife数据库
|
||||
|
||||
**使用sharePreferences**
|
||||
|
||||
- 使用方法,SharedPreferences负责读取数据,SharedPreferences.Editor负责写入数据。
|
||||
|
||||
- contains()是否包含指定key的数据
|
||||
|
||||
- getAll()获取sharedPreferences数据里全部的keyValue对
|
||||
|
||||
- getXX()得到指定键的值
|
||||
|
||||
- clear()清空用户配置
|
||||
|
||||
- putXxx()存入键值对
|
||||
|
||||
- remove()删除键值对
|
||||
|
||||
- commit()提交修改
|
||||
|
||||
- 只能通过Context.getSharedPreferences(String,int)方式来获取Preferences的一个实例。
|
||||
|
||||
**File存储**
|
||||
|
||||
- FileInputStream openFileInput(String
|
||||
name)打开应用程序数据文件夹下的那么文件对应的输入流
|
||||
|
||||
- FileOutputStream openFileOutput(String name , int
|
||||
mode)打开应用程序数据文件夹下的name文件对应的输出流。模式分别有MODE_PRIVATE(只能被当前程序读写),MODE_APPEND(追加方式,应用程序读写),MODE_WORLD_READABLE(被其他程序读取),MODE_WORLD+WRITEABLE(由其他程序读写)
|
||||
|
||||
- 相关方法
|
||||
|
||||
- getDir()创建name对应的子目录
|
||||
|
||||
- getFilesDir()获取应用程序的数据文件夹的绝对路径
|
||||
|
||||
- fileList()返回应用程序的数据文件夹下的全部文件
|
||||
|
||||
- deleteFile()删除数据文件夹下的制定文件
|
||||
|
||||
- 读取SD卡上的文件
|
||||
|
||||
- Environment.getExternalStorageState()判断是否插入了SD卡
|
||||
|
||||
- Environment.getExternalStorageDirectory()获取外部存储器
|
||||
|
||||
- FileInputStream、FileOutputStream、FileReader、FileWriter读写sd卡内容
|
||||
|
||||
- 权限配置,创建删除文件的权限和向sd卡中写入数据的权限:
|
||||
|
||||
\<user-permission
|
||||
android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/\>\<USER-permission
|
||||
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/\>
|
||||
|
||||
- 1
|
||||
|
||||
- 2
|
||||
|
||||
**SQLife数据库**
|
||||
|
||||
- sqlife数据的格式
|
||||
|
||||
一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断。SQLite具有以下五种常用的数据类型:
|
||||
|
||||
NULL: 这个值为空值
|
||||
|
||||
VARCHAR(n):长度不固定且其最大长度为 n 的字串,n不能超过 4000。
|
||||
|
||||
CHAR(n):长度固定为n的字串,n不能超过 254。
|
||||
|
||||
INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8.
|
||||
|
||||
REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.
|
||||
|
||||
TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).
|
||||
|
||||
BLOB: 值是BLOB数据块,以输入的数据格式进行存储。如何输入就如何存储,不改 变格式。
|
||||
|
||||
DATA :包含了 年份、月份、日期。
|
||||
|
||||
TIME: 包含了 小时、分钟、秒。
|
||||
|
||||
- SQLife提供的数据库访问方式:
|
||||
|
||||
| 方法名称 | 方法表示含义 |
|
||||
|--------------------------------------------------------------------------------------------------------------------------|------------------|
|
||||
| openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory) | 打开或创建数据库 |
|
||||
| insert(String table,String nullColumnHack,ContentValues values) | 插入一条记录 |
|
||||
| delete(String table,String whereClause,String[] whereArgs) | 删除一条记录 |
|
||||
| query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy) | 查询一条记录 |
|
||||
| update(String table,ContentValues values,String whereClause,String[] whereArgs) | 修改记录 |
|
||||
| execSQL(String sql) | 执行一条SQL语句 |
|
||||
| close() | 关闭数据库 |
|
||||
|
||||
Google公司命名这些方法的名称都是非常形象的。例如openOrCreateDatabase,我们从字面英文含义就能看出这是个打开或创建数据库的方法。
|
||||
|
||||
- SQLife进行数据库操作的具体步骤
|
||||
|
||||
1. 获取SQLife对象,它代表了与数据库的链接
|
||||
|
||||
2. 调用SQLife的方法,来执行SQL语句
|
||||
|
||||
3. 操作SQL语句的执行结果,用SimpleCursorAdaptor封装Cursor
|
||||
|
||||
4. 关闭SQLifeDatabase,回收资源。
|
||||
|
||||
- SQLite3工具
|
||||
|
||||
- 只支持五中基本数据类型。null,integer,real,text,blob.
|
||||
|
||||
- 使用slite3工具执行相应的命令,能够通过命令行管理数据库
|
||||
|
||||
- 弱类型的数据库,能够将任何数据类型保存到任何数据类型当中,在创建数据库的时候不必声明具体的数据类型。(主键除外)例如:
|
||||
|
||||
create table mytest{ id integer primary key, name , gender, pass , }
|
||||
|
||||
- 1
|
||||
|
||||
- 2
|
||||
|
||||
- 3
|
||||
|
||||
- 4
|
||||
|
||||
- 5
|
||||
|
||||
- 6
|
||||
|
||||
**SQLife具体的操作方式说明**
|
||||
|
||||
1. 打开或者创建数据库
|
||||
|
||||
在Android 中使用SQLiteDatabase的静态方法openOrCreateDatabase(String
|
||||
path,SQLiteDatabae.CursorFactory
|
||||
factory)打开或者创建一个数据库。它会自动去检测是否存在这个数据库,如果存在则打开,不存在则创建一个数据库;创建成功则返回一个SQLiteDatabase对象,否则抛出异常FileNotFoundException。
|
||||
|
||||
下面是创建名为“stu.db”数据库的代码:
|
||||
|
||||
openOrCreateDatabase(String path,SQLiteDatabae.CursorFactory factory)
|
||||
|
||||
参数1 数据库创建的路径
|
||||
|
||||
参数2 一般设置为null就可以了
|
||||
|
||||
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
|
||||
|
||||
db=SQLiteDatabase.openOrCreateDatabase(“/data/data/com.lingdududu.db/databases/stu.db”,null);
|
||||
|
||||
1. 创建表
|
||||
|
||||
创建一张表的步骤很简单:
|
||||
|
||||
编写创建表的SQL语句
|
||||
|
||||
调用SQLiteDatabase的execSQL()方法来执行SQL语句
|
||||
|
||||
下面的代码创建了一张用户表,属性列为:id(主键并且自动增加)、sname(学生姓名)、snumber(学号)
|
||||
|
||||
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
|
||||
|
||||
private void createTable(SQLiteDatabase db){
|
||||
|
||||
//创建表SQL语句
|
||||
|
||||
String stu_table=”create table usertable(_id integer primary key
|
||||
autoincrement,sname text,snumber text)”;
|
||||
|
||||
//执行SQL语句
|
||||
|
||||
db.execSQL(stu_table);
|
||||
|
||||
}
|
||||
|
||||
1. 插入数据
|
||||
|
||||
插入数据有两种方法:
|
||||
|
||||
①SQLiteDatabase的insert(String table,String nullColumnHack,ContentValues
|
||||
values)方法,
|
||||
|
||||
参数1 表名称,
|
||||
|
||||
参数2 空列的默认值
|
||||
|
||||
参数3 ContentValues类型的一个封装了列名称和列值的Map;
|
||||
|
||||
②编写插入数据的SQL语句,直接调用SQLiteDatabase的execSQL()方法来执行
|
||||
|
||||
第一种方法的代码:
|
||||
|
||||
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
|
||||
|
||||
private void insert(SQLiteDatabase db){
|
||||
|
||||
//实例化常量值
|
||||
|
||||
ContentValues cValue = new ContentValues();
|
||||
|
||||
//添加用户名
|
||||
|
||||
cValue.put(“sname”,”xiaoming”);
|
||||
|
||||
//添加密码
|
||||
|
||||
cValue.put(“snumber”,”01005”);
|
||||
|
||||
//调用insert()方法插入数据
|
||||
|
||||
db.insert(“stu_table”,null,cValue);
|
||||
|
||||
}
|
||||
|
||||
第二种方法的代码:
|
||||
|
||||
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
|
||||
|
||||
private void insert(SQLiteDatabase db){
|
||||
|
||||
//插入数据SQL语句
|
||||
|
||||
String stu\_sql=”insert into stu_table(sname,snumber)
|
||||
values(‘xiaoming’,’01005’)”;
|
||||
|
||||
//执行SQL语句
|
||||
|
||||
db.execSQL(sql);
|
||||
|
||||
}
|
||||
|
||||
1. 删除数据
|
||||
|
||||
删除数据也有两种方法:
|
||||
|
||||
①调用SQLiteDatabase的delete(String table,String whereClause,String[]
|
||||
whereArgs)方法
|
||||
|
||||
参数1 表名称
|
||||
|
||||
参数2 删除条件
|
||||
|
||||
参数3 删除条件值数组
|
||||
|
||||
②编写删除SQL语句,调用SQLiteDatabase的execSQL()方法来执行删除。
|
||||
|
||||
第一种方法的代码:
|
||||
|
||||
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
|
||||
|
||||
private void delete(SQLiteDatabase db) {
|
||||
|
||||
//删除条件
|
||||
|
||||
String whereClause = “id=?”;
|
||||
|
||||
//删除条件参数
|
||||
|
||||
String[] whereArgs = {String.valueOf(2)};
|
||||
|
||||
//执行删除
|
||||
|
||||
db.delete(“stu_table”,whereClause,whereArgs);
|
||||
|
||||
}
|
||||
|
||||
第二种方法的代码:
|
||||
|
||||
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
|
||||
|
||||
private void delete(SQLiteDatabase db) {
|
||||
|
||||
//删除SQL语句
|
||||
|
||||
String sql = “delete from stu_table where \_id = 6”;
|
||||
|
||||
//执行SQL语句
|
||||
|
||||
db.execSQL(sql);
|
||||
|
||||
}
|
||||
|
||||
1. 修改数据
|
||||
|
||||
修改数据有两种方法:
|
||||
|
||||
①调用SQLiteDatabase的update(String table,ContentValues values,String
|
||||
whereClause, String[] whereArgs)方法
|
||||
|
||||
参数1 表名称
|
||||
|
||||
参数2 跟行列ContentValues类型的键值对Key-Value
|
||||
|
||||
参数3 更新条件(where字句)
|
||||
|
||||
参数4 更新条件数组
|
||||
|
||||
②编写更新的SQL语句,调用SQLiteDatabase的execSQL执行更新。
|
||||
|
||||
第一种方法的代码:
|
||||
|
||||
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
|
||||
|
||||
private void update(SQLiteDatabase db) {
|
||||
|
||||
//实例化内容值 ContentValues values = new ContentValues();
|
||||
|
||||
//在values中添加内容
|
||||
|
||||
values.put(“snumber”,”101003”);
|
||||
|
||||
//修改条件
|
||||
|
||||
String whereClause = “id=?”;
|
||||
|
||||
//修改添加参数
|
||||
|
||||
String[] whereArgs={String.valuesOf(1)};
|
||||
|
||||
//修改
|
||||
|
||||
db.update(“usertable”,values,whereClause,whereArgs);
|
||||
|
||||
}
|
||||
|
||||
第二种方法的代码:
|
||||
|
||||
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
|
||||
|
||||
private void update(SQLiteDatabase db){
|
||||
|
||||
//修改SQL语句
|
||||
|
||||
String sql = “update stu_table set snumber = 654321 where id = 1”;
|
||||
|
||||
//执行SQL
|
||||
|
||||
db.execSQL(sql);
|
||||
|
||||
}
|
||||
|
||||
1. 查询数据
|
||||
|
||||
在Android中查询数据是通过Cursor类来实现的,当我们使用SQLiteDatabase.query()方法时,会得到一个Cursor对象,Cursor指向的就是每一条数据。它提供了很多有关查询的方法,具体方法如下:
|
||||
|
||||
public Cursor query(String table,String[] columns,String selection,String[]
|
||||
selectionArgs,String groupBy,String having,String orderBy,String limit);
|
||||
|
||||
各个参数的意义说明:
|
||||
|
||||
参数table:表名称
|
||||
|
||||
参数columns:列名称数组
|
||||
|
||||
参数selection:条件字句,相当于where
|
||||
|
||||
参数selectionArgs:条件字句,参数数组
|
||||
|
||||
参数groupBy:分组列
|
||||
|
||||
参数having:分组条件
|
||||
|
||||
参数orderBy:排序列
|
||||
|
||||
参数limit:分页查询限制
|
||||
|
||||
参数Cursor:返回值,相当于结果集ResultSet
|
||||
|
||||
Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等.
|
||||
|
||||
Cursor游标常用方法
|
||||
|
||||
方法名称
|
||||
|
||||
方法描述
|
||||
|
||||
getCount()
|
||||
|
||||
获得总的数据项数
|
||||
|
||||
isFirst()
|
||||
|
||||
判断是否第一条记录
|
||||
|
||||
isLast()
|
||||
|
||||
判断是否最后一条记录
|
||||
|
||||
moveToFirst()
|
||||
|
||||
移动到第一条记录
|
||||
|
||||
moveToLast()
|
||||
|
||||
移动到最后一条记录
|
||||
|
||||
move(int offset)
|
||||
|
||||
移动到指定记录
|
||||
|
||||
moveToNext()
|
||||
|
||||
移动到下一条记录
|
||||
|
||||
moveToPrevious()
|
||||
|
||||
移动到上一条记录
|
||||
|
||||
getColumnIndexOrThrow(String columnName)
|
||||
|
||||
根据列名称获得列索引
|
||||
|
||||
getInt(int columnIndex)
|
||||
|
||||
获得指定列索引的int类型值
|
||||
|
||||
getString(int columnIndex)
|
||||
|
||||
获得指定列缩影的String类型值
|
||||
|
||||
下面就是用Cursor来查询数据库中的数据,具体代码如下:
|
||||
|
||||
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
|
||||
|
||||
private void query(SQLiteDatabase db) {
|
||||
|
||||
//查询获得游标
|
||||
|
||||
Cursor cursor = db.query (“usertable”,null,null,null,null,null,null);
|
||||
|
||||
//判断游标是否为空 if(cursor.moveToFirst() { //遍历游标 for(int
|
||||
i=0;i\<cursor.getCount();i++){ cursor.move(i); //获得ID int id =
|
||||
cursor.getInt(0); //获得用户名 String username=cursor.getString(1); //获得密码
|
||||
String password=cursor.getString(2); //输出用户信息
|
||||
System.out.println(id+":"+sname+":"+snumber); } }
|
||||
|
||||
}
|
||||
|
||||
1. 删除指定表
|
||||
|
||||
编写插入数据的SQL语句,直接调用SQLiteDatabase的execSQL()方法来执行
|
||||
|
||||
1. onCreate(SQLiteDatabase)
|
||||
|
||||
在数据库第一次生成的时候会调用这个方法,也就是说,只有在创建数据库的时候才会调用,当然也有一些其它的情况,一般我们在这个方法里边生成数据库表。
|
||||
|
||||
1. onUpgrade(SQLiteDatabase,int,int)
|
||||
|
||||
当数据库需要升级的时候,Android系统会主动的调用这个方法。一般我们在这个方法里边删除数据表,并建立新的数据表,当然是否还需要做其他的操作,完全取决于应用的需求。
|
||||
|
||||
1. onOpen(SQLiteDatabase):
|
||||
|
||||
这是当打开数据库时的回调函数,一般在程序中不是很常使用。
|
||||
|
||||
1. synchonized SQLiteDatabase getReadableDatabase()
|
||||
|
||||
以读写的方式打开数据库对应的SQLliteDatebase对象
|
||||
|
||||
1. synchonized SQLiteDatabase getWritableDatabase()
|
||||
|
||||
以写的方式打开对应的对象
|
||||
|
||||
1. close
|
||||
|
||||
关闭所有打开的SQLiteDatabase对象
|
||||
|
||||
[java] view plain copy print?在CODE上查看代码片派生到我的代码片
|
||||
|
||||
private void drop(SQLiteDatabase db){
|
||||
|
||||
//删除表的SQL语句
|
||||
|
||||
String sql =”DROP TABLE stu_table”;
|
||||
|
||||
//执行SQL
|
||||
|
||||
db.execSQL(sql);
|
||||
|
||||
}
|
||||
|
||||
1. 事务处理
|
||||
|
||||
beginTransction()开始事务
|
||||
|
||||
endTransaction()结束事务
|
||||
|
||||
inTrasaction()判断是否处于事务当中。
|
||||
|
||||
setTransactionSuccessful()判断事务是提交还是回滚的函数。具体提交回滚是在endTransaction()部分实现。
|
||||
|
||||
1. SQLiteOpenHelper
|
||||
|
||||
该类是SQLiteDatabase一个辅助类。这个类主要生成一个数据库,并对数据库的版本进行管理。当在程序当中调用这个类的方法getWritableDatabase()或者
|
||||
getReadableDatabase()方法的时候,如果当时没有数据,那么Android系统就会自动生成一个数据库。
|
||||
SQLiteOpenHelper 是一个抽象类,我们通常需要继承它,并且实现里面的3个函数:
|
||||
16
Android/Dialog.md
Normal file
16
Android/Dialog.md
Normal file
@@ -0,0 +1,16 @@
|
||||
**\>对话框**
|
||||
|
||||
- AlertDialog
|
||||
|
||||
1. 组成:包括图标区、标题区、内容区、按钮区
|
||||
|
||||
2. 使用步骤:定义对象-\>设定标题-\>设定图标-\>设定对话框的内容-\>设置按钮-\>创建对象
|
||||
|
||||
3. 相关方法:setTitle();setCustomTitle();setIcon();setPositiveButton();setNegativeButton;setNeutralButton();setMessage();setItems();setSingelChoiceItems();setAdapter();setView()
|
||||
|
||||
遇到的问题:
|
||||
|
||||
android:theme=”@android:style/Theme.Material.Dialog.Alert在manifest.xml中修改视图的主题失败,导致软件不能启动
|
||||
|
||||
View root =
|
||||
this.getLayoutInflater().inflate(R.layout.popup,null);这句话的具体意图没有搞明白,似乎是把某个视图声明为子视图。
|
||||
105
Android/Intent和IntentFilter的进行通信.md
Normal file
105
Android/Intent和IntentFilter的进行通信.md
Normal file
@@ -0,0 +1,105 @@
|
||||
**\>intent对象的描述**
|
||||
|
||||
- intent的理解
|
||||
|
||||
intent用来表示自己的意图:需要启动哪个Activity。两个Activity可以吧需要交换的数据封装成Bundle对象,然后使用Intent来携带Bundle对象,这样就实现了两个Activity对象之间的数据交换
|
||||
|
||||
- 组件的启动方法
|
||||
|
||||
1. Activity
|
||||
|
||||
- startActivity(intent)
|
||||
|
||||
- startActivity(intent,int)
|
||||
|
||||
2. Service
|
||||
|
||||
- StartService(Intent)
|
||||
|
||||
- bindService(inten,seviceConnection,int)
|
||||
|
||||
3. BroadcastReceiver
|
||||
|
||||
- sendBroadcast(intent)
|
||||
|
||||
- sendBroadcast(intetn,String)
|
||||
|
||||
- sendOrderedBroadcast(intent,String,BraodcastReceiver,Handler,int,String,Bundle)
|
||||
|
||||
- sendOrderedBroadcast(intet,String)
|
||||
|
||||
- sendStickyBroadcast(intent)
|
||||
|
||||
- sendStickyOrderedBroadcast(intent,resultReceiver,scheduler,initialCode,String,Bundle)
|
||||
|
||||
- 包含的属性
|
||||
|
||||
Component,Action,Category,Data,Type,Extra,Flag
|
||||
|
||||
**\>intent的属性及intent-filter配置**
|
||||
|
||||
- Component属性
|
||||
|
||||
- intent设定component属性的方法:
|
||||
|
||||
setClass(Context packageContext,Class
|
||||
|
||||
Intent intetn = new
|
||||
Intent();intetn.setAction(MainActivity.CRAZYIT\_ACTION);startActivity(intent)
|
||||
|
||||
- 1
|
||||
|
||||
- 2
|
||||
|
||||
- 3
|
||||
|
||||
- Category属性的配置
|
||||
|
||||
可以通过add
|
||||
|
||||
是一个字符串,为Action增加额外的附加信息。可以指定多个Category要求
|
||||
|
||||
- intent-filter的配置,这是被启动的Activity的配置文件,配置的事目标activity的intent属性,这个是activity的唯一标识。
|
||||
|
||||
开始有点理解这些东西了,可能就是一个用来交互的实体类,对于每一个对象的唯一身份标识,只需要创建一个这个实体,就能通过相同的方式启动类,并且通过Bundle传递相应的参数。
|
||||
|
||||
\<intent-filter\> \<action android:name="android.intent.action.MAIN" /\>
|
||||
\<category android:name="android.intent.category.LAUNCHER" /\>\</intent-filter\>
|
||||
|
||||
- 1
|
||||
|
||||
- 2
|
||||
|
||||
- 3
|
||||
|
||||
- 4
|
||||
|
||||
- 指定Action、Category调用系统的Activity
|
||||
|
||||
1. ACTION_MAIN
|
||||
|
||||
2. ACTION_VIEW
|
||||
|
||||
3. ACTON_ATTACH_DATA
|
||||
|
||||
4. ACTION_ATTACH_DATA
|
||||
|
||||
5. ACTION_EDIT。。。。。。。
|
||||
|
||||
6. CATAGORY_DEFAULT
|
||||
|
||||
7. CATEGORY_BROWSABLE
|
||||
|
||||
8. CATEGORY_TAB
|
||||
|
||||
- 在intent-filter中,设置用户访问手机的权限
|
||||
|
||||
**\>PendingIntent介绍**
|
||||
|
||||
- 有条件的intent
|
||||
|
||||
pendingIntent是一种特殊的Intent。主要的区别在于Intent的执行立刻的,而pendingIntent的执行不是立刻的。pendingIntent执行的操作实质上是参数传进来的Intent的操作,但是使用pendingIntent的目的在于它所包含的Intent的操作的执行是需要满足某些条件的。
|
||||
|
||||
- 调用作用域
|
||||
|
||||
PendingIntent可以看作是对Intent的包装。PendingIntent主要持有的信息是它所包装的Intent和当前Application的Context。正由于PendingIntent中保存有当前Application的Context,使它赋予其他程序一种执行的Intent的能力,就算在执行时当前Application已经不存在了,也能通过存在PendingIntent里的Context照样执行Intent
|
||||
339
Android/activity使用和相关的重要类.md
Normal file
339
Android/activity使用和相关的重要类.md
Normal file
@@ -0,0 +1,339 @@
|
||||
**\>建立配置和使用Activity**
|
||||
|
||||
- activity能够提供许多不同的操作页面,它们做成Activity栈,当前活动的应用位于栈顶。
|
||||
|
||||
- **LauncherActivity&&ArrayAdapter**
|
||||
|
||||
每一个列表项对应一个intent,用于保存启动不同的activity的相关信息。
|
||||
|
||||
intentForPostion()提供了位置和不同activity对应的信息,将列表项链接到制定的intent。
|
||||
|
||||
- **ExpandableListActivity&&ExpandableListAdapter**
|
||||
|
||||
设置界面显示过程中,使用了适配器的相关函数,其中复写的函数能够自动调用生成相应的界面。
|
||||
|
||||
- getChild()获得子字表的内容
|
||||
|
||||
- getChildID()获得子表的id
|
||||
|
||||
- getChildrenCount()获得子表的项目数量
|
||||
|
||||
- TextView()获得每个子表的textView配置
|
||||
|
||||
- getChildView()获得每个子表的textView内容
|
||||
|
||||
- getGroup()获得主表
|
||||
|
||||
- getGroupCount()获得主表的数量
|
||||
|
||||
- getGroupId()获得主表的id
|
||||
|
||||
- getGroupView()决定主表的外观
|
||||
|
||||
- isChildSelectable()返回被选中的子表像
|
||||
|
||||
- hasStableIds()返回id
|
||||
|
||||
当在ExpandableListActivity中定义Adapter时,这些函数必须都被复写,保证能够生成一个新的列表,就相当于XML对应的配置属性一样,这样才能完整的显示整个表格。
|
||||
|
||||
- **PreferenceActivity&&PreferenceFragment**
|
||||
|
||||
1. 实现了参数设置界面,让Fragment集成了PreferenceFragment
|
||||
|
||||
2. 在onCreate中调用addPreferencFromResource()方法,加载制定的界面布局文件。
|
||||
|
||||
- **在manifest.xml中配置多个Activity资源**
|
||||
|
||||
1. 配置多个Activity:
|
||||
|
||||
\<activity android:name=".MainActivity" android:label="@string/app_name"
|
||||
android:theme="@style/AppTheme.NoActionBar"\> \<intent-filter\> \<action
|
||||
android:name="android.intent.action.MAIN" /\> \<category
|
||||
android:name="android.intent.category.LAUNCHER" /\> \</intent-filter\>
|
||||
\</activity\>
|
||||
|
||||
- 1
|
||||
|
||||
- 2
|
||||
|
||||
- 3
|
||||
|
||||
- 4
|
||||
|
||||
- 5
|
||||
|
||||
- 6
|
||||
|
||||
- 7
|
||||
|
||||
- 8
|
||||
|
||||
- 9
|
||||
|
||||
- 10
|
||||
|
||||
**\>启动和关闭Activity**
|
||||
|
||||
- **启动activity的两种方法**
|
||||
|
||||
- context.startActivity(intent)
|
||||
|
||||
- context.startActivity(intent,int)
|
||||
|
||||
- **关闭Activity的两种方法**
|
||||
|
||||
- context.finish()
|
||||
|
||||
- context.finishActivity(int)
|
||||
|
||||
- **代码示例**
|
||||
|
||||
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
|
||||
|
||||
startActivity(intent);
|
||||
|
||||
**\>使用Bundle向指定的activity传递数据**
|
||||
|
||||
- **intent携带额外数据的方法**
|
||||
|
||||
- putExtras(Bundle)
|
||||
|
||||
- getExtras()
|
||||
|
||||
- putExtra()
|
||||
|
||||
- getXxxExtra()
|
||||
|
||||
- putXXX(String,XXX)
|
||||
|
||||
- putSeriaLizable(String,Srializagle)
|
||||
|
||||
- getXXX(String)
|
||||
|
||||
- getSerializable(String,Serializable)
|
||||
|
||||
- **使用bundle和intent机制向指定的activity传递数据的方法**
|
||||
|
||||
- 定义方法,向介质添加批数据并且将介质传递给目标activity
|
||||
|
||||
Person p = new
|
||||
Person(name.getText(),toString(),passwd.getText().toString(),gender); Bundle
|
||||
data = new Bundle(); data.putSerializable("person),p); Intent intent = new
|
||||
Intent(MainActivity.this,ResultActivity.class); intent.putExtras(data);
|
||||
startActivity(intent);
|
||||
|
||||
- 1
|
||||
|
||||
- 2
|
||||
|
||||
- 3
|
||||
|
||||
- 4
|
||||
|
||||
- 5
|
||||
|
||||
- 6
|
||||
|
||||
- 使用方法,从传递过来的intent中提取数据
|
||||
|
||||
Intent intent = getIntent();Person p = (Person)
|
||||
intent.getSerializableExtra("person");
|
||||
|
||||
- 1
|
||||
|
||||
- 2
|
||||
|
||||
**\>启动Activity并且获取返回结果**
|
||||
|
||||
- 当前的Activity启动另一个Activity获取它的结果并且返回到当前的Activity。
|
||||
|
||||
- **实现方法**
|
||||
|
||||
重写onActivityResult(int requestCode,int resultCode,intent
|
||||
intent)方法(相当于一种回调方法)当被启动的Activity生命周期结束并且返回结果时,该方法将会被触发。
|
||||
|
||||
- **实现过程**
|
||||
|
||||
1. 用特殊函数启动另外的activity
|
||||
|
||||
Intent intent = new Intent(MainActivity.this,ResultActivity.class);
|
||||
|
||||
intent.putExtras(data);
|
||||
|
||||
startActivityForResult(intent,0);
|
||||
|
||||
1. 当activity结束时,触发onActivity函数,需要重写它。
|
||||
|
||||
1. 在另外的activity中仍旧需要bundle和intent进行配合传递数据
|
||||
|
||||
对类的补充:
|
||||
|
||||
**Intent类(交互介质)**
|
||||
|
||||
- **Intent类作用**
|
||||
|
||||
每个应用程序都有若干个Activity组成,每一个Activity都是一个应用程序与用户进行交互的窗口,呈现不同的交互界面。因为每一个Acticity的任务不一样,所以经常互在各个Activity之间进行跳转,在Android中这个动作是靠Intent来完成的。你通过startActivity()方法发送一个Intent给系统,系统会根据这个Intent帮助你找到对应的Activity,即使这个Activity在其他的应用中,也可以用这种方法启动它。
|
||||
|
||||
- **Intent的定义:**
|
||||
|
||||
Intent是Android系统用来抽象描述要执行的一个操作,也可以在不同组件之间进行沟通和消息传递。
|
||||
|
||||
Intent意图可以是明确的指定组件的名称,这样你可以精确的启动某个系统组件,比如启动一个Activity。它也可以是模糊的,没有指定组件名称,只要是能够匹配到这个Intent的应用都可以接收到,比如发送一个拍照Intent,所有的拍照应用都会响应。
|
||||
|
||||
- **Intent有以下几个属性:**
|
||||
|
||||
动作(Action),数据(Data),分类(Category),类型(Type),组件(Compent)以及扩展信(Extra)。其中最常用的是Action属性和Data属性。
|
||||
|
||||
**Bundle类(批数据,是一个键值对)**
|
||||
|
||||
- **Bundle类的作用**
|
||||
|
||||
Bundle主要用于传递数据;它保存的数据,是以key-value(键值对)的形式存在的。我们经常使用Bundle在Activity之间传递数据,传递的数据可以是boolean、byte、int、long、float、double、string等基本类型或它们对应的数组,也可以是对象或对象数组。当Bundle传递的是对象或对象数组时,必须实现Serializable
|
||||
或Parcelable接口。下面分别介绍Activity之间如何传递基本类型、传递对象。
|
||||
|
||||
- **Bundle的定义和使用**
|
||||
|
||||
- 新建一个bundle类
|
||||
|
||||
view plain copy
|
||||
|
||||
Bundle mBundle = new Bundle();
|
||||
|
||||
- bundle类中加入数据(key
|
||||
\-value的形式,另一个activity里面取数据的时候,就要用到key,找出对应的value)
|
||||
|
||||
view plain copy
|
||||
|
||||
mBundle.putString(“Data”, “data from TestBundle”);
|
||||
|
||||
- 新建一个intent对象,并将该bundle加入这个intent对象
|
||||
|
||||
view plain copy
|
||||
|
||||
Intent intent = new Intent();
|
||||
|
||||
intent.setClass(TestBundle.this, Target.class);
|
||||
|
||||
intent.putExtras(mBundle);
|
||||
|
||||
- Bundle提供了各种常用类型的putxxx()/getxxx()方法,用于读写基本类型的数据。
|
||||
|
||||
**Context类的(主体上下文)**
|
||||
|
||||
- **Context类的定义**
|
||||
|
||||
Interface to global information about an application environment. This is an
|
||||
abstract class whose implementationis provided by the Android system. It allows
|
||||
access to application-specific resources and classes, as well as up-calls for
|
||||
application-level operations such as launching activities, broadcasting and
|
||||
receiving intents, etc
|
||||
|
||||
- **Context使用场景**
|
||||
|
||||
1. 它描述的是一个应用程序环境的信息,即上下文。
|
||||
|
||||
2. 该类是一个抽象(abstract
|
||||
class)类,Android提供了该抽象类的具体实现类(后面我们会讲到是ContextIml类)。
|
||||
|
||||
3. 通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送广播,接受Intent信息
|
||||
|
||||
- **Context类图集成关系**
|
||||
|
||||

|
||||
|
||||
context类图继承关系
|
||||
|
||||
- **Context相关的方法**
|
||||
|
||||
- getSystemService(String)获得系统级服务
|
||||
|
||||
- startActivity(Intent)启动一个Activity
|
||||
|
||||
- startService(Intent)启动一个service
|
||||
|
||||
- getSharedPreferences(String, int)
|
||||
|
||||
- **Context什自己的理解**
|
||||
|
||||
Context类相当于一个上下文环境,能够很好的统筹一个Activity、service或者app的资源和调度方式,他是负责指挥这些资源的类的接口,他能启动关闭一个app等。
|
||||
|
||||
**Serializable类**
|
||||
|
||||
> 序列化的内容补充
|
||||
|
||||
> 当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。
|
||||
> 把Java对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为Java对象的过程称为对象的反序列化。
|
||||
|
||||
- **Serializable接口的定义**
|
||||
|
||||
为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object
|
||||
states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。
|
||||
|
||||
- **使用情况**
|
||||
|
||||
- 当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
|
||||
|
||||
- 当你想用套接字在网络上传送对象的时候;
|
||||
|
||||
- 当你想通过RMI传输对象的时候;
|
||||
|
||||
- **Parcelable和Serializable的区别**
|
||||
|
||||
内存间数据传输时推荐使用Parcelable,activity间传输数据使用Parcelable,是Android特有功能,效率比实现Serializable接口高效,可用于Intent数据传递,也可以用于进程间通信(IPC)
|
||||
|
||||
保存到本地或者网络传输时推荐使用Serializable
|
||||
|
||||
**Parcelable类**
|
||||
|
||||
- **Parcelable类的作用**
|
||||
|
||||
想要在两个activity之间传递对象,那么这个对象必须序列化,Android中序列化一个对象有两种方式,一种是实现Serializable接口,这个非常简单,只需要声明一下就可以了,不痛不痒。但是android中还有一种特有的序列化方法,那就是实现Parcelable接口,使用这种方式来序列化的效率要高于实现Serializable接口。不过Serializable接口实在是太方便了,因此在某些情况下实现这个接口还是非常不错的选择。
|
||||
|
||||
- **Parcelable类的使用情况**
|
||||
|
||||
- 永久性保存对象,保存对象的字节序列到本地文件中;
|
||||
|
||||
- 通过序列化对象在网络中传递对象;
|
||||
|
||||
- 通过序列化在进程间传递对象。
|
||||
|
||||
- **Parcelable接口定义**
|
||||
|
||||
public interface Parcelable
|
||||
|
||||
{
|
||||
|
||||
//内容描述接口,基本不用管
|
||||
|
||||
public int describeContents();
|
||||
|
||||
//写入接口函数,打包
|
||||
|
||||
public void writeToParcel(Parcel dest, int flags);
|
||||
|
||||
//读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入
|
||||
|
||||
//为了能够实现模板参数的传入,这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例
|
||||
|
||||
public interface Creator\<T\>
|
||||
|
||||
{
|
||||
|
||||
public T createFromParcel(Parcel source);
|
||||
|
||||
public T[] newArray(int size);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
- **实现序列化的步骤**
|
||||
|
||||
1. implements Parcelable
|
||||
|
||||
2. 重写writeToParcel方法,将你的对象序列化为一个Parcel对象,即:将类的数据写入外部提供的Parcel中,打包需要传递的数据到Parcel容器保存,以便从
|
||||
Parcel容器获取数据
|
||||
|
||||
3. 重写describeContents方法,内容接口描述,默认返回0就可以
|
||||
|
||||
4. 实例化静态内部对象CREATOR实现接口Parcelable.Creator
|
||||
136
Android/activity和Fragment.md
Normal file
136
Android/activity和Fragment.md
Normal file
@@ -0,0 +1,136 @@
|
||||
**\>Activity的回调机制**
|
||||
|
||||
- **回调机制的解释**
|
||||
|
||||
通用程序框架在完成整个应用个通用功能和流程时,在特定点上需要相应的业务逻辑实现。(java
|
||||
swing中的init()方法,java Thread中的run()方法,都是一种回调机制)
|
||||
|
||||
- **回调机制的存在形式**
|
||||
|
||||
1. 以接口的形式存在
|
||||
|
||||
2. 以抽象方法的形式存在,通过oncreate、onActivityResult()函数能够直接创建一个Activity,例如当有一个Activity被调用时(生成相应的实例时)就会通过onCreate方法创建一个Activity。
|
||||
|
||||
**\>Activity的生命周期**
|
||||
|
||||
- 四个状态
|
||||
|
||||
1. 运行状态:当前Activity位于前台,用户可见,可以获得焦点。
|
||||
|
||||
2. 暂停状态:其他Activity位于前台,该activity依然可见,但不能获得焦点
|
||||
|
||||
3. 停止状态:该activity不可见失去焦点
|
||||
|
||||
4. 销毁状态:activity结束。
|
||||
|
||||
- 生命周期示例图
|
||||
|
||||

|
||||
|
||||
Activity的生命周期
|
||||
|
||||
- Activity的四种加载模式
|
||||
|
||||
1. standard:标准模式
|
||||
|
||||
每次启动Activityandroid都会启动一个新的实例,并通过Activity添加到当前的task栈顶,就相当于同一个类会有多个对象同时在运行。
|
||||
|
||||
1. sigleTop:Task栈顶单例模式
|
||||
|
||||
与standard模式基本相同,但是当要启动的类本身就位于栈顶事,那么将不会重新创建Activity实例,而是复用之前的Activity。
|
||||
|
||||
1. sigleTask:Task内单例模式
|
||||
|
||||
在同一个task中只允许有一种实例。不存在创建,存在移动到栈顶显示。
|
||||
|
||||
1. sigleInstace:全局单利模式
|
||||
|
||||
无论从哪个任务中启动Activity都会只创建一个单一的实例。
|
||||
|
||||
> android 采用task栈对Activity进行管理,先启动的放在
|
||||
> task栈底,后启动的Activity被放在了task栈顶。
|
||||
|
||||
**\>Fragment详解**
|
||||
|
||||
- **Fragment的简介**
|
||||
|
||||
Fragment代表了Activity的子模块,因此可以吧Fragment理解成Activity片段。Fragment拥有自己的生命周期,能够接受自己的输入事件。
|
||||
|
||||
- Fragment总作为Activity的界面组成部分。Fragment可调用getActivity()方法返回Activity,Activity可以使用FragmentManager来管理相应的Fragment
|
||||
|
||||
- Fragment的add(),remove(),replace()方法可以动态地添加、删除或者替换Fragment。
|
||||
|
||||
- 一个Activity可以痛死组合多个Fragment;一个Fragment
|
||||
也可以被多个Activity复用。
|
||||
|
||||
- Fragment可以响应自己的输入输出事件,有自己的生命周期。但是收到Activity的控制。
|
||||
|
||||
Fragment主要是为了简化大屏手机的UI的设计。
|
||||
|
||||
**创建Fragment**
|
||||
|
||||
onCreate()系统创建Fragment回调的方法
|
||||
|
||||
onCreateView()当Fragment绘制界面时回调这个方法
|
||||
|
||||
onPause()用户离开Fragment后回调的方法
|
||||
|
||||
**\>Fragment与Activity通信**
|
||||
|
||||
- 在布局文件中使用
|
||||
|
||||
**\>Fragment管理与Fragment事物**
|
||||
|
||||
- FragmentManager可以完成的功能
|
||||
|
||||
- FragmentManager.findFragmentById()/…ByTag()获取指定的Fragment
|
||||
|
||||
- popBackStack()将Fragment从后台栈中弹出
|
||||
|
||||
- 调用addOnBackStackChangeListener()注册监听器
|
||||
|
||||
- add()
|
||||
|
||||
- remove()
|
||||
|
||||
- commit()
|
||||
|
||||
- replace()
|
||||
|
||||
**\>Fragment 的生命周期**
|
||||
|
||||
- 四种不同的状态
|
||||
|
||||
- 运行状态,fragment位于前台获取焦点
|
||||
|
||||
- 暂停状态,activity位于前台Fragment可见
|
||||
|
||||
- 停止状态,Fragment不可见失去焦点
|
||||
|
||||
- 销毁状态,fragment被删除。
|
||||
|
||||
- 生命周期的控制函数。
|
||||
|
||||
以下的函数都是回调函数,在不同的时间被触发调用
|
||||
|
||||
- onAttach()当Fragment被添加到Activity中时
|
||||
|
||||
- onCreate()创建Fragment时
|
||||
|
||||
- onActivityCreated()当所在Fragment所在的Activity被启动时
|
||||
|
||||
- onCreateView()每次创建绘制该Fragment的View组件时
|
||||
|
||||
- onStart()启动Fragment时
|
||||
|
||||
- onResume()恢复Fragment时
|
||||
|
||||
- onPause()暂停Fragment时
|
||||
|
||||
- onStop()停止Fragment时
|
||||
|
||||
- onDestroyView()销毁Fragment包含的组件时
|
||||
|
||||
- onDestroy()销毁Fragment时
|
||||
|
||||
- onDetach()将该Fragment从Activity中删除时
|
||||
42
Android/android工程介绍.md
Normal file
42
Android/android工程介绍.md
Normal file
@@ -0,0 +1,42 @@
|
||||
**\>androidStudio的开发步骤**
|
||||
|
||||
1. 创建android项目和文件结构
|
||||
|
||||
2. 在XML布局文件中定义应用程序的用户界面
|
||||
|
||||
3. 在.java文件中编写业务的实现。
|
||||
|
||||
android
|
||||
的文件结构中只有三个有用:.java实现应用程序的业务,res中的.xml实现工程的视图的资源文件,manifest.xml实现相关资源的协调配置。
|
||||
|
||||
4大组件:activity,service,broadcastreceiver,contentProvider,intent(不同组件之间通讯的载体)
|
||||
|
||||
**\>android studio 中的文件结构**
|
||||
|
||||
- src文件夹,保存java文件
|
||||
|
||||
- res文件夹,保存资源文件和xml文件
|
||||
|
||||
- bin文件夹,存放生成的目标文件
|
||||
|
||||
- gen文件夹,自动生成的R.java文件
|
||||
|
||||
**\>相关文件的理解**
|
||||
|
||||
- R.java是一个资源统筹文件,每个资源对应一个内部类的int值和field,相当于为为每个其他的资源文件添加了一个变量,或者说,定义了一个相对于软件的全局变量。在.java文件中相当于添加了一个字段:public
|
||||
static final int app_name =
|
||||
00123031;在xml文件中的引用方法:@string/app_name;另外标识符不需要R资源文件的定义就可以直接使用:@+id/ok
|
||||
|
||||
- value/string.xml,定义了全局的字符串常量。
|
||||
|
||||
- androidManifest.xml全局描述文件。统筹了很多东西。通过标签声明需要的权限,声明被调用用的权限。
|
||||
|
||||
**\>antivity中包含的方法的总结**
|
||||
|
||||
getWindow()获得当前窗口的对话框
|
||||
|
||||
setContentView()设置当前activity的主要视图xml文件
|
||||
|
||||
setTheme()设置xml文件显示的主题风格
|
||||
|
||||
签名防止同名的包中的程序被覆盖。
|
||||
257
Android/android应用资源(一).md
Normal file
257
Android/android应用资源(一).md
Normal file
@@ -0,0 +1,257 @@
|
||||
**\>应用资源概述**
|
||||
|
||||
- 访问方式分类
|
||||
|
||||
1. 无法通过R资源清单类访问的原生资源,保存在assets目录下
|
||||
|
||||
2. 可通过R资源清单访问的资源,保存在res目录下
|
||||
|
||||
- 源代码按照物理存储形式分类
|
||||
|
||||
1. 界面布局文件
|
||||
|
||||
2. java资源文件
|
||||
|
||||
3. 资源文件(android应用资源)
|
||||
|
||||
- 资源的类型和存储方式
|
||||
|
||||
1. /res/animator/ 定义属性动画
|
||||
|
||||
2. /res/anim/ 定义补间动画
|
||||
|
||||
3. /res/color/ 定义颜色列表
|
||||
|
||||
4. /res/draWble/ 存放各种位图
|
||||
|
||||
5. /res/layout/ 存放布局界面
|
||||
|
||||
6. /res/menu/ 存放菜单资源
|
||||
|
||||
7. /res/raw/ 存放原生资源(音乐视频)
|
||||
|
||||
8. /res/value/ 存放简单值,字符串值、整型值、颜色值、数组等
|
||||
|
||||
9. /res/xml/ 原生的XML内容
|
||||
|
||||
- 使用资源
|
||||
|
||||
1. 在java文件中访问,Pacage_name.R.resource_type.resource_name;
|
||||
|
||||
在这里使用的是资源清单,而不是实际资源,所储存到的东西不过是指向资源的一个整型数组。
|
||||
|
||||
- getResources().getText(R.String.main_title)通过引用返回实际资源,用来建立资源副本
|
||||
|
||||
Drawable logo = res.getDrawavle(R.drawable.logo);
|
||||
|
||||
- 在XML文件中访问,@pacage_name:resource_type/resource_name
|
||||
|
||||
**\>字符串、颜色、尺寸资源**
|
||||
|
||||
- 颜色值的定义\#ARGB都是十六进制书。
|
||||
|
||||
\<String name="CSD"\>这是一个字符串\</String\>
|
||||
|
||||
\<color name="c1"\>\#FOO\</color\>
|
||||
|
||||
\<dimen name="spacing"\>8dp\</dimen\>
|
||||
|
||||
\<bool name="is_male"\> true \</bool\>
|
||||
|
||||
- 字符串颜色尺寸资源的使用
|
||||
|
||||
\<TextView android:text="@string/app_name"
|
||||
android:textsize="@dimen/title_font"/\> \<GridView
|
||||
android:horizontalSpacing=dimen/spacing/GridView\>
|
||||
|
||||
- 1
|
||||
|
||||
- 2
|
||||
|
||||
- 3
|
||||
|
||||
- 4
|
||||
|
||||
- 5
|
||||
|
||||
- 6
|
||||
|
||||
- 7
|
||||
|
||||
- 在java代码中访问如下
|
||||
|
||||
R.color.c1 R.string.c1 R.dimen.cell\_width R.bool.bool\_name
|
||||
|
||||
- 1
|
||||
|
||||
- 2
|
||||
|
||||
- 3
|
||||
|
||||
- 4
|
||||
|
||||
- 5
|
||||
|
||||
**\>数组资源**
|
||||
|
||||
- 定义普通数组
|
||||
|
||||
\<array name="plain_arr"\> \<item\>@color/c1\</item\> \<item\>@color/c2\</itme\>
|
||||
\</array\>
|
||||
|
||||
- 1
|
||||
|
||||
- 2
|
||||
|
||||
- 3
|
||||
|
||||
- 4
|
||||
|
||||
- 定义字符串数组
|
||||
|
||||
\<string-array name="plain_arr"\> \<item\>@string/c1\</item\>
|
||||
\<item\>@string/c2\</itme\> \</string-array\>
|
||||
|
||||
- 1
|
||||
|
||||
- 2
|
||||
|
||||
- 3
|
||||
|
||||
- 4
|
||||
|
||||
- 定义整型数组
|
||||
|
||||
**\>使用Drawable资源**
|
||||
|
||||
- 使用方式
|
||||
|
||||
@package\_name:drawable/file_namepackage_name.R.drawable.file_name
|
||||
|
||||
- 1
|
||||
|
||||
- 2
|
||||
|
||||
- StateListDrawable资源
|
||||
|
||||
能够根据目标组件的状态切换不同的分辨率图片。
|
||||
|
||||
支持的属性
|
||||
|
||||
android:stata\_active
|
||||
|
||||
android:state\_checkable
|
||||
|
||||
android:state\_cheked
|
||||
|
||||
android:state\_enable
|
||||
|
||||
android:state\_first
|
||||
|
||||
android:state\_focused
|
||||
|
||||
android:state\_last… …
|
||||
|
||||
- 具体使用说明
|
||||
|
||||
1. 在res\\drawnable\\my_image.xml中建立如下内容。本质上是在原来直接显示图片的基础上,进行一次封装,是的显示的图片具有动态变化的效果。
|
||||
|
||||
\<sector xmlns:android="http:\\\\"\>\<item android:state_focused="true"
|
||||
android:color="\#f44"/\>\<item android:state_focused="false"
|
||||
android:color="\#ccf"/\>
|
||||
|
||||
- 1
|
||||
|
||||
- 2
|
||||
|
||||
- 3
|
||||
|
||||
- 4
|
||||
|
||||
- 5
|
||||
|
||||
**\>使用LayerDrawable资源**
|
||||
|
||||
- 能够支持的属性
|
||||
|
||||
anroid:drawble,制定图片对象
|
||||
|
||||
android:id,指定对象的id
|
||||
|
||||
android:buttonm tom left button,指定显示的位置。
|
||||
|
||||
- 使用的语法格式
|
||||
|
||||
**\>使用ShapeDrawable资源**
|
||||
|
||||
- 作用:
|
||||
|
||||
用来定义一个基本的图形(矩形、线条、圆形)
|
||||
|
||||
- 使用:(下一级标签)
|
||||
|
||||
定义了四个角的弧度
|
||||
|
||||
定义了渐变色填充
|
||||
|
||||
定义了几何形状内边距
|
||||
|
||||
定义几何形状的大小
|
||||
|
||||
定义使用单种颜色填充
|
||||
|
||||
定义为集合形状绘制边框
|
||||
|
||||
**\>ClipDrawable资源**
|
||||
|
||||
- 作用
|
||||
|
||||
从其他位图上截取一个图片片段
|
||||
|
||||
- 使用:(这个标签的属性)
|
||||
|
||||
android:drawable,指定截取的资源
|
||||
|
||||
android:clipOrientation,指定截取的方向
|
||||
|
||||
android:gravity,指定截取时的对其方式
|
||||
|
||||
**\>AnimationDrable资源**
|
||||
|
||||
- 作用:
|
||||
|
||||
代表一个动画,相当于逐帧动画,也可以通过平移、变换计算出来的补间动画。
|
||||
|
||||
:设置透明度
|
||||
|
||||
:图片进行缩放变换
|
||||
|
||||
:图片进行位移变换
|
||||
|
||||
:图片进行旋转
|
||||
|
||||
android:interpolator属性指定变化速度,linear_interpolator/accelerate_interploator/decelerate_interpolator:匀速变化/加速变化/减速变化。
|
||||
|
||||
- 使用方法:
|
||||
|
||||
- 在XML文件中访问
|
||||
|
||||
@package\_name:anim/file_name
|
||||
|
||||
- 在java代码中访问
|
||||
|
||||
package.R.anim.file_name
|
||||
|
||||
**\>属性动画资源**
|
||||
|
||||
- 子类
|
||||
|
||||
AnimatorSet、ValueAnimator、ObjectAnimator、TimeAnimator
|
||||
|
||||
- 定义属性动画的根元素
|
||||
|
||||
- \<set\> \</set\>
|
||||
|
||||
- \<objectAnimator\> \</objectAnimator\>
|
||||
|
||||
- \<animator\> \</animator\>
|
||||
BIN
Android/media/64237df36a973c99a027cf9e6471c7e2.gif
Normal file
BIN
Android/media/64237df36a973c99a027cf9e6471c7e2.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 65 KiB |
BIN
Android/media/a0889d3344d2955e66de11c0646a0a10.gif
Normal file
BIN
Android/media/a0889d3344d2955e66de11c0646a0a10.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
152
Android/事件处理.md
Normal file
152
Android/事件处理.md
Normal file
@@ -0,0 +1,152 @@
|
||||
**\>事件处理的概述**
|
||||
|
||||
- 两种事件处理机制
|
||||
|
||||
1. 基于监听的事件处理
|
||||
|
||||
2. 基于回调的事件处理
|
||||
|
||||
**\>基于监听的事件处理机制**
|
||||
|
||||
- 涉及到的三类对象
|
||||
|
||||
1. Event Source事件源,指各个组件。
|
||||
|
||||
2. Event 界面组件上发生的特定的事情,。
|
||||
|
||||
3. Event Listener监听事件源发生的事情。并对各种事情作出相应的响应。
|
||||
|
||||
4. Event
|
||||
Handler事件处理器,当事件监听器捕获事件后,由响应的事件处理器识别特定的事件,并做出响应的动作。
|
||||
|
||||
- 事件监听机制的工作流程
|
||||
|
||||
普通组件(事件源对象) 发生很多事件,生成多种事件对象 被同一个监听器对象捕获
|
||||
监听器通过不同的事件处理器处理这个事件。
|
||||
|
||||
> 每个组件可以根据不同的事件类别指定多个监听器,每一个监听器可以监听多个事件源。
|
||||
|
||||
**\>实现事件监听器的方法**
|
||||
|
||||
1. 内部类作为时间的监听器
|
||||
|
||||
使用内部类作为事件监听器能够在这个类内复用该监听器。该监听器类能够自由访问外部类的所有界面组件
|
||||
|
||||
1. 外部类作为时间监听器
|
||||
|
||||
事件监听器通常属于特定的GUI界面,定义成外部类不利于提高程序的内聚性。外部类形式的时间监听器不能够自由访问GUI界面的类中的组件。同时也适用于监听器于GUI界面没有任何耦合情况。
|
||||
|
||||
> 监听器还是主要来写显示逻辑,具体的业务逻辑放到外部的其他函数或者类中进行处理。
|
||||
|
||||
> Activity类本身作为事件监听器
|
||||
|
||||
> 不推荐,activity类本身用来界面初始化工作,包含事件监听器容易造成程序的逻辑结构混乱。
|
||||
|
||||
> 匿名类作为时间监听器类
|
||||
|
||||
> 大部分时候事件监听器类的代码没有什么复用价值,所以只要使用匿名类来实现事件监听器想要达到的页面逻辑就好。
|
||||
|
||||
> android可以直接在界面布局中制定标签绑定事件的处理方式。
|
||||
|
||||
> android:onClick=”clickHandler”
|
||||
|
||||
**\>基于回调的事件处理方法**
|
||||
|
||||
- 回调机制
|
||||
|
||||
事件的处理直接绑定到与组件相关的时间处理函数上,而非通过监听器的监听和事件处理器的匹配处理。有点像事件监听器和事件源融合在一起,不需要单独的时间监听器类,事件源本身能够监听自身发生的各种事件。
|
||||
|
||||
- 基于回调的事件传播
|
||||
|
||||
当返回为true时,表明该方法已经能够处理发生的事件,事件不会向外传播给外层的时间监听器。当返回为false时,如果有外围的监听器处理同一个事件,则事件会向外传播,同时被其他监听器坚挺到。如果存在各种监听器,其监听顺序为:绑定的事件监听器–\>基于回调的内部事件监听器–\>基于回调的外部事件监听器。
|
||||
|
||||
**\>相应系统设置的事件**
|
||||
|
||||
- 用来获取系统的配置
|
||||
|
||||
Configuration cfg = getResources().getConfiguration();
|
||||
|
||||
- onConfigurationChanged能够监听相关的配置改变的事件。
|
||||
|
||||
**\>Handler消息传递机制**
|
||||
|
||||
- 工作原理
|
||||
|
||||
android第一次启动,主线程负责activityUI界面的线程,而且只允许UI线程对主界面进行修改,其他新启动的线程无法对主界面进行直接修改,需要使用Handler进行消息传递。
|
||||
|
||||
- Handler简介
|
||||
|
||||
1. 在新启动的线程中发送消息
|
||||
|
||||
2. 在主线程中获取和处理消息
|
||||
|
||||
好像是原来的事件处理机制变成了消息处理机制,通过监听消息,处理消息完成一系列动作,同事件处理一样。
|
||||
|
||||
- Handler涉及的方法
|
||||
|
||||
1. HandlerMessage()
|
||||
|
||||
2. hasMessage()
|
||||
|
||||
3. hasMessages()
|
||||
|
||||
4. obtainMessage()
|
||||
|
||||
5. sendEmptyMessage()
|
||||
|
||||
6. sendEmptyMessageDelayed()
|
||||
|
||||
7. sendMessage()
|
||||
|
||||
8. sendMessageDelayed()
|
||||
|
||||
- Handler、Loop、MessageQueue的工作原理
|
||||
|
||||
1. Message是Handler接受和处理的对象
|
||||
|
||||
2. Looper每个线程只能有一个Looper,loop方法负责读取MessageQueue中的消息
|
||||
|
||||
3. MessageQueen消息队列,采用了先进先出的方式管理队列。
|
||||
|
||||
private Looper() { mQueue = new MessageQueue(); mRun = true; mThread =
|
||||
Thread.currentThread(); }
|
||||
|
||||
- 1
|
||||
|
||||
- 2
|
||||
|
||||
- 3
|
||||
|
||||
- 4
|
||||
|
||||
- 5
|
||||
|
||||
- 6
|
||||
|
||||
- Looper类的使用方法
|
||||
|
||||
1. 调用Looper的prepare方法,创建Looper对象,生成对应的MessageQueue来管理事件
|
||||
|
||||
2. 创建Handler子类,用于发送本线程的消息。重写HandlerMessage方法,负责处理来自其他线程的消息。
|
||||
|
||||
3. 调用Looper的loop方法启动Looper类
|
||||
|
||||
UI线程一般专门用来相应用户的界面操作,而其他的逻辑运算和处理都交给其他线程处理主要目的是防止UI线程被阻塞而让用户以为界面卡顿。
|
||||
|
||||
此时如果UI线程与其他线程的交互方式,就是Handler消息传递机制,同事件监听机制的逻辑十分相似。
|
||||
|
||||
**\>异步任务**
|
||||
|
||||
- 解决新线程不能更新UI主界面的问题的方法
|
||||
|
||||
- 使用Handler消息处理机制
|
||||
|
||||
- Activity.runOnUiThread(Runnable)
|
||||
|
||||
- View.post(Runnable)
|
||||
|
||||
- View.postDelayed(Runnable,long)
|
||||
|
||||
- 异步处理机制
|
||||
|
||||
- AsyncTask
|
||||
98
Android/图形与图像处理(动态处理).md
Normal file
98
Android/图形与图像处理(动态处理).md
Normal file
@@ -0,0 +1,98 @@
|
||||
**逐帧动画**
|
||||
|
||||
- AnimationDrawable与逐帧动画。在元素中定义子元素,表示动画的全部帧,并制定持续时间即可。
|
||||
|
||||
\<animation-list xmlns:android=""android:onshot=true/false\> \<item
|
||||
android:drawable="@package_name:drawable/resource_name"android:duration="integer"/\>
|
||||
\</animation-list\>
|
||||
|
||||
|
||||
**补间动画**
|
||||
|
||||
- android使用Animation代表抽象的动画类
|
||||
|
||||
- AlphaAnimation:透明度改变的动画,指定开始透明度、结束透明度、动画持续时间
|
||||
|
||||
- ScaleAnimation:大小缩放的动画,指定缩放中心、开始缩放比、结束缩放比、动画持续时间
|
||||
|
||||
- TranslateAnimation:位移变化的动画,指定开始位置、结束位置、动画持续时间
|
||||
|
||||
- RotateAnimation:旋转动画,旋转轴心、开始旋转角度、结束旋转角度
|
||||
|
||||
- 通过interpolator指定动画运行期间,动态补入多少帧,在哪些时刻补入。能够指定动画的变化速度。
|
||||
|
||||
- interpolator的实现类
|
||||
|
||||
- LinearInterpolator:均匀速度改变
|
||||
|
||||
- AccelerateInterpolator:加速
|
||||
|
||||
- AccelerateDecelerateinterpolator:中间加速
|
||||
|
||||
- CycleInterpolator:循环播放n次,变化速度正玄曲线
|
||||
|
||||
- DecelerateInterpolator:减速
|
||||
|
||||
- 自定义补间动画
|
||||
|
||||
- 继承Animation,重写抽象基类的interpolatedTime时间进行比方法和Transformation补间动画变形程度。
|
||||
|
||||
- Transformation代表了对图片或者视图的变形程度,封装了一个Matrix对象用来对图形进行位移、倾斜、旋转等变换。封装了一个Camera对象,进行三维空间变换。getMatrix():将Camera所有变换应用到matrix上
|
||||
|
||||
- getMatrix():Camera对应变换应用到matrix上
|
||||
|
||||
- rotateX():X轴旋转
|
||||
|
||||
- rotateY():Y轴旋转
|
||||
|
||||
- rotateZ():Z轴旋转
|
||||
|
||||
- translate():目标组件在三维空间内变换
|
||||
|
||||
- applyToCanvas():应用到场景当中
|
||||
|
||||
**属性动画**
|
||||
|
||||
- 属性变化可以定义任意性质的变化。可以针对任何对象执行的动画,需要制定动画持续时间、动画的插值方式、动画的重复次数、重复行为、动画集、帧刷新率
|
||||
|
||||
- 属性动画的API
|
||||
|
||||
- Animator:提供了创建属性动画的基类。
|
||||
|
||||
- ValueAnimator:属性动画主要的时间引擎,负责计算各个帧的属性值,定义了属性动画的绝大部分核心功能。
|
||||
|
||||
- ObjectAnimator:对指定对象的属性执行动画,是ValueAnimator的子类
|
||||
|
||||
- AnimatorSet:组合多个Animator,并制定多个Animator的播放次序。
|
||||
|
||||
- IntEvaluator:计算int属性值的计算器。
|
||||
|
||||
- FloatEvaluator:计算float类型的计算器
|
||||
|
||||
- ArgbEvaluator:计算十六进制颜色值的计算器
|
||||
|
||||
- TypeEvaluator:计算器接口。自定义计算器。
|
||||
|
||||
- ValueAnimator创建属性动画的步骤:
|
||||
|
||||
1. 调用ofInt() ofFloat() ofObject()静态方法创建ValueAnimator实例
|
||||
|
||||
2. 调用setXxx() 方法设置动画持续时间,差值方式、重复次数
|
||||
|
||||
3. 调用start()方法启动动画
|
||||
|
||||
4. 为ValueAnimator注册AnimatorUpdateListener监听器,监听ValueAnimator计算出来的值,并将这些值应用到制定对象上。通过getAnimatorValue()方法来计算值,并应用到任何对象上。
|
||||
|
||||
- ObjectAnimator创建属性动画的步骤
|
||||
|
||||
- 继承了ValueAnimator,已经绑定了指定的对象,直接将ValueAnimator计算的值应用到制定对象的指定属性上。
|
||||
|
||||
- 必须为绑定的制定对象提供特定的setter方法才行。如果没有开始值,必须提供getter方法提供开始值。
|
||||
|
||||
- 如果对象是View需要调用onAnimationUpdate()中调用View.invalidate()方法来刷新屏幕显示。
|
||||
|
||||
**使用SurfaceView实现动画**
|
||||
|
||||
- SurfaceView与SurfaceHolder相互关联使用,后者提供了方法:
|
||||
|
||||
- lockCanvas()锁定surfaceView对象,或者对指定区域更新。
|
||||
171
Android/图形与图像处理(静态处理).md
Normal file
171
Android/图形与图像处理(静态处理).md
Normal file
@@ -0,0 +1,171 @@
|
||||
**使用简单的图片**
|
||||
|
||||
- 通过Drawable对象进行访问。
|
||||
|
||||
R.drawable.file_name
|
||||
|
||||
@drawable/file_name
|
||||
|
||||
- 通过BitmapDrawable对Bitmap对象进行封装,以下皆为静态方法,来自BitmapFactory。
|
||||
|
||||
- BitmapDrawagle drawable - new
|
||||
BitmapDrawable(bitmap);通过Bitmap对象的到另外的图像
|
||||
|
||||
- createBitmap(Bitmap source,int x,int y,int width, int
|
||||
height):从源位图source的制定位置开始截取一个图像。
|
||||
|
||||
- createScaledBitmap(Bitmap src,int dstWidth,int dstHeight,boolean
|
||||
filter):对原来的位图进行缩放
|
||||
|
||||
- createBitmap(int width,int height,Bitmap.Config
|
||||
config):创建一个宽width、height的新位图
|
||||
|
||||
- createBitmap(Bitmap source,int x,int y,int width,int height,Matris
|
||||
m,boolean filter);截取一段图像
|
||||
|
||||
- decodeByteArray(byte[],int offset, int
|
||||
length);从指定字节数组的offset位置开始,将长度length的字节解析成Bitmap对象。
|
||||
|
||||
- decodeFile(String pathName):从pathName指定文件中解析、创建Bitmap对象
|
||||
|
||||
- 用来判断是否被回收: isRecycled()
|
||||
|
||||
用来强制回收:recycle()
|
||||
|
||||
- 使用静态方法导入一张图片:
|
||||
|
||||
- AssetManager assets=getAssets();
|
||||
|
||||
- InputStream assetsFile = assets.open(images[currentImg++]);
|
||||
|
||||
- BitmapDrawable bitmapDrawable=(BitmapDrawable) image.getDrawable();
|
||||
|
||||
- image.setImageBitmap(BitmapFactory.decodeStream(assetFile));
|
||||
|
||||
**\>绘图**
|
||||
|
||||
- 绘图基础
|
||||
|
||||
- 集成View组件,重写onDraw()回调方法。
|
||||
|
||||
\*使用Canvas画布进行画图
|
||||
|
||||
- drawArc()
|
||||
|
||||
- drawBitmap()
|
||||
|
||||
- drawCircle()
|
||||
|
||||
- drawLine()
|
||||
|
||||
- drawLines(),drawOvl()
|
||||
|
||||
- drawPath(),drawPoint()
|
||||
|
||||
- drawPoints(),drawRect()
|
||||
|
||||
- drawRoundRect()
|
||||
|
||||
- drawText()
|
||||
|
||||
- drawTextOnPath()
|
||||
|
||||
- clipRect()
|
||||
|
||||
- clipRegion();
|
||||
|
||||
\* Canvas坐标变换rotate()旋转,scale()缩放,skew()倾斜,translate()移动;
|
||||
|
||||
- 使用Paint进行绘图
|
||||
|
||||
- setARGB()设置颜色。
|
||||
|
||||
- setAlpha()设置透明度
|
||||
|
||||
- setColor()设置颜色
|
||||
|
||||
- setPathEffect()设置路径
|
||||
|
||||
- setShader()设置画笔的填充效果
|
||||
|
||||
- setShadowLayer()设置阴影
|
||||
|
||||
- setStrokeWidth()设置笔触宽度
|
||||
|
||||
- setStrokeJoin()设置笔转风格
|
||||
|
||||
- setStyle()设置paint的填充风格
|
||||
|
||||
- setTextAlign()设置文字对齐方式
|
||||
|
||||
- setTextSize()设置文本的文字大小。
|
||||
|
||||
- 使用Path类
|
||||
|
||||
- 预先将N个点连成一条路径,然后在路径上绘制
|
||||
|
||||
- 子类ComposePathEffect/CornerPathEffect/DashPathEffect/DiscretePathEffect/SumPathEffect
|
||||
|
||||
- 绘图应用-绘制有用游戏
|
||||
|
||||
重复调用onDraw()方法,每次在View组件上绘制不同的东西,形成逐帧动画。
|
||||
|
||||
- 双缓冲画图板
|
||||
|
||||
- 弹球游戏
|
||||
|
||||
**\>图形特效处理**
|
||||
|
||||
- 使用Matrix控制变换步骤
|
||||
|
||||
1. 获取Matrix对象
|
||||
|
||||
2. 调用Matrix的方法进行变换(矩阵方法)
|
||||
|
||||
3. 将程序Matrix所做的变换应用到指定图形或组件。
|
||||
|
||||
- Matrix提供的方法
|
||||
|
||||
- setTranslage
|
||||
|
||||
- setSkew()
|
||||
|
||||
- setTotate()
|
||||
|
||||
- setScale()
|
||||
|
||||
- Matrix 应用举例
|
||||
|
||||
- 键盘操作图片移动
|
||||
|
||||
- 移动游戏背景
|
||||
|
||||
- 使用drawBitmapMesh扭曲图像
|
||||
|
||||
- bitmap:扭曲的源位图
|
||||
|
||||
- meshWidth/meshHeight划分格子数
|
||||
|
||||
- verts扭曲后个顶点的位置
|
||||
|
||||
- vertOffset:控制verts数组中扭曲的开始。
|
||||
|
||||
- 通过drawBitmapMesh()方法对源位图扭曲绘制。
|
||||
|
||||
- drawBitmapMesh 应用举例
|
||||
|
||||
- 可揉的图片
|
||||
|
||||
**\>使用Shader填充图形**
|
||||
|
||||
- 使用Shader对象指定渲染效果来填充图像。子类:
|
||||
|
||||
- BitmapShader位图平铺
|
||||
|
||||
- LinerGradient线性渐变
|
||||
|
||||
- RadialGradient圆形渐变
|
||||
|
||||
- SweepGradient角度渐变
|
||||
|
||||
- ComposeShader组合渲染效果
|
||||
72
Android/基础(一).md
Normal file
72
Android/基础(一).md
Normal file
@@ -0,0 +1,72 @@
|
||||
**\>Android系统简介**
|
||||
|
||||
- **android 分层**
|
||||
|
||||
1. 应用程序层
|
||||
|
||||
2. 应用程序框架层
|
||||
|
||||
3. 系统运行库
|
||||
|
||||
4. linux核心层。
|
||||
|
||||
- **设计规则**
|
||||
|
||||
1. 每个程序都运行在了自己的进程空间中,需要时启动,不需要时终止。
|
||||
|
||||
2. 每个程序都有自己的运行库ART,各应用程序之间的代码是相互隔离的。
|
||||
|
||||
3. 每个程序被分配唯一的ID,任何应用程序的代码与其他应用程序的代码是相互隔离的。
|
||||
|
||||
- **Android应用程序的四大组件**
|
||||
|
||||
1. activity活动,用于与用户进行交互的可视化界面,凡是在应用程序中看到的东西都是放在activity中。每一个activity子类集成父类Activity。
|
||||
|
||||
2. Service服务,无需可视化界面,需要在后台长期运行的应用程序,背景音乐播放器,和后台数据处理任务等,继承自父类Service。
|
||||
|
||||
3. Broadcast
|
||||
Receiver广播接收器,接受和处理广播消息的组件。没有影虎界面,在相应其接收到的信息时可以启动一个activity,继承自父类BroadcastReceiver。
|
||||
|
||||
4. Content
|
||||
Provider内容提供者,可以将指定的一组数据让其他程序使用。数据可能存储在文件系统或者SQLlife中。继承自父类ContentProvider。
|
||||
|
||||
5. 补充Intent,负责对应一次操作中的动作、动作涉及的数据、附加数据进行描述。Android根据此描述找到对应的组件,将intent传递给调用的组件。
|
||||
|
||||
- **Android应用程序框架层**
|
||||
|
||||
1. 使用java语言编写。
|
||||
|
||||
2. 使用java native interface调用core lib层的本地方法
|
||||
|
||||
3. 实现了一系列服务:活动管理器,窗口管理器、内容提供器、视图系统、通告管理器、包管理器、电话管理器、资源管理器、位置管理器、xmpp服务。
|
||||
|
||||
- **系统运行库**
|
||||
|
||||
1. 系统C库: 从BSD集成的标准C系统函数库
|
||||
|
||||
2. 媒体库:基于OpenMax库,支持多种音频视频图像文件
|
||||
|
||||
3. Serface Manager:显示子系统管理,提供了2D&3D图层的无缝融合
|
||||
|
||||
4. LibWebCore:最新的web浏览器引擎。
|
||||
|
||||
5. SGL:底层的2D图形引擎
|
||||
|
||||
6. 3Dlibraries:基于OpenGL3D软件加速
|
||||
|
||||
7. FreeType:文图和矢量图字体显示
|
||||
|
||||
8. SQLLite:数据库引擎。
|
||||
|
||||
9. Dalvik:虚拟机,在程序执行时,编译成dex的字节码后交给dalvik虚拟机执行
|
||||
|
||||
10. ART:虚拟机,Dalvik的替代品。在应用成许安装时,吧程序代码转换成及其语言,避让程序成为真正的本地应用。
|
||||
|
||||
- 采用了AOT预编译技术。函数调用去虚拟化,调用接口和虚函数时,需要寻找真正的函数,浪费大量的时间。去虚拟化后可以迅速调用。消除异常检查。
|
||||
|
||||
- 更高效的垃圾回收机制GC。GC调用有三种情况:GC_EXPLICIT(应用程序通过system.gc主动调用)GC_FOR_ALLOC(内存分配不足时)
|
||||
GC_CONCURRENT(给java层分配内存后,计算一份陪的大小达到阈值时,对象大小超过384KB)GC_MALLOC(内存分配失败)GC_EXTERANL_ALLOC(外部内存分配失败)
|
||||
|
||||
- **Linux内核**
|
||||
|
||||
安全性、内存管理、进程管理、网络协议栈、驱动模型。
|
||||
182
Android/应用资源(二)原生资源.md
Normal file
182
Android/应用资源(二)原生资源.md
Normal file
@@ -0,0 +1,182 @@
|
||||
**\>使用原始XML资源**
|
||||
|
||||
- 文件路径:
|
||||
|
||||
在/res/xml/路径下创建xml内容。
|
||||
|
||||
- 访问方式:
|
||||
|
||||
- java中package_name.R.xml.file_name
|
||||
|
||||
- @package_name:xml/file_name
|
||||
|
||||
- 获得实际的XML文件的方法
|
||||
|
||||
- XmlResourceParser getXml(int
|
||||
id),使用XMLPullParser来解析该XML文档,该方法返回一个解析器对象(XMLResourceParser是XmlPullParser的子类)
|
||||
|
||||
- InputStream openRawResource(int id)获取xml文档对应的输入流。
|
||||
|
||||
- 使用XML文件
|
||||
|
||||
XmlResourceParser xrp = getResources().getXml(R.xml.books)
|
||||
|
||||
xrp.getName()获取标签名
|
||||
|
||||
xrp.getAttributedValue(null,”price”);根据属性名获取属性值
|
||||
|
||||
xrp.getAttributeVale(1);根据属性的索引来获取属性的值
|
||||
|
||||
xrp.nextText()获取文本内容
|
||||
|
||||
xrp.next()下一个事件
|
||||
|
||||
**\>使用布局文件**
|
||||
|
||||
> 参照第二章内容
|
||||
|
||||
**\>使用菜单资源**
|
||||
|
||||
> 参照第二章内容
|
||||
|
||||
**\>样式和主题**
|
||||
|
||||
> 感觉样式和主题就有点像html中css的作用,负责通过xml定义一系列完整的格式;而普通的java代码,就像网页前端中js脚本,负责完成前端的简单页面逻辑;普通的xml代码就像html代码,负责整体的布局。
|
||||
|
||||
- 样式的含义:相当于多个格式的集合,其他UI组件通过style属性来指定样式。
|
||||
|
||||
- 样式的定义:
|
||||
|
||||
- name:指定样式的名称
|
||||
|
||||
- parent:指定继承的父样式,获得父样式中的所有格式,同时可以覆盖父样式
|
||||
|
||||
\<resources\> \<style name="style1"\> \<item
|
||||
name="android:textSize"\>20sp\</item\> \<item
|
||||
name="android:textColor"\>\#00d\</item\> \</style\> \</resources\>
|
||||
|
||||
- 1
|
||||
|
||||
- 2
|
||||
|
||||
- 3
|
||||
|
||||
- 4
|
||||
|
||||
- 5
|
||||
|
||||
- 6
|
||||
|
||||
- 样式的使用:style = “@package\_name:style/file_name”
|
||||
|
||||
- 主题资源:不能作用于单个View组件,主体应该对整个应用中所有的Activity起作用,或对指定的Activity起作用。主要是定义窗口外观的格式。
|
||||
|
||||
- 主题资源的定义方法
|
||||
|
||||
\<style name="CrazyTheme"\> \<item name="android:windowNoTitle"\>true\</item\>
|
||||
\<item name="android:windowFullscreen"\>true\</item\> \<item
|
||||
name="android:windowFrame"\>@drawable/star\</item\> \</style\>
|
||||
|
||||
- 1
|
||||
|
||||
- 2
|
||||
|
||||
- 3
|
||||
|
||||
- 4
|
||||
|
||||
- 5
|
||||
|
||||
- 主题资源的使用方法:
|
||||
|
||||
- java:setTheme(R.style.CrazyTheme);指定单一的Activity应用主题
|
||||
|
||||
- manifest.xml:;对整个工程使用某个主题。
|
||||
|
||||
- xml在单个Activity中使用某个主题
|
||||
|
||||
android内置了大量的主题资源
|
||||
|
||||
**\>属性资源**
|
||||
|
||||
- 属性资源的定义:
|
||||
|
||||
- attr子元素:定义了一个属性
|
||||
|
||||
- declare-styleable子元素:定义了一个styleable对象,包含了一组attr属性值。
|
||||
|
||||
- 属性资源的使用:
|
||||
|
||||
TypedArray
|
||||
typedArray=content.obtaintStyledattributes(attrs,R.styleable.alphaImageView);
|
||||
int duration= typedArray.getInt(R.styleable.AlphaImageView\_duration,0)
|
||||
alphaDelta = 255 \* SPEED / duration;
|
||||
|
||||
- 1
|
||||
|
||||
- 2
|
||||
|
||||
- 3
|
||||
|
||||
**\>使用原始资源**
|
||||
|
||||
- 存放位置:/res/raw/或者/assets/目录下,前者会在R资源清单中生成一个索引项。后者是更彻底的原始资源,android需要通过AssetManager来管理该目录下的原始资源。
|
||||
|
||||
- R清单中的访问方式:@package_name:raw/file_name;或者:package_name.R.raw.file_name;
|
||||
|
||||
- asset中访问方式:
|
||||
|
||||
- InputStream open(String fileName):根据文件名来获取原始资源对应的输入流
|
||||
|
||||
- AssetFileDescriptor openFd(String
|
||||
fileName):根据文件名来获取原始资源对应的AssetFileDescriptor。AssetFileDescriptor代表了一项原始资源的描述,应用程序可以通过AssetFileDescriptor来获取原始资源。
|
||||
|
||||
**\>国际化和资源自适应**
|
||||
|
||||
- java实现国际化的方法:
|
||||
|
||||
将标签和提示等信息放在资源文件中,资源文件是键值对,对每个资源文件中的key是不变的,但value随着不同的国家和语言改变。
|
||||
|
||||
- java程序国际化的实现方法:
|
||||
|
||||
- java.util.ResourceBundle:加载一个国家的语言包
|
||||
|
||||
- java.util.Locale:用于封装一个特定的国家区域、语言环境。
|
||||
|
||||
- java.text.MessageFormat:用于格式化带占位符的字符串。
|
||||
|
||||
- baseName_language\_country.properties
|
||||
|
||||
- baseName\_laguage.properties
|
||||
|
||||
- baseName.properties
|
||||
|
||||
- java支持的国家和语言
|
||||
|
||||
- 程序国际化的具体实现方法:
|
||||
|
||||
- 在不同国家的properties文件中定义大量的键值对,并将两个字节的值进行转换(native2ascii)。
|
||||
|
||||
- 获得当前系统的国家语言环境Locale = Locale.getDefault();
|
||||
|
||||
- 加载制定国家地区的properties文件,将得到的键值对放在bundle中:
|
||||
|
||||
ResourceBundle bundle = ResourceBundle.getBundle(“mess”,myLocale);
|
||||
|
||||
- 取出键值对中的值
|
||||
|
||||
System.out.println(bundle.getString(“hello”));
|
||||
|
||||
> 其他程序国际化的方法也一样,能够通过(资源-国家-r语言)的方式,来定义不同的国家。
|
||||
|
||||
**\>自适应不同屏幕的资源**
|
||||
|
||||
- 屏幕资源:屏幕尺寸,屏幕分辨率、屏幕方向
|
||||
|
||||
对dp和dpi的理解
|
||||
|
||||
dp出现的原因是android手机屏幕分辨率各不相同同,如果用px像素点来描述,会导致在不同的手机屏幕上效果差异较大。dp的目的是为了封装屏幕的分辨率。对于任何屏幕他的dp都是480dp\*320dp,如果分辨率更高,那么,1dp就等于更多的px,如果分辨率更低,1dp就等于更少的px。其中dp和平乡的换算公式,被称为dpi,就是单位dp中含有像素的个数,或者说,单位inch中含有像素点的个数。
|
||||
|
||||
事实上dp的工作机制跟上述内容不同,但是为什么采取一种错误的理解方式,因为他们的机制一样,但是结果不一样。
|
||||
|
||||
那就应该用学习html中的方法,机制理解起来可能比较简单,重要的是对标签的记忆组合与对审美的要求。而js和android中的java代码则对逻辑要求比较严谨。
|
||||
154
PHP/cookie & sessions & email.md
Normal file
154
PHP/cookie & sessions & email.md
Normal file
@@ -0,0 +1,154 @@
|
||||
\>cookie
|
||||
|
||||
\>\>定义:
|
||||
|
||||
cookie是服务器留在用户计算机中的小文件,每当相同的计算机通过浏览器请求页面时,他会同时发送cookie。通过php,能够创建并取回cookie的值
|
||||
|
||||
\>\>setcookie(name, value, expire, path, domain);
|
||||
|
||||
expire参数是过期时间
|
||||
|
||||
\>\>\$_COOKIE["user"] //这些全局变量都是数组
|
||||
|
||||
用于取回cookie的值
|
||||
|
||||
print_r(\$_COOKIE); //能显示所有的数组
|
||||
|
||||
isset(\$_COOKIE["user"]);//用于确定是否设置了cookie
|
||||
|
||||
setcokkie("name", "",
|
||||
time()-3600);//当删除cookie是应当以国企日期变更为过去的时间点(不明白)
|
||||
|
||||
\>\>如果浏览器不支持cookie,可以使用表单将信息存在php中
|
||||
|
||||
\>sessions
|
||||
|
||||
\>\>作用:session变量用于存储有关用户会话的信息,更改用户会话的设置。保存信息属于单一用户,并且可供提供应用程序中的所有应用程序中的所有页面使用。
|
||||
|
||||
\>\>作用地点:服务器上,作用时间:用户离开网站时,这一部分会被删除。
|
||||
|
||||
\>\>session_start() //启动session变量,在html标签之前
|
||||
|
||||
\>\>存取session变量使用\$_SESSION
|
||||
|
||||
使用isset(\$_SESSION)判定是否设定变量
|
||||
|
||||
使用unset(\$_SESSION)函数释放单个session变量
|
||||
|
||||
使用session_destoy()终止所有\$_SESSION变量(无参数)
|
||||
|
||||
\>mail
|
||||
|
||||
\>\>maili(to, subject, message, headers, parameters)
|
||||
|
||||
分别是(接受者, 主题, 消息内容, 副标题, 额外的参数)
|
||||
|
||||
\>\>简易E-mail的实现,从脚本直接发送电子邮件(虚拟服务器实现失败)
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51941611)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51941611)
|
||||
|
||||
1. \<span style="font-size:14px;"\>\<html\>
|
||||
|
||||
2. \<body\>
|
||||
|
||||
3.
|
||||
|
||||
4. \<?php
|
||||
|
||||
5. **if** (isset(\$_REQUEST['email']))
|
||||
|
||||
6. //if "email" is filled out, send email
|
||||
|
||||
7. {
|
||||
|
||||
8. //send email
|
||||
|
||||
9. \$email = \$_REQUEST['email'] ;
|
||||
|
||||
10. \$subject = \$_REQUEST['subject'] ;
|
||||
|
||||
11. \$message = \$_REQUEST['message'] ;
|
||||
|
||||
12. mail( "someone@example.com", "Subject: \$subject",
|
||||
|
||||
13. \$message, "From: \$email" );
|
||||
|
||||
14. echo "Thank you for using our mail form";
|
||||
|
||||
15. }
|
||||
|
||||
16. **else**
|
||||
|
||||
17. //if "email" is not filled out, display the form
|
||||
|
||||
18. {
|
||||
|
||||
19. echo "\<form method='post' action='mailform.php'\>
|
||||
|
||||
20. Email: \<input name='email' type='text' /\>\<br /\>
|
||||
|
||||
21. Subject: \<input name='subject' type='text' /\>\<br /\>
|
||||
|
||||
22. Message:\<br /\>
|
||||
|
||||
23. \<textarea name='message' rows='15' cols='40'\>
|
||||
|
||||
24. \</textarea\>\<br /\>
|
||||
|
||||
25. \<input type='submit' /\>
|
||||
|
||||
26. \</form\>";
|
||||
|
||||
27. }
|
||||
|
||||
28. ?\>
|
||||
|
||||
29.
|
||||
|
||||
30. \</body\>
|
||||
|
||||
31. \</html\>\</span\>
|
||||
|
||||
\>安全的电子邮件
|
||||
|
||||
电子邮件表单的风险:可能用户在输入框中注入代码
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51941611)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51941611)
|
||||
|
||||
1. \<span style="font-size:14px;"\>**function** spamcheck(\$field)
|
||||
|
||||
2. {
|
||||
|
||||
3. //filter_var() sanitizes the e-mail ,净化email
|
||||
|
||||
4. //address using FILTER_SANITIZE_EMAIL,从验证邮件中删除电子邮件的非法字符
|
||||
|
||||
5. \$field=filter\_var(\$field, FILTER_SANITIZE_EMAIL);
|
||||
|
||||
6.
|
||||
|
||||
7. //filter_var() validates the e-mail,确定email的合法性
|
||||
|
||||
8. //address using FILTER_VALIDATE_EMAIL,验证电子邮件地址
|
||||
|
||||
9. **if**(filter_var(\$field, FILTER_VALIDATE_EMAIL))
|
||||
|
||||
10. {
|
||||
|
||||
11. **return** TRUE;
|
||||
|
||||
12. }
|
||||
|
||||
13. **else**
|
||||
|
||||
14. {
|
||||
|
||||
15. **return** FALSE;
|
||||
|
||||
16. }
|
||||
|
||||
17. }\</span\>
|
||||
|
||||
在上一段代码之前加上这一段代码
|
||||
526
PHP/error & exception & filter.md
Normal file
526
PHP/error & exception & filter.md
Normal file
@@ -0,0 +1,526 @@
|
||||
\>error错误处理
|
||||
|
||||
\>\>基本错误处理die("错误反馈字符串"),能终止当前脚本的执行
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51942164)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51942164)
|
||||
|
||||
1. \<span style="font-size:14px;"\>\<?php
|
||||
|
||||
2. **if**(!file\_exists("welcome.txt"))
|
||||
|
||||
3. {
|
||||
|
||||
4. **die**("File not found");
|
||||
|
||||
5. }
|
||||
|
||||
6. **else**
|
||||
|
||||
7. {
|
||||
|
||||
8. \$file=fopen("welcome.txt","r");
|
||||
|
||||
9. }
|
||||
|
||||
10. ?\>\</span\>
|
||||
|
||||
\>\>自定义函数处理错误
|
||||
|
||||
\>\>错误记录
|
||||
|
||||
\>exception异常处理
|
||||
|
||||
\>\>可能的处理方式:
|
||||
|
||||
保存代码退出脚本执行
|
||||
|
||||
切换到预先定义好的异常处理函
|
||||
|
||||
重新执行代码或者从代码另外的位置继续执行脚本
|
||||
|
||||
\>\>异常的基本使用
|
||||
|
||||
步骤:抛出异常 - 捕获异常(对异常进行匹配) - 处理异常
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51942164)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51942164)
|
||||
|
||||
1. \<span style="font-size:14px;"\>\<?php
|
||||
|
||||
2. //create function with an exception
|
||||
|
||||
3. **function** checkNum(\$number)
|
||||
|
||||
4. {
|
||||
|
||||
5. **if**(\$number\>1)
|
||||
|
||||
6. {
|
||||
|
||||
7. **throw** **new** Exception("Value must be 1 or below");
|
||||
|
||||
8. }
|
||||
|
||||
9. **return** true;
|
||||
|
||||
10. }
|
||||
|
||||
11.
|
||||
|
||||
12. //trigger exception
|
||||
|
||||
13. checkNum(2);
|
||||
|
||||
14. ?\>\</span\>
|
||||
|
||||
//其中使用throw new Exception("Value must be 1 or
|
||||
below")抛出了异常,但没有查找到匹配模块,出现致命错误。
|
||||
|
||||
\>\>异常抛出的完整过程及其解释
|
||||
|
||||
try 异常函数位于try代码块内进行检测
|
||||
|
||||
throw 每一个throw对应一个catch
|
||||
|
||||
catch 捕获异常,创建一个包含异常信息的对象
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51942164)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51942164)
|
||||
|
||||
1. \<span style="font-size:14px;"\>\<?php
|
||||
|
||||
2. //创建可抛出一个异常的函数
|
||||
|
||||
3. **function** checkNum(\$number)
|
||||
|
||||
4. {
|
||||
|
||||
5. **if**(\$number\>1)
|
||||
|
||||
6. {
|
||||
|
||||
7. \<span style="color:\#ff0000;"\>**throw** **new** Exception("Value must be 1
|
||||
or below");//想当于创建了一个新的对象,其中“”是构造函数的参数。\</span\>
|
||||
|
||||
8. }
|
||||
|
||||
9. **return** true;
|
||||
|
||||
10. }
|
||||
|
||||
11.
|
||||
|
||||
12. //在 "try" 代码块中触发异常
|
||||
|
||||
13. try
|
||||
|
||||
14. {
|
||||
|
||||
15. checkNum(2);
|
||||
|
||||
16. //If the exception is thrown, this text will not be shown
|
||||
|
||||
17. echo 'If you see this, the number is 1 or below';
|
||||
|
||||
18. }
|
||||
|
||||
19.
|
||||
|
||||
20. //捕获异常
|
||||
|
||||
21. \<span style="color:\#ff0000;"\>catch(Exception \$e)\</span\>
|
||||
|
||||
22. {
|
||||
|
||||
23. echo 'Message: ' .\$e-\>getMessage();
|
||||
|
||||
24. }
|
||||
|
||||
25. ?\>\</span\>
|
||||
|
||||
26. 创建 checkNum() 函数。它检测数字是否大于 1。如果是,则抛出一个异常。
|
||||
|
||||
27. 在 "try" 代码块中调用 checkNum() 函数。
|
||||
|
||||
28. checkNum() 函数中的异常被抛出
|
||||
|
||||
29. "catch" 代码块接收到该异常,并创建一个包含异常信息的对象 (\$e)。
|
||||
|
||||
30. 通过从这个 exception 对象调用 \$e-\>getMessage(),输出来自该异常的错误消息
|
||||
|
||||
//这里exception就是一个类的定义,可以定义相应的对象,然后内部有函数如gerMessage()可以返回异常信息。
|
||||
|
||||
\>\>自定义的exception类(同样存在继承关系)
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51942164)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51942164)
|
||||
|
||||
1. \<span style="font-size:14px;"\>\<span style="color:\#ff0000;"\>**class**
|
||||
customException **extends** Exception//注意继承类的定义\</span\>
|
||||
|
||||
2. {
|
||||
|
||||
3. **public** **function** errorMessage()
|
||||
|
||||
4. {
|
||||
|
||||
5. //error message
|
||||
|
||||
6. \$errorMsg = 'Error on line '.\$this-\>getLine().' in '.\$this-\>getFile()
|
||||
|
||||
7. .': \<b\>'.\$this-\>getMessage().'\</b\> is not a valid E-Mail address';
|
||||
|
||||
8. **return** \$errorMsg;
|
||||
|
||||
9. }
|
||||
|
||||
10. }
|
||||
|
||||
11.
|
||||
|
||||
12. \$email = "someone@example...com";
|
||||
|
||||
13.
|
||||
|
||||
14. try
|
||||
|
||||
15. {
|
||||
|
||||
16. //check if
|
||||
|
||||
17. **if**(filter_var(\$email, FILTER_VALIDATE_EMAIL) === FALSE)
|
||||
|
||||
18. {
|
||||
|
||||
19. //throw exception if email is not valid
|
||||
|
||||
20. **throw** **new** customException(\$email);
|
||||
|
||||
21. }
|
||||
|
||||
22. }
|
||||
|
||||
23.
|
||||
|
||||
24. catch (customException \$e)
|
||||
|
||||
25. {
|
||||
|
||||
26. //display custom message
|
||||
|
||||
27. echo \$e-\>errorMessage();
|
||||
|
||||
28. }\</span\>
|
||||
|
||||
系统中exception类的内部函数有getLine() 、 getFile()、 getMessage()
|
||||
|
||||
\>\>多个异常的处理
|
||||
|
||||
用不同的异常处理类来捕获不同的异常。
|
||||
|
||||
\>\>重新抛出异常
|
||||
|
||||
用不同的异常处理类,一个类执行时,向另一个类抛出异常。
|
||||
|
||||
\>\>设置顶层异常处理器
|
||||
|
||||
set_exception_handler()设置处理所有未捕获异常的用户定义函数
|
||||
|
||||
//当没有异常抛出时硬要抛出一个异常,来显示我定义了某个函数。
|
||||
|
||||
\>\>异常处理规则
|
||||
|
||||
- 需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。
|
||||
|
||||
- 每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。
|
||||
|
||||
- 使用多个 catch
|
||||
代码块可以捕获不同种类的异常。不同的异常,就是属于不同的异常类,有多少种异常,就应该定义多少种类。
|
||||
|
||||
- 可以在 try 代码块内的 catch 代码块中再次抛出(re-thrown)异常。
|
||||
|
||||
**\>filter过滤器(错误处理部分的过滤器没看懂)**
|
||||
|
||||
用于过滤非安全来源的数据
|
||||
|
||||
验证和过滤用户输入或自定义数据是任何web应用程序的重要组成部分
|
||||
|
||||
设计PHP的过滤器扩展的目的是是数据过滤更轻松快捷
|
||||
|
||||
目的:数据类型匹配(来自外部数据和内部要求)
|
||||
|
||||
\>\>过滤函数
|
||||
|
||||
- filter_var() - 通过一个指定的过滤器来过滤单一的变量
|
||||
|
||||
- filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
|
||||
|
||||
- filter_input - 获取一个输入变量,并对它进行过滤
|
||||
|
||||
- filter_input_array -
|
||||
获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤
|
||||
|
||||
- filter_has_var() - 判断变量是否存在
|
||||
|
||||
- filter\_id()
|
||||
|
||||
- filter\_list()
|
||||
|
||||
\>\>过滤器
|
||||
|
||||
FILTER_CALLBACK //调用用户自定义的函数过滤数据
|
||||
|
||||
sanitize:净化,表示对检测的数据进行处理
|
||||
|
||||
FILTER_SANITIZE_ENCODED //去除编码的特殊符号
|
||||
|
||||
FILTER_SANITIZE_SPECIAL_CHARS //html转义字符,ascII小于32的字符
|
||||
|
||||
FILTER_SANITIZE_STRING //去除标签和编码的特殊字符
|
||||
|
||||
FILTER_SANITIZE_EMAIL //去除非email字符
|
||||
|
||||
FILTER_SANITIZE_URL //去除非URL字符
|
||||
|
||||
FILTER_SANITIZE_NUMBER_INT //保留数字和加减号
|
||||
|
||||
FILTER_SANITIZE_NUMBER_FLOAT //保留浮点字符
|
||||
|
||||
FILTER_SANITIZE_MAGIC_QUOTERS //应用addslash()不是很明白
|
||||
|
||||
balidate:确定,验证用户输入,严格的格式规则
|
||||
|
||||
FILTER_VALIDATE_INT //确定整型
|
||||
|
||||
FILTER_VALIDATE_VOOLEAN//确定布尔型
|
||||
|
||||
FILTER_VALIDATE_FLOAT//确定浮点型
|
||||
|
||||
FILTER_VALIDATE\_URL//确定合法URL
|
||||
|
||||
FILTER_VALIDATE_EMAIL//确定邮件
|
||||
|
||||
FILTER_VALIDATE_IP//确定ip地址
|
||||
|
||||
\>\>不同的过滤器有不同的选项和标志
|
||||
|
||||
//所以说每次在使用前,去找本参考手册好好看看。网站上的并不全面。
|
||||
|
||||
//FILTER_VALIDATE_INT的参数就是一个嵌套数组
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51942164)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51942164)
|
||||
|
||||
1. \<span style="font-size:14px;"\>\<?php
|
||||
|
||||
2. \$var=300;
|
||||
|
||||
3.
|
||||
|
||||
4. \$int_options = **array**(
|
||||
|
||||
5. "options"=\>**array**
|
||||
|
||||
6. (
|
||||
|
||||
7. "min_range"=\>0,
|
||||
|
||||
8. "max_range"=\>256
|
||||
|
||||
9. )
|
||||
|
||||
10. );
|
||||
|
||||
11.
|
||||
|
||||
12. **if**(!filter_var(\$var, FILTER_VALIDATE_INT, \$int_options))
|
||||
|
||||
13. {
|
||||
|
||||
14. echo("Integer is not valid");
|
||||
|
||||
15. }
|
||||
|
||||
16. **else**
|
||||
|
||||
17. {
|
||||
|
||||
18. echo("Integer is valid");
|
||||
|
||||
19. }
|
||||
|
||||
20. ?\>\</span\>
|
||||
|
||||
\>\>验证输入filter_input(INPUT_GET, "email",FILTER_VALIDATE_EMAIL)
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51942164)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51942164)
|
||||
|
||||
1. \<span style="font-size:14px;"\>\<?php
|
||||
|
||||
2. **if**(!filter_has_var(INPUT_GET, "email"))
|
||||
|
||||
3. {
|
||||
|
||||
4. echo("Input type does not exist");
|
||||
|
||||
5. }
|
||||
|
||||
6. **else**
|
||||
|
||||
7. {
|
||||
|
||||
8. \<span style="color:\#ff0000;"\> **if** (!filter_input(INPUT_GET, "email",
|
||||
FILTER_VALIDATE_EMAIL))//不是很明白INPUT_GET的意思,难道是超全局变量?\</span\>
|
||||
|
||||
9. {
|
||||
|
||||
10. echo "E-Mail is not valid";
|
||||
|
||||
11. }
|
||||
|
||||
12. **else**
|
||||
|
||||
13. {
|
||||
|
||||
14. echo "E-Mail is valid";
|
||||
|
||||
15. }
|
||||
|
||||
16. }
|
||||
|
||||
17. ?\>\</span\>
|
||||
|
||||
\>\>净化输入filter_input(INPUT_POST, "URL", FILTER_SANITIZE_URL)
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51942164)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51942164)
|
||||
|
||||
1. \<span style="font-size:14px;"\>\<?php
|
||||
|
||||
2. **if**(!filter_has_var(INPUT_POST, "url"))
|
||||
|
||||
3. {
|
||||
|
||||
4. echo("Input type does not exist");
|
||||
|
||||
5. }
|
||||
|
||||
6. **else**
|
||||
|
||||
7. {
|
||||
|
||||
8. \$url = filter\_input(INPUT_POST, "url", FILTER_SANITIZE_URL);
|
||||
|
||||
9. }
|
||||
|
||||
10. ?\>\</span\>
|
||||
|
||||
\>\>过滤多个输入
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51942164)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51942164)
|
||||
|
||||
1. \<span style="font-size:14px;"\>\<?php
|
||||
|
||||
2. \$filters = **array**
|
||||
|
||||
3. (
|
||||
|
||||
4. "name" =\> **array**
|
||||
|
||||
5. (
|
||||
|
||||
6. "filter"=\>FILTER_SANITIZE_STRING
|
||||
|
||||
7. ),
|
||||
|
||||
8. "age" =\> **array**
|
||||
|
||||
9. (
|
||||
|
||||
10. "filter"=\>FILTER_VALIDATE_INT,
|
||||
|
||||
11. "options"=\>**array**
|
||||
|
||||
12. (
|
||||
|
||||
13. "min_range"=\>1,
|
||||
|
||||
14. "max_range"=\>120
|
||||
|
||||
15. )
|
||||
|
||||
16. ),
|
||||
|
||||
17. "email"=\> FILTER_VALIDATE_EMAIL,
|
||||
|
||||
18. );
|
||||
|
||||
19.
|
||||
|
||||
20. \$result = filter_input\_array(INPUT_GET, \$filters);
|
||||
|
||||
21.
|
||||
|
||||
22. **if** (!\$result["age"])
|
||||
|
||||
23. {
|
||||
|
||||
24. echo("Age must be a number between 1 and 120.\<br /\>");
|
||||
|
||||
25. }
|
||||
|
||||
26. **elseif**(!\$result["email"])
|
||||
|
||||
27. {
|
||||
|
||||
28. echo("E-Mail is not valid.\<br /\>");
|
||||
|
||||
29. }
|
||||
|
||||
30. **else**
|
||||
|
||||
31. {
|
||||
|
||||
32. echo("User input is valid");
|
||||
|
||||
33. }
|
||||
|
||||
34. ?\>\</span\>
|
||||
|
||||
1. 设置一个数组,其中包含了输入变量的名称,以及用于指定的输入变量的过滤器
|
||||
|
||||
2. 调用 filter_input_array 函数,参数包括 GET 输入变量及刚才设置的数组
|
||||
|
||||
3. 检测 \$result 变量中的 "age" 和 "email"
|
||||
变量是否有非法的输入。(如果存在非法输入,)
|
||||
|
||||
\>\>使用filter callback,自定义函数过滤器
|
||||
|
||||
将下划线装换为空格
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51942164)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51942164)
|
||||
|
||||
1. \<span style="font-size:14px;"\>\<?php
|
||||
|
||||
2. **function** convertSpace(\$string)
|
||||
|
||||
3. {
|
||||
|
||||
4. **return** str\_replace("_", " ", \$string);
|
||||
|
||||
5. }
|
||||
|
||||
6.
|
||||
|
||||
7. \$string = "Peter_is_a_great_guy!";
|
||||
|
||||
8.
|
||||
|
||||
9. echo filter\_var(\$string, FILTER_CALLBACK,
|
||||
**array**("options"=\>"convertSpace"));
|
||||
|
||||
10. ?\>\</span\>
|
||||
122
PHP/多维数组和日期.md
Normal file
122
PHP/多维数组和日期.md
Normal file
@@ -0,0 +1,122 @@
|
||||
\>多维数组的建立
|
||||
|
||||
\>\>对于多维数组来说,同样需要多级索引来定位元素
|
||||
|
||||
**[html]** [view plain](http://blog.csdn.net/estom_yin/article/details/51920304)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51920304)
|
||||
|
||||
1. **\<body\>**
|
||||
|
||||
2.
|
||||
|
||||
3. **\<?php**
|
||||
|
||||
4. \$cars = array
|
||||
|
||||
5. (
|
||||
|
||||
6. array("Volvo",33,20),
|
||||
|
||||
7. array("BMW",17,15),
|
||||
|
||||
8. array("Saab",5,2),
|
||||
|
||||
9. array("Land Rover",15,11)
|
||||
|
||||
10. );
|
||||
|
||||
11.
|
||||
|
||||
12. for (\$row = 0; \$row **\<** **4**; \$row++) {
|
||||
|
||||
13. echo "**\<p\>\<b\>**行数 \$row**\</b\>\</p\>**";
|
||||
|
||||
14. echo "**\<ul\>**";
|
||||
|
||||
15. for (\$col = 0; \$col **\<** **3**; \$col++) {
|
||||
|
||||
16. echo "**\<li\>**".\$cars[\$row][\$col]."**\</li\>**";
|
||||
|
||||
17. }
|
||||
|
||||
18. echo "**\</ul\>**";
|
||||
|
||||
19. }
|
||||
|
||||
20. **?\>**
|
||||
|
||||
21.
|
||||
|
||||
22. **\</body\>**
|
||||
|
||||
//这些代码也说明了一个问题,使用php可以直接输出html格式并显示
|
||||
|
||||
\>日期
|
||||
|
||||
PHP中Date(format, timestamp)
|
||||
|
||||
timestamp 规定时间戳,默认是当前时间
|
||||
|
||||
format 规定时间格式
|
||||
|
||||
d月中某天
|
||||
|
||||
m某月
|
||||
|
||||
y某年
|
||||
|
||||
l周里某天
|
||||
|
||||
h带有首位零的12小时格式
|
||||
|
||||
i带有首位零的分钟格式
|
||||
|
||||
s带有首位零的秒
|
||||
|
||||
a小写的五千后午后
|
||||
|
||||
date_default_timezone_set("Asia/Shanghai")//修改时区
|
||||
|
||||
mktime(hour, minute, second, month, day, year)//设定时间戳
|
||||
|
||||
strtotime(变化时间, now开始时间)//创建日期时间
|
||||
|
||||
//代码实现了输出周六的日期。
|
||||
|
||||
使用了date的时间戳,使用了灵活设定strtotime的变化时间
|
||||
|
||||
**[html]** [view plain](http://blog.csdn.net/estom_yin/article/details/51920304)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51920304)
|
||||
|
||||
1. **\<?php**
|
||||
|
||||
2. \$startdate = strtotime("Saturday");
|
||||
|
||||
3. \$enddate = strtotime("+6 weeks",\$startdate);
|
||||
|
||||
4.
|
||||
|
||||
5. while (\$startdate **\<** \$enddate) {
|
||||
|
||||
6. echo date("M d", \$startdate),"**\<br\>**";
|
||||
|
||||
7. \$startdate = strtotime("+1 week", \$startdate);
|
||||
|
||||
8. }
|
||||
|
||||
9. **?\>**
|
||||
|
||||
//代码实现了距离12月31还剩下的时间
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51920304)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51920304)
|
||||
|
||||
1. \<?php
|
||||
|
||||
2. \$d1=strtotime("December 31");
|
||||
|
||||
3. \$d2=ceil((\$d1-time())/60/60/24);
|
||||
|
||||
4. echo "距离十二月三十一日还有:" . \$d2 ." 天。";
|
||||
|
||||
5. ?\>
|
||||
232
PHP/文件操作.md
Normal file
232
PHP/文件操作.md
Normal file
@@ -0,0 +1,232 @@
|
||||
\>include
|
||||
|
||||
\>\>inclulde 或require 语句可以将PHP文件的内容插入另一个PHP文件
|
||||
|
||||
include只会生成警告,并且脚本会继续执行
|
||||
|
||||
require会生成致命错误,并停止脚本
|
||||
|
||||
\>\>语法:
|
||||
|
||||
include 'filename';
|
||||
|
||||
require 'filename';
|
||||
|
||||
\>\>注意:echo语句的分割符是句点(JS用加号连接)
|
||||
|
||||
echo "\<p\>Copyright © 2006-" . date("Y") . " W3School.com.cn\</p\>"
|
||||
|
||||
echo 可能就是让代码实现了动态化的输出,而不是静态的。
|
||||
|
||||
\>文件操做
|
||||
|
||||
\>\>readfile()
|
||||
|
||||
语法:redafile("webdictionary.txt");
|
||||
|
||||
其他文件的操做的函数请参考http://www.w3school.com.cn/php/php_ref_filesystem.asp
|
||||
|
||||
\>文件的打开、读取、修改
|
||||
|
||||
\>\>fopen("filename", "openmode");
|
||||
|
||||
openmode =
|
||||
|
||||
> r (read)只读,文件指针在开头
|
||||
|
||||
> w(write)只写,文件指针在开头;清空原有文件内容,或新建一个文件
|
||||
|
||||
> a(append)只写,文件指针在末尾,如果文件不存在,创建文件
|
||||
|
||||
> x只写,创建新文件,指针在开头
|
||||
|
||||
> r+读写,文件指针在开头
|
||||
|
||||
> w+读写,删除文件内容或创建文件
|
||||
|
||||
> a+读写,数据保留,数据保留了
|
||||
|
||||
> x+创建文件
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51920555)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51920555)
|
||||
|
||||
1. \<span style="font-size:14px;"\>\<?php
|
||||
|
||||
2. \$myfile = fopen("webdictionary.txt", "r") **or** **die**("Unable to open
|
||||
file!");
|
||||
|
||||
3. echo fread(\$myfile,filesize("webdictionary.txt"));
|
||||
|
||||
4. fclose(\$myfile);
|
||||
|
||||
5. ?\>\</span\>
|
||||
|
||||
\>\>fclose("filename");
|
||||
|
||||
\>\>fread(\$文件变量); // 读取打开的文件
|
||||
|
||||
\>\>fgets(\$文件变量); //从文件中读取单行,取完单行后文件指针会自动跳转到下一行
|
||||
|
||||
\>\>feof(\$文件变量); //检查文件是否已经结束
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51920555)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51920555)
|
||||
|
||||
1. \<span style="font-size:14px;"\>\<?php
|
||||
|
||||
2. \$myfile = fopen("webdictionary.txt", "r") **or** **die**("Unable to open
|
||||
file!");
|
||||
|
||||
3. // 输出单行直到 end-of-file
|
||||
|
||||
4. **while**(!feof(\$myfile)) {
|
||||
|
||||
5. echo fgets(\$myfile) . "\<br\>";
|
||||
|
||||
6. }
|
||||
|
||||
7. fclose(\$myfile);
|
||||
|
||||
8. ?\>\</span\>
|
||||
|
||||
\>\>fgetc() //读取单个字符,调用函数后,文件指针会移动到下一个字符
|
||||
|
||||
\>文件的创建和写入
|
||||
|
||||
\>\>fwrite(\$文件变量,\$字符串变量)
|
||||
//作用就是将字符串变量写入相应的文件,写完后,文件指针只想文章末尾
|
||||
|
||||
\>文件的上传
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51920555)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51920555)
|
||||
|
||||
1. \<span style="font-size:14px;"\>\<html\>
|
||||
|
||||
2. \<body\>
|
||||
|
||||
3.
|
||||
|
||||
4. \<form action="upload_file.php" method="post"
|
||||
|
||||
5. enctype="multipart/form-data"\>
|
||||
|
||||
6. \<label **for**="file"\>Filename:\</label\>
|
||||
|
||||
7. \<input type="file" name="file" id="file" /\>
|
||||
|
||||
8. \<br /\>
|
||||
|
||||
9. \<input type="submit" name="submit" value="Submit" /\>
|
||||
|
||||
10. \</form\>
|
||||
|
||||
11.
|
||||
|
||||
12. \</body\>
|
||||
|
||||
13. \</html\>\</span\>
|
||||
|
||||
\>\>\<form\>的enctype属性规定了提交表单的类型。二进制数据类型的表达enctype =
|
||||
“multipart/form-data”
|
||||
|
||||
action = 处理文件上传操作所用的PHP文件
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51920555)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51920555)
|
||||
|
||||
1. \<span style="font-size:14px;"\>\<?php
|
||||
|
||||
2. **if** (\$_FILES["file"]["error"] \> 0)
|
||||
|
||||
3. {
|
||||
|
||||
4. echo "Error: " . \$_FILES["file"]["error"] . "\<br /\>";
|
||||
|
||||
5. }
|
||||
|
||||
6. **else**
|
||||
|
||||
7. {
|
||||
|
||||
8. echo "Upload: " . \$_FILES["file"]["name"] . "\<br /\>";
|
||||
|
||||
9. echo "Type: " . \$_FILES["file"]["type"] . "\<br /\>";
|
||||
|
||||
10. echo "Size: " . (\$_FILES["file"]["size"] / 1024) . " Kb\<br /\>";
|
||||
|
||||
11. echo "Stored in: " . \$_FILES["file"]["tmp_name"];
|
||||
|
||||
12. }
|
||||
|
||||
13. ?\>\</span\>
|
||||
|
||||
\$_FILES["file"]["属性名称"]从客户的计算机上获取信息。
|
||||
|
||||
- \$_FILES["file"]["name"] - 被上传文件的名称
|
||||
|
||||
- \$_FILES["file"]["type"] - 被上传文件的类型
|
||||
|
||||
- \$_FILES["file"]["size"] - 被上传文件的大小,以字节计
|
||||
|
||||
- \$_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
|
||||
|
||||
- \$_FILES["file"]["error"] - 由文件上传导致的错误代码
|
||||
|
||||
\>\>上传限制
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51920555)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51920555)
|
||||
|
||||
1. \<span style="font-size:14px;"\>\<?php
|
||||
|
||||
2.
|
||||
|
||||
3. **if** (((\$_FILES["file"]["type"] == "image/gif")
|
||||
|
||||
4. \|\| (\$_FILES["file"]["type"] == "image/jpeg")
|
||||
|
||||
5. \|\| (\$_FILES["file"]["type"] == "image/pjpeg"))
|
||||
|
||||
6. && (\$_FILES["file"]["size"] \< 20000))
|
||||
|
||||
7. {
|
||||
|
||||
8. **if** (\$_FILES["file"]["error"] \> 0)
|
||||
|
||||
9. {
|
||||
|
||||
10. echo "Error: " . \$_FILES["file"]["error"] . "\<br /\>";
|
||||
|
||||
11. }
|
||||
|
||||
12. **else**
|
||||
|
||||
13. {
|
||||
|
||||
14. echo "Upload: " . \$_FILES["file"]["name"] . "\<br /\>";
|
||||
|
||||
15. echo "Type: " . \$_FILES["file"]["type"] . "\<br /\>";
|
||||
|
||||
16. echo "Size: " . (\$_FILES["file"]["size"] / 1024) . " Kb\<br /\>";
|
||||
|
||||
17. echo "Stored in: " . \$_FILES["file"]["tmp_name"];
|
||||
|
||||
18. }
|
||||
|
||||
19. }
|
||||
|
||||
20. **else**
|
||||
|
||||
21. {
|
||||
|
||||
22. echo "Invalid file";
|
||||
|
||||
23. }
|
||||
|
||||
24.
|
||||
|
||||
25. ?\>\</span\>
|
||||
|
||||
规定了只能上传jpeg 和pjpeg的文件,使用ifelse和全局变量。
|
||||
359
PHP/表单(1)-表单处理.md
Normal file
359
PHP/表单(1)-表单处理.md
Normal file
@@ -0,0 +1,359 @@
|
||||
\>PHPHTML与表单
|
||||
|
||||
\>\>表单的实现
|
||||
|
||||
> \<form action = "welcom.php" method = "post"\>
|
||||
|
||||
> name:\<input type = "text" name = "name"\>\<br\>
|
||||
|
||||
> E-mail:\<input type = "text" name "email"\>\<br\>
|
||||
|
||||
> \</form\>
|
||||
|
||||
\>\>分析action指明了表单数据会发送到welcome.php进行处理。
|
||||
|
||||
method指明了发送方式为post
|
||||
|
||||
\>\>.php对表单的处理
|
||||
|
||||
> \<body\>
|
||||
|
||||
> welcome
|
||||
|
||||
> \<?php
|
||||
|
||||
> echo \$_POST["name"];?\>
|
||||
|
||||
> \<br\>
|
||||
|
||||
> Your email address is:
|
||||
|
||||
> \<?php
|
||||
|
||||
> echo \$_POST["email"];
|
||||
|
||||
> ?\>
|
||||
|
||||
> \</body\>
|
||||
|
||||
\>\>get和post的理解
|
||||
|
||||
> 二者都是创建了数组,包含键/值对,键是表单控件的名称,值来源于用户输入的数据
|
||||
|
||||
> 创建的数组被赋值给超全局变量\$_GET和\$_POST
|
||||
|
||||
> \$_GET通过URL参数传递到当前脚本的变量数组;对任何人可见,不超过2000个字符
|
||||
|
||||
> \$_POST通过http post传递到当脚本的变量数组;对其他人不可见,传输量没有要求
|
||||
|
||||
\>表单验证
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51919136)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51919136)
|
||||
|
||||
1. \<body\>
|
||||
|
||||
2.
|
||||
|
||||
3. \<?php
|
||||
|
||||
4. // define variables and set to empty values
|
||||
|
||||
5. \$name = \$email = \$gender = \$comment = \$website = "";
|
||||
|
||||
6.
|
||||
|
||||
7. **if** (\$_SERVER["REQUEST_METHOD"] == "POST") {
|
||||
|
||||
8. \$name = test_input(\$_POST["name"]);
|
||||
|
||||
9. \$email = test_input(\$_POST["email"]);
|
||||
|
||||
10. \$website = test_input(\$_POST["website"]);
|
||||
|
||||
11. \$comment = test_input(\$_POST["comment"]);
|
||||
|
||||
12. \$gender = test_input(\$_POST["gender"]);
|
||||
|
||||
13. }
|
||||
|
||||
14.
|
||||
|
||||
15. **function** test_input(\$data) {
|
||||
|
||||
16. \$data = trim(\$data);
|
||||
|
||||
17. \$data = stripslashes(\$data);
|
||||
|
||||
18. \$data = htmlspecialchars(\$data);
|
||||
|
||||
19. **return** \$data;
|
||||
|
||||
20. }
|
||||
|
||||
21. ?\>
|
||||
|
||||
22.
|
||||
|
||||
23. \<h2\>PHP 验证实例\</h2\>
|
||||
|
||||
24. \<form method="post" action="\<?php echo
|
||||
htmlspecialchars(\$_SERVER["PHP_SELF"]);?\>"\>
|
||||
|
||||
25. 姓名:\<input type="text" name="name"\>
|
||||
|
||||
26. \<br\>\<br\>
|
||||
|
||||
27. 电邮:\<input type="text" name="email"\>
|
||||
|
||||
28. \<br\>\<br\>
|
||||
|
||||
29. 网址:\<input type="text" name="website"\>
|
||||
|
||||
30. \<br\>\<br\>
|
||||
|
||||
31. 评论:\<textarea name="comment" rows="5" cols="40"\>\</textarea\>
|
||||
|
||||
32. \<br\>\<br\>
|
||||
|
||||
33. 性别:
|
||||
|
||||
34. \<input type="radio" name="gender" value="female"\>女性
|
||||
|
||||
35. \<input type="radio" name="gender" value="male"\>男性
|
||||
|
||||
36. \<br\>\<br\>
|
||||
|
||||
37. \<input type="submit" name="submit" value="提交"\>
|
||||
|
||||
38. \</form\>
|
||||
|
||||
39.
|
||||
|
||||
40. \<?php
|
||||
|
||||
41. echo "\<h2\>您的输入:\</h2\>";
|
||||
|
||||
42. echo \$name;
|
||||
|
||||
43. echo "\<br\>";
|
||||
|
||||
44. echo \$email;
|
||||
|
||||
45. echo "\<br\>";
|
||||
|
||||
46. echo \$website;
|
||||
|
||||
47. echo "\<br\>";
|
||||
|
||||
48. echo \$comment;
|
||||
|
||||
49. echo "\<br\>";
|
||||
|
||||
50. echo \$gender;
|
||||
|
||||
51. ?\>
|
||||
|
||||
52.
|
||||
|
||||
53. \</body\>
|
||||
|
||||
\>\>总结:
|
||||
|
||||
> 有value属性的,返回name和value属性,没有的返回name和用户输入的字段
|
||||
|
||||
> action="\<?php echo htmlspecialchars(\$_SERVER["PHP_SELF"];?\>)\>"
|
||||
|
||||
> \$_SERVER["PHP_SELF"]返回当前执行脚本的文件名(即本章php文件)
|
||||
|
||||
> htmlspecialchars()这个函数将返回的文件名转换为html实体(也就是只能在html作为文本出现,将\<作为转义字符传给html)
|
||||
|
||||
\>\>trim()函数,去除用户中输入数据中不必要的字符(空格、制表符、换行符)
|
||||
|
||||
> stripslashes()函数,删除用户输入的反斜杠
|
||||
|
||||
\>\>
|
||||
\$_SERVER["REQUEST_METHOD"]变量可以检测表单是否提交,若提交,进行处理;若没有提交,则返回空表单。
|
||||
|
||||
\>表单必填
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51919136)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51919136)
|
||||
|
||||
1. \<body\>
|
||||
|
||||
2.
|
||||
|
||||
3. \<?php
|
||||
|
||||
4. // 定义变量并设置为空值
|
||||
|
||||
5. \$nameErr = \$emailErr = \$genderErr = \$websiteErr = "";
|
||||
|
||||
6. \$name = \$email = \$gender = \$comment = \$website = "";
|
||||
|
||||
7.
|
||||
|
||||
8. **if** (\$_SERVER["REQUEST_METHOD"] == "POST") {
|
||||
|
||||
9. **if** (empty(\$_POST["name"])) {
|
||||
|
||||
10. \$nameErr = "姓名是必填的";
|
||||
|
||||
11. } **else** {
|
||||
|
||||
12. \$name = test_input(\$_POST["name"]);
|
||||
|
||||
13. }
|
||||
|
||||
14.
|
||||
|
||||
15. **if** (empty(\$_POST["email"])) {
|
||||
|
||||
16. \$emailErr = "电邮是必填的";
|
||||
|
||||
17. } **else** {
|
||||
|
||||
18. \$email = test_input(\$_POST["email"]);
|
||||
|
||||
19. }
|
||||
|
||||
20.
|
||||
|
||||
21. **if** (empty(\$_POST["website"])) {
|
||||
|
||||
22. \$website = "";
|
||||
|
||||
23. } **else** {
|
||||
|
||||
24. \$website = test_input(\$_POST["website"]);
|
||||
|
||||
25. }
|
||||
|
||||
26.
|
||||
|
||||
27. **if** (empty(\$_POST["comment"])) {
|
||||
|
||||
28. \$comment = "";
|
||||
|
||||
29. } **else** {
|
||||
|
||||
30. \$comment = test_input(\$_POST["comment"]);
|
||||
|
||||
31. }
|
||||
|
||||
32.
|
||||
|
||||
33. **if** (empty(\$_POST["gender"])) {
|
||||
|
||||
34. \$genderErr = "性别是必选的";
|
||||
|
||||
35. } **else** {
|
||||
|
||||
36. \$gender = test_input(\$_POST["gender"]);
|
||||
|
||||
37. }
|
||||
|
||||
38. }
|
||||
|
||||
39.
|
||||
|
||||
40. **function** test_input(\$data) {
|
||||
|
||||
41. \$data = trim(\$data);
|
||||
|
||||
42. \$data = stripslashes(\$data);
|
||||
|
||||
43. \$data = htmlspecialchars(\$data);
|
||||
|
||||
44. **return** \$data;
|
||||
|
||||
45. }
|
||||
|
||||
46. ?\>
|
||||
|
||||
47.
|
||||
|
||||
48. \<h2\>PHP 验证实例\</h2\>
|
||||
|
||||
49. \<p\>\<span **class**="error"\>\* 必需的字段\</span\>\</p\>
|
||||
|
||||
50. \<form method="post" action="\<?php echo
|
||||
htmlspecialchars(\$_SERVER["PHP_SELF"]);?\>"\>
|
||||
|
||||
51. 姓名:\<input type="text" name="name"\>
|
||||
|
||||
52. \<span **class**="error"\>\* \<?php echo \$nameErr;?\>\</span\>
|
||||
|
||||
53. \<br\>\<br\>
|
||||
|
||||
54. 电邮:\<input type="text" name="email"\>
|
||||
|
||||
55. \<span **class**="error"\>\* \<?php echo \$emailErr;?\>\</span\>
|
||||
|
||||
56. \<br\>\<br\>
|
||||
|
||||
57. 网址:\<input type="text" name="website"\>
|
||||
|
||||
58. \<span **class**="error"\>\<?php echo \$websiteErr;?\>\</span\>
|
||||
|
||||
59. \<br\>\<br\>
|
||||
|
||||
60. 评论:\<textarea name="comment" rows="5" cols="40"\>\</textarea\>
|
||||
|
||||
61. \<br\>\<br\>
|
||||
|
||||
62. 性别:
|
||||
|
||||
63. \<input type="radio" name="gender" value="female"\>女性
|
||||
|
||||
64. \<input type="radio" name="gender" value="male"\>男性
|
||||
|
||||
65. \<span **class**="error"\>\* \<?php echo \$genderErr;?\>\</span\>
|
||||
|
||||
66. \<br\>\<br\>
|
||||
|
||||
67. \<input type="submit" name="submit" value="提交"\>
|
||||
|
||||
68. \</form\>
|
||||
|
||||
69.
|
||||
|
||||
70. \<?php
|
||||
|
||||
71. echo "\<h2\>您的输入:\</h2\>";
|
||||
|
||||
72. echo \$name;
|
||||
|
||||
73. echo "\<br\>";
|
||||
|
||||
74. echo \$email;
|
||||
|
||||
75. echo "\<br\>";
|
||||
|
||||
76. echo \$website;
|
||||
|
||||
77. echo "\<br\>";
|
||||
|
||||
78. echo \$comment;
|
||||
|
||||
79. echo "\<br\>";
|
||||
|
||||
80. echo \$gender;
|
||||
|
||||
81. ?\>
|
||||
|
||||
82.
|
||||
|
||||
83. \</body\>
|
||||
|
||||
\>\>解释:
|
||||
|
||||
定义了新的变量储存错误信息\$nameErr = \$emailErr = \$genderErr = \$websiteErr =
|
||||
""
|
||||
|
||||
当必选框输入的信息为空时,错误信息变量会被赋值为错误信息,否则为空
|
||||
|
||||
在表单中,每个数据项后都添加了一个php脚本,用于执行错误信息的输出,从一开始就被执行了,只是变量值为空。
|
||||
|
||||
最后,在表单最后输出用户已经输入的表单项
|
||||
243
PHP/表单(2)-表单完成.md
Normal file
243
PHP/表单(2)-表单完成.md
Normal file
@@ -0,0 +1,243 @@
|
||||
\>PHP验证名字
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51919984)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51919984)
|
||||
|
||||
1. \$name = test_input(\$_POST["name"]);
|
||||
|
||||
2. **if** (!preg\_match("/\^[a-zA-Z ]\*\$/",\$name)) {
|
||||
|
||||
3. \$nameErr = "只允许字母和空格!";
|
||||
|
||||
4. }
|
||||
|
||||
preg_match()检索匹配,正则表达式(有待详解)
|
||||
|
||||
\>PHP验证E-mail
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51919984)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51919984)
|
||||
|
||||
1. \$email = test_input(\$_POST["email"]);
|
||||
|
||||
2. **if** (!preg\_match("/([\\w\\-]+\\@[\\w\\-]+\\.[\\w\\-]+)/",\$email)) {
|
||||
|
||||
3. \$emailErr = "无效的 email 格式!";
|
||||
|
||||
4. }
|
||||
|
||||
\>验证URL
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51919984)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51919984)
|
||||
|
||||
1. \$website = test_input(\$_POST["website"]);
|
||||
|
||||
2. **if**
|
||||
(!preg\_match("/\\b(?:(?:https?\|ftp):\\/\\/\|www\\.)[-a-z0-9+&@\#\\/%?=\~_\|!:,.;]\*[-a-z0-9+&@\#\\/%
|
||||
|
||||
3. =\~_\|]/i",\$website)) {
|
||||
|
||||
4. \$websiteErr = "无效的 URL";
|
||||
|
||||
5. }
|
||||
|
||||
\>实例执行
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51919984)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51919984)
|
||||
|
||||
1. \<body\>
|
||||
|
||||
2.
|
||||
|
||||
3. \<?php
|
||||
|
||||
4. // 定义变量并设置为空值
|
||||
|
||||
5. \$nameErr = \$emailErr = \$genderErr = \$websiteErr = "";
|
||||
|
||||
6. \$name = \$email = \$gender = \$comment = \$website = "";
|
||||
|
||||
7.
|
||||
|
||||
8. **if** (\$_SERVER["REQUEST_METHOD"] == "POST") {
|
||||
|
||||
9. **if** (empty(\$_POST["name"])) {
|
||||
|
||||
10. \$nameErr = "姓名是必填的";
|
||||
|
||||
11. } **else** {
|
||||
|
||||
12. \$name = test_input(\$_POST["name"]);
|
||||
|
||||
13. // 检查姓名是否包含字母和空白字符
|
||||
|
||||
14. **if** (!preg\_match("/\^[a-zA-Z ]\*\$/",\$name)) {
|
||||
|
||||
15. \$nameErr = "只允许字母和空格";
|
||||
|
||||
16. }
|
||||
|
||||
17. }
|
||||
|
||||
18.
|
||||
|
||||
19. **if** (empty(\$_POST["email"])) {
|
||||
|
||||
20. \$emailErr = "电邮是必填的";
|
||||
|
||||
21. } **else** {
|
||||
|
||||
22. \$email = test_input(\$_POST["email"]);
|
||||
|
||||
23. // 检查电子邮件地址语法是否有效
|
||||
|
||||
24. **if** (!preg\_match("/([\\w\\-]+\\@[\\w\\-]+\\.[\\w\\-]+)/",\$email)) {
|
||||
|
||||
25. \$emailErr = "无效的 email 格式";
|
||||
|
||||
26. }
|
||||
|
||||
27. }
|
||||
|
||||
28.
|
||||
|
||||
29. **if** (empty(\$_POST["website"])) {
|
||||
|
||||
30. \$website = "";
|
||||
|
||||
31. } **else** {
|
||||
|
||||
32. \$website = test_input(\$_POST["website"]);
|
||||
|
||||
33. // 检查 URL 地址语法是否有效(正则表达式也允许 URL 中的斜杠)
|
||||
|
||||
34. **if**
|
||||
(!preg\_match("/\\b(?:(?:https?\|ftp):\\/\\/\|www\\.)[-a-z0-9+&@\#\\/%?=\~_\|!:,.;]\*[-a-z0-9+&@\#\\/%=\~_\|]/i",\$website))
|
||||
{
|
||||
|
||||
35. \$websiteErr = "无效的 URL";
|
||||
|
||||
36. }
|
||||
|
||||
37. }
|
||||
|
||||
38.
|
||||
|
||||
39. **if** (empty(\$_POST["comment"])) {
|
||||
|
||||
40. \$comment = "";
|
||||
|
||||
41. } **else** {
|
||||
|
||||
42. \$comment = test_input(\$_POST["comment"]);
|
||||
|
||||
43. }
|
||||
|
||||
44.
|
||||
|
||||
45. **if** (empty(\$_POST["gender"])) {
|
||||
|
||||
46. \$genderErr = "性别是必选的";
|
||||
|
||||
47. } **else** {
|
||||
|
||||
48. \$gender = test_input(\$_POST["gender"]);
|
||||
|
||||
49. }
|
||||
|
||||
50. }
|
||||
|
||||
51.
|
||||
|
||||
52. **function** test_input(\$data) {
|
||||
|
||||
53. \$data = trim(\$data);
|
||||
|
||||
54. \$data = stripslashes(\$data);
|
||||
|
||||
55. \$data = htmlspecialchars(\$data);
|
||||
|
||||
56. **return** \$data;
|
||||
|
||||
57. }
|
||||
|
||||
58. ?\>
|
||||
|
||||
59.
|
||||
|
||||
60. \<h2\>PHP 验证实例\</h2\>
|
||||
|
||||
61. \<p\>\<span **class**="error"\>\* 必需的字段\</span\>\</p\>
|
||||
|
||||
62. \<form method="post" action="\<?php echo
|
||||
htmlspecialchars(\$_SERVER["PHP_SELF"]);?\>"\>
|
||||
|
||||
63. 姓名:\<input type="text" name="name"\>
|
||||
|
||||
64. \<span **class**="error"\>\* \<?php echo \$nameErr;?\>\</span\>
|
||||
|
||||
65. \<br\>\<br\>
|
||||
|
||||
66. 电邮:\<input type="text" name="email"\>
|
||||
|
||||
67. \<span **class**="error"\>\* \<?php echo \$emailErr;?\>\</span\>
|
||||
|
||||
68. \<br\>\<br\>
|
||||
|
||||
69. 网址:\<input type="text" name="website"\>
|
||||
|
||||
70. \<span **class**="error"\>\<?php echo \$websiteErr;?\>\</span\>
|
||||
|
||||
71. \<br\>\<br\>
|
||||
|
||||
72. 评论:\<textarea name="comment" rows="5" cols="40"\>\</textarea\>
|
||||
|
||||
73. \<br\>\<br\>
|
||||
|
||||
74. 性别:
|
||||
|
||||
75. \<input type="radio" name="gender" value="female"\>女性
|
||||
|
||||
76. \<input type="radio" name="gender" value="male"\>男性
|
||||
|
||||
77. \<span **class**="error"\>\* \<?php echo \$genderErr;?\>\</span\>
|
||||
|
||||
78. \<br\>\<br\>
|
||||
|
||||
79. \<input type="submit" name="submit" value="提交"\>
|
||||
|
||||
80. \</form\>
|
||||
|
||||
81.
|
||||
|
||||
82. \<?php
|
||||
|
||||
83. echo "\<h2\>您的输入:\</h2\>";
|
||||
|
||||
84. echo \$name;
|
||||
|
||||
85. echo "\<br\>";
|
||||
|
||||
86. echo \$email;
|
||||
|
||||
87. echo "\<br\>";
|
||||
|
||||
88. echo \$website;
|
||||
|
||||
89. echo "\<br\>";
|
||||
|
||||
90. echo \$comment;
|
||||
|
||||
91. echo "\<br\>";
|
||||
|
||||
92. echo \$gender;
|
||||
|
||||
93. ?\>
|
||||
|
||||
94.
|
||||
|
||||
95. \</body\>
|
||||
|
||||
//摘自w3school
|
||||
141
PHP/语法(1)-基本语法.md
Normal file
141
PHP/语法(1)-基本语法.md
Normal file
@@ -0,0 +1,141 @@
|
||||
\>基本语法
|
||||
|
||||
\>\>脚本格式:
|
||||
|
||||
> \<?php
|
||||
|
||||
> //this is coded by php
|
||||
|
||||
> ?\>
|
||||
|
||||
\>\>注意事项
|
||||
|
||||
- php文件的扩展名是“.php”
|
||||
|
||||
- php文件包括html标签和php脚本代码
|
||||
|
||||
- ‘;’表示php句尾
|
||||
|
||||
- //或\#或/\*.....\*/表示php的注释
|
||||
|
||||
- php中,用户自定义的函数、类和关键词等都对大小写不敏感,但是变量名对大小写敏感
|
||||
|
||||
\>\>php 能做到什么
|
||||
|
||||
- 生成动态页面
|
||||
|
||||
- 创建打开读取写入删除关闭服务器上的文件
|
||||
|
||||
- 接受表单数据
|
||||
|
||||
- 能够发送并取回cookies
|
||||
|
||||
- 添加、删除、修改数据库中的数据
|
||||
|
||||
- 限制用户访问某些页面
|
||||
|
||||
- 对数据进行加密
|
||||
|
||||
- 通过PHP输出HTML、图像、PDF、flash。
|
||||
|
||||
\>变量
|
||||
|
||||
\>\>作用:存储数据的容器
|
||||
|
||||
\>\>格式:以\$开头,变量名以字母或下划线开始,对大小写敏感,不必说明类型
|
||||
|
||||
\>\>实例:
|
||||
|
||||
**[html]** [view plain](http://blog.csdn.net/estom_yin/article/details/51909873)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51909873)
|
||||
|
||||
1. **\<?php**
|
||||
|
||||
2. \$txt="Hello world!";
|
||||
|
||||
3. \$x=5;
|
||||
|
||||
4. \$y=10.5;
|
||||
|
||||
5. **?\>**
|
||||
|
||||
\>\>变量的作用域:
|
||||
|
||||
> local局部变量,在函数内部的变量,只能在函数内部进行访问。
|
||||
|
||||
> global全局变量,在函数外部的变量,只能在函数内部进行访问。
|
||||
|
||||
\>\>global关键词
|
||||
|
||||
> 用于访问函数内部的全局变量。是函数内部的局部变量在全局作用域中存在。
|
||||
|
||||
> 方法一:将函数内部的全局变量声明为global
|
||||
|
||||
> 方法二:使用global[ ]数组,其中存有所有的全局变量,下标就是全局变量的名字。
|
||||
|
||||
\>\>static 静态变量
|
||||
|
||||
> 作用:当函数执行完成后,会删除所有的变量。将变量声明为static时,会保留某个局部静态变量,在函数执行完成互殴
|
||||
> 不被删除。
|
||||
|
||||
\>Echo/Print 输出
|
||||
|
||||
\>\>两个输出都是以字符串的形式,然后输出到html界面中区,属于html的语言会被识别,属于PHP的变量也会被识别
|
||||
|
||||
echo - 只能输出\>= 1 的个数的字符串
|
||||
|
||||
print - 只能输出一个字符串,并返回1
|
||||
|
||||
\>php的数据类型
|
||||
|
||||
\>\>字符串:单引号和双引号效果相同“hello world!”
|
||||
|
||||
\>\>整数:至少包括一个数字,可以使用八进制(o)十六进制(ox)输入输出
|
||||
|
||||
\>\>浮点数:var_dump()会返回变量的数据类型(数据长度)和值
|
||||
|
||||
\>\>逻辑:布尔型变量,true或false
|
||||
|
||||
\>\>数组:\$car = array("Volvo", "BMW", "SAAB");
|
||||
|
||||
\>\>对象:使用class声明对象的类,类中包含属性和方法(与C++中的class同,与)
|
||||
|
||||
**[html]** [view plain](http://blog.csdn.net/estom_yin/article/details/51909873)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51909873)
|
||||
|
||||
1. **\<?php**
|
||||
|
||||
2. class Car
|
||||
|
||||
3. {
|
||||
|
||||
4. var \$color;
|
||||
|
||||
5. function Car(\$color="green") {
|
||||
|
||||
6. \$this-**\>**color = \$color;
|
||||
|
||||
7. }
|
||||
|
||||
8. function what\_color() {
|
||||
|
||||
9. return \$this-**\>**color;
|
||||
|
||||
10. }
|
||||
|
||||
11. }
|
||||
|
||||
12. **?\>**
|
||||
|
||||
**[html]** [view plain](http://blog.csdn.net/estom_yin/article/details/51909873)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51909873)
|
||||
|
||||
1. **\<pre** style="font-family: 'Courier New', monospace; font-size:
|
||||
13px;"**\>\<code** class="phpcode" style="font-family: 'Courier New',
|
||||
monospace; color: rgb(255, 0, 0);"**\>**\$x = new Car("white");**\</code\>**
|
||||
|
||||
//是新的对象,Car是类,white是构造函数的参数
|
||||
|
||||
\>\>NULL
|
||||
|
||||
是一种数据类型,也是一个数据的值
|
||||
35
PHP/语法(2)-字符串函数&常量.md
Normal file
35
PHP/语法(2)-字符串函数&常量.md
Normal file
@@ -0,0 +1,35 @@
|
||||
\>字符串函数
|
||||
|
||||
\>\>strlen("字符串")//返回字符串的长度
|
||||
|
||||
\>\>strpos("hello world", "world");//检索字符串内指定的子串,返回位置。
|
||||
|
||||
更多的PHP字符串函数请点击这里
|
||||
|
||||
\>PHP常量
|
||||
|
||||
\>\>使用define(“GREETING”, "Welcome to W3School.com.cn!",true/false)函数;
|
||||
|
||||
> 第一个参数是常量的名称,第二个参数敞亮的值,第三个参数是否对大小写敏感(false是敏感)
|
||||
|
||||
\>运算符
|
||||
|
||||
\>\>基本运算:+ - \* / %
|
||||
|
||||
\>\>赋值运算:= += -= \*= /= %=
|
||||
|
||||
\>\>字符串运算:. 串接 .=串接后复制
|
||||
|
||||
\>\>递增递减运算符:++\$x \$x++ --\$x \$x--
|
||||
|
||||
\>\>比较运算符:
|
||||
|
||||
> == 等于 数值相等返回true
|
||||
|
||||
> ===全等 数值相等且类型相同返回true
|
||||
|
||||
> !=或\<\>不等于数值不等
|
||||
|
||||
> !==不全等 数值不等他们类型不同
|
||||
|
||||
> \> \>= \< \<=
|
||||
41
PHP/语法(3)-控制结构.md
Normal file
41
PHP/语法(3)-控制结构.md
Normal file
@@ -0,0 +1,41 @@
|
||||
\>if-else
|
||||
|
||||
\>\>if 语句
|
||||
|
||||
> if (条件){条件为true执行代码}
|
||||
|
||||
\>\>if-else
|
||||
|
||||
> if (条件){条件为true执行代码}
|
||||
|
||||
> else{条件为false执行代码}
|
||||
|
||||
\>\>if-elseif-else
|
||||
|
||||
> if (条件){条件为true执行代码}
|
||||
|
||||
> elseif (条件){条件为true时执行代码}
|
||||
|
||||
> else{条件为false执行代码}
|
||||
|
||||
\>switch语句
|
||||
|
||||
\>\>switch(expression){
|
||||
|
||||
> case label1: execute code;break;
|
||||
|
||||
> case label2:execute code;break;
|
||||
|
||||
> default: execute code;break;
|
||||
|
||||
}
|
||||
|
||||
\>循环
|
||||
|
||||
\>\>while(condition){coding;} 指定条件为真,执行代码块;
|
||||
|
||||
\>\>do {coding} while{condition}执行到条件为假
|
||||
|
||||
\>\>for (init counter; test counter; increment counter){coding}同C++
|
||||
|
||||
\>\>foreach (\$array as \$value){遍历数组中的每一个键}同python
|
||||
239
PHP/语法(4)-函数&数组&超全局变量.md
Normal file
239
PHP/语法(4)-函数&数组&超全局变量.md
Normal file
@@ -0,0 +1,239 @@
|
||||
\>函数定义
|
||||
|
||||
> function 函数名(参数列表){
|
||||
|
||||
> 函数体;
|
||||
|
||||
> }
|
||||
|
||||
//函数名对大小写不敏感
|
||||
|
||||
//参数列表,函数体,返回值原理同C++同样
|
||||
|
||||
\>数组的实现
|
||||
|
||||
\>\>定义:\$cars = array("volvo", "BMW", "SAAB");
|
||||
|
||||
//这里用array()函数创建数组,但是JS是用new创建array类的对象,而python中对应的list本身就是一个类的对象。
|
||||
|
||||
\>\>数组分类
|
||||
|
||||
- 索引数组:带有数字索引的数组
|
||||
|
||||
\$cars=array("Volvo","BMW","SAAB");
|
||||
|
||||
- 关联数组:带有制定键的数组
|
||||
|
||||
\$age=array("Peter"=\>"35","Ben"=\>"37","Joe"=\>"43");
|
||||
|
||||
- 多维数组:包含一个或多个数组的数组
|
||||
|
||||
echo count(数组变量)返回数组长度
|
||||
|
||||
遍历关联数组
|
||||
|
||||
**[html]** [view plain](http://blog.csdn.net/estom_yin/article/details/51912161)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51912161)
|
||||
|
||||
1. **\<?php**
|
||||
|
||||
2. \$age=array("Bill"=**\>**"35","Steve"=**\>**"37","Peter"=**\>**"43");
|
||||
|
||||
3.
|
||||
|
||||
4. foreach(\$age as \$x=**\>**\$x_value) {
|
||||
|
||||
5. echo "Key=" . \$x . ", Value=" . \$x_value;
|
||||
|
||||
6. echo "**\<br\>**";
|
||||
|
||||
7. }
|
||||
|
||||
8. **?\>**
|
||||
|
||||
\>数组排序
|
||||
|
||||
- sort() - 以升序对数组排序
|
||||
|
||||
- rsort() - 以降序对数组排序
|
||||
|
||||
- asort() - 根据值,以升序对关联数组进行排序
|
||||
|
||||
- ksort() - 根据键,以升序对关联数组进行排序
|
||||
|
||||
- arsort() - 根据值,以降序对关联数组进行排序
|
||||
|
||||
- krsort() - 根据键,以降序对关联数组进行排序
|
||||
|
||||
\>超全局
|
||||
|
||||
- \$GLOBALS——在\$globals[index]中存储了所有的全局变量,变量名字就是数组的键。
|
||||
|
||||
- \$_SERVER——保存了关于爆头路径和脚本位置的信息
|
||||
|
||||
- \$_REQUEST——收集input表单提交的信息值
|
||||
|
||||
- \$_POST
|
||||
|
||||
- \$_GET
|
||||
|
||||
- \$_FILES
|
||||
|
||||
- \$_ENV
|
||||
|
||||
- \$_COOKIE
|
||||
|
||||
- \$_SESSION
|
||||
|
||||
\>\>\$_SERVER的配置信息:
|
||||
|
||||
| 元素/代码 | 描述 |
|
||||
|----------------------------------|--------------------------------------------------------------------|
|
||||
| \$_SERVER['PHP_SELF'] | 返回当前执行脚本的文件名。 |
|
||||
| \$_SERVER['GATEWAY_INTERFACE'] | 返回服务器使用的 CGI 规范的版本。 |
|
||||
| \$_SERVER['SERVER_ADDR'] | 返回当前运行脚本所在的服务器的 IP 地址。 |
|
||||
| \$_SERVER['SERVER_NAME'] | 返回当前运行脚本所在的服务器的主机名(比如 www.w3school.com.cn)。 |
|
||||
| \$_SERVER['SERVER_SOFTWARE'] | 返回服务器标识字符串(比如 Apache/2.2.24)。 |
|
||||
| \$_SERVER['SERVER_PROTOCOL'] | 返回请求页面时通信协议的名称和版本(例如,“HTTP/1.0”)。 |
|
||||
| \$_SERVER['REQUEST_METHOD'] | 返回访问页面使用的请求方法(例如 POST)。 |
|
||||
| \$_SERVER['REQUEST_TIME'] | 返回请求开始时的时间戳(例如 1577687494)。 |
|
||||
| \$_SERVER['QUERY_STRING'] | 返回查询字符串,如果是通过查询字符串访问此页面。 |
|
||||
| \$_SERVER['HTTP_ACCEPT'] | 返回来自当前请求的请求头。 |
|
||||
| \$_SERVER['HTTP_ACCEPT_CHARSET'] | 返回来自当前请求的 Accept_Charset 头( 例如 utf-8,ISO-8859-1) |
|
||||
| \$_SERVER['HTTP_HOST'] | 返回来自当前请求的 Host 头。 |
|
||||
| \$_SERVER['HTTP_REFERER'] | 返回当前页面的完整 URL(不可靠,因为不是所有用户代理都支持)。 |
|
||||
| \$_SERVER['HTTPS'] | 是否通过安全 HTTP 协议查询脚本。 |
|
||||
| \$_SERVER['REMOTE_ADDR'] | 返回浏览当前页面的用户的 IP 地址。 |
|
||||
| \$_SERVER['REMOTE_HOST'] | 返回浏览当前页面的用户的主机名。 |
|
||||
| \$_SERVER['REMOTE_PORT'] | 返回用户机器上连接到 Web 服务器所使用的端口号。 |
|
||||
| \$_SERVER['SCRIPT_FILENAME'] | 返回当前执行脚本的绝对路径。 |
|
||||
| \$_SERVER['SERVER_ADMIN'] | 该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。 |
|
||||
| \$_SERVER['SERVER_PORT'] | Web 服务器使用的端口。默认值为 “80”。 |
|
||||
| \$_SERVER['SERVER_SIGNATURE'] | 返回服务器版本和虚拟主机名。 |
|
||||
| \$_SERVER['PATH_TRANSLATED'] | 当前脚本所在文件系统(非文档根目录)的基本路径。 |
|
||||
| \$_SERVER['SCRIPT_NAME'] | 返回当前脚本的路径。 |
|
||||
| \$_SERVER['SCRIPT_URI'] | 返回当前页面的 URI。 |
|
||||
|
||||
转自[w3school.com](http://www.w3school.com.cn/php/php_superglobals.asp)
|
||||
|
||||
\>\>\$_REQUEST的访问
|
||||
|
||||
> 使用PHP表单完美的完成了接受数据并反馈信息。
|
||||
|
||||
> method 指定了传递方法,action指定了传递的文件
|
||||
|
||||
> 接受的信息的名字作为键值KEY,输入内容作为值,形成关联数组,然后可以通过\$_REQUEST['KEY']对输入的值进行访问。
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51912161)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51912161)
|
||||
|
||||
1. \<!DOCTYPE html\>
|
||||
|
||||
2. \<html\>
|
||||
|
||||
3. \<body\>
|
||||
|
||||
4.
|
||||
|
||||
5. \<form method="post" action="\<?php echo \$_SERVER['PHP_SELF'];?\>"\>
|
||||
|
||||
6. Name: \<input type="text" name="fname"\>
|
||||
|
||||
7. \<input type="submit"\>
|
||||
|
||||
8. \</form\>
|
||||
|
||||
9.
|
||||
|
||||
10. \<?php
|
||||
|
||||
11. \$name = \$_REQUEST['fname'];
|
||||
|
||||
12. echo \$name;
|
||||
|
||||
13. ?\>
|
||||
|
||||
14.
|
||||
|
||||
15. \</body\>
|
||||
|
||||
16. \</html\>
|
||||
|
||||
\>\>\$_POST
|
||||
|
||||
> 使用post收集通过post方法构建的表单
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51912161)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51912161)
|
||||
|
||||
1. \<html\>
|
||||
|
||||
2. \<body\>
|
||||
|
||||
3.
|
||||
|
||||
4. \<form method="post" action="\<?php echo \$_SERVER['PHP_SELF'];?\>"\>
|
||||
|
||||
5. Name: \<input type="text" name="fname"\>
|
||||
|
||||
6. \<input type="submit"\>
|
||||
|
||||
7. \</form\>
|
||||
|
||||
8.
|
||||
|
||||
9. \<?php
|
||||
|
||||
10. \$name = \$_POST['fname'];
|
||||
|
||||
11. echo \$name;
|
||||
|
||||
12. ?\>
|
||||
|
||||
13.
|
||||
|
||||
14. \</body\>
|
||||
|
||||
15. \</html\>
|
||||
|
||||
\>\>\$_GET
|
||||
|
||||
> 通过这个超全局变量可以收集URL中发送的数据
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51912161)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51912161)
|
||||
|
||||
1. \<html\>
|
||||
|
||||
2. \<body\>
|
||||
|
||||
3.
|
||||
|
||||
4. \<a href="test_get.php?subject=PHP&web=W3school.com.cn"\>测试 \$GET\</a\>
|
||||
|
||||
5.
|
||||
|
||||
6. \</body\>
|
||||
|
||||
7. \</html\>
|
||||
|
||||
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51912161)
|
||||
[copy](http://blog.csdn.net/estom_yin/article/details/51912161)
|
||||
|
||||
1. \<html\>
|
||||
|
||||
2. \<body\>
|
||||
|
||||
3.
|
||||
|
||||
4. \<?php
|
||||
|
||||
5. echo "Study " . \$_GET['subject'] . " at " . \$_GET['web'];
|
||||
|
||||
6. ?\>
|
||||
|
||||
7.
|
||||
|
||||
8. \</body\>
|
||||
|
||||
9. \</html\>
|
||||
Reference in New Issue
Block a user