控件属性大全

控件属性大全

控件属性:

android属性

Android功能强大,界面华丽,但是众多的布局属性就害苦了开发者,下面这篇文章结合了网上不少资料,

第一类:属性值为true或false
android:layout_centerHrizontal 水平居中 (Hrizontal表示水平)
android:layout_centerVertical 垂直居中 (Vertiacl表示垂直)
android:layout_centerInparent 相对于父元素完全居中
android:layout_alignParentBottom 贴紧父元素的下边缘 (align 表示使什么成为一行)
android:layout_alignParentLeft 贴紧父元素的左边缘
android:layout_alignParentRight 贴紧父元素的右边缘
android:layout_alignParentTop 贴紧父元素的上边缘
android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物
第二类:属性值必须为id的引用名”@id/id-name”
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 离某元素底边缘的距离 margin英文是边缘的意思
android:layout_marginLeft 离某元素左边缘的距离
android:layout_marginRight 离某元素右边缘的距离
android:layout_marginTop 离某元素上边缘的距离

EditText的属性

android:hint 设置EditText为空时输入框内的提示信息。 
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 子类,实现抛物线、自由落体等物理效果。

TextView属性汇总

android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接。可选值(none/web/email/phone/map/all)

android:autoText如果设置,将自动执行输入值的拼写纠正。此处无效果,在显示输入法并输入的时候起作用。

android:bufferType指定getText()方式取得的文本类别。选项editable 类似于StringBuilder可追加字符,也就是说getText后可调用append方法设置文本内容。spannable 则可在给定的字符区域使用样式,参见这里1、这里2。

android:capitalize设置英文字母大写类型。此处无效果,需要弹出输入法才能看得到,参见EditView此属性说明。

android:cursorVisible设定光标为显示/隐藏,默认显示。

android:digits设置允许输入哪些字符。如”1234567890.+-*/% ()”

android:drawableBottom在text的下方输出一个drawable,如图片。如果指定一个颜色的话会把text的背景设为该颜色,并且同时和background使用时覆盖后者。

android:drawableLeft在text的左边输出一个drawable,如图片。

android:drawablePadding设置text与drawable(图片)的间隔,与drawableLeft、 drawableRight、drawableTop、drawableBottom一起使用,可设置为负数,单独使用没有效果。

android:drawableRight在text的右边输出一个drawable。

android:drawableTop在text的正上方输出一个drawable。

android:editable设置是否可编辑。

android:editorExtras设置文本的额外的输入数据。

android:ellipsize设置当文字过长时,该控件该如何显示。有如下值设置:”start”—-省略号显示在开头;”end” ——省略号显示在结尾;”middle”—-省略号显示在中间;”marquee” ——以跑马灯的方式显示(动画横向移动)

android:freezesText设置保存文本的内容以及光标的位置。

android:gravity设置文本位置,如设置成”center”,文本将居中显示。

android:hintText为空时显示的文字提示信息,可通过textColorHint设置提示信息的颜色。此属性在 EditView中使用,但是这里也可以用。

android:imeOptions附加功能,设置右下角IME动作与编辑框相关的动作,如actionDone右下角将显示一个”完成”,而不设置默认是一个回车符号。这个在EditView中再详细说明,此处无用。

android:imeActionId设置IME动作ID。

android:imeActionLabel设置IME动作标签。

android:includeFontPadding设置文本是否包含顶部和底部额外空白,默认为true。

android:inputMethod为文本指定输入法,需要完全限定名(完整的包名)。例如:com.google.android.inputmethod.pinyin,但是这里报错找不到。

android:inputType设置文本的类型,用于帮助输入法显示合适的键盘类型。在EditView中再详细说明,这里无效果。

android:linksClickable设置链接是否点击连接,即使设置了autoLink。

android:marqueeRepeatLimit在ellipsize指定marquee的情况下,设置重复滚动的次数,当设置为 marquee_forever时表示无限次。

android:ems设置TextView的宽度为N个字符的宽度。这里测试为一个汉字字符宽度

android:maxEms设置TextView的宽度为最长为N个字符的宽度。与ems同时使用时覆盖ems选项。

android:minEms设置TextView的宽度为最短为N个字符的宽度。与ems同时使用时覆盖ems选项。

android:maxLength限制显示的文本长度,超出部分不显示。

android:lines设置文本的行数,设置两行就显示两行,即使第二行没有数据。

android:maxLines设置文本的最大显示行数,与width或者layout_width结合使用,超出部分自动换行,超出行数将不显示。

android:minLines设置文本的最小行数,与lines类似。

android:lineSpacingExtra设置行间距。

android:lineSpacingMultiplier设置行间距的倍数。如”1.2”

android:numeric如果被设置,该TextView有一个数字输入法。此处无用,设置后唯一效果是TextView有点击效果,此属性在EdtiView将详细说明。

android:password以小点”.”显示文本

android:phoneNumber设置为电话号码的输入方式。

android:privateImeOptions设置输入法选项,此处无用,在EditText将进一步讨论。

android:scrollHorizontally设置文本超出TextView的宽度的情况下,是否出现横拉条。

android:selectAllOnFocus如果文本是可选择的,让他获取焦点而不是将光标移动为文本的开始位置或者末尾位置。 TextView中设置后无效果。

android:shadowColor指定文本阴影的颜色,需要与shadowRadius一起使用。

android:shadowDx设置阴影横向坐标开始位置。

android:shadowDy设置阴影纵向坐标开始位置。

android:shadowRadius设置阴影的半径。设置为0.1就变成字体的颜色了,一般设置为3.0的效果比较好。

android:singleLine设置单行显示。如果和layoutwidth一起使用,当文本不能全部显示时,后面用”…”来表示。如android:text=”test singleLine “

android:singleLine=”true” android:layout_width=”20dp”将只显示”t…”。如果不设置singleLine或者设置为false,文本将自动换行

android:text设置显示文本.

android:textAppearance设置文字外观。如 “?android:attr/textAppearanceLargeInverse”这里引用的是系统自带的一个外观,?表示系统是否有这种外观,否则使用默认的外观。可textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse

android:textColor设置文本颜色

android:textColorHighlight被选中文字的底色,默认为蓝色

android:textColorHint设置提示信息文字的颜色,默认为灰色。与hint一起使用。

android:textColorLink文字链接的颜色.

android:textScaleX设置文字之间间隔,默认为1.0f。

android:textSize设置文字大小,推荐度量单位”sp”,如”15sp”

android:textStyle设置字形[bold(粗体) 0, italic(斜体) 1, bolditalic(又粗又斜) 2] 可以设置一个或多个,用”|”隔开

android:typeface设置文本字体,必须是以下常量值之一:normal 0, sans 1, serif 2, monospace(等宽字体) 3]

android:height设置文本区域的高度,支持度量单位:px(像素)/dp/sp/in/mm(毫米)

android:maxHeight设置文本区域的最大高度

android:minHeight设置文本区域的最小高度

android:width设置文本区域的宽度,支持度量单位:px(像素)/dp/sp/in/mm(毫米),与layout_width 的区别看这里。

android:maxWidth设置文本区域的最大宽度

android:minWidth设置文本区域的最小宽度

Android activity属性汇总

android:allowTaskReparenting

是否允许activity更换从属的任务,比如从短信息任务切换到浏览器任务。

android:alwaysRetainTaskState

是否保留状态不变, 比如切换回home, 再从新打开, activity处于最后的状态

android:clearTaskOnLanunch

比如 P 是 activity, Q 是被P 触发的 activity, 然后返回Home, 从新启动 P,是否显示 Q

android:configChanges

当配置list发生修改时,是否调用 onConfigurationChanged() 方法 比如 “locale|navigation|orientation”.

android:enabled

activity 是否可以被实例化,

android:excludeFromRecents

是否可被显示在最近打开的activity列表里

android:exported

是否允许activity被其它程序调用

android:finishOnTaskLaunch

是否关闭已打开的activity当用户重新启动这个任务的时候

android.icon

android:label

android:launchMode

activity启动方式, “standard” “singleTop” “singleTask” “singleInstance”

其中前两个为一组, 后两个为一组

android:multiprocess

允许多进程

android:name

activity的类名, 必须指定

androidnHistory

是否需要移除这个activity当用户切换到其他屏幕时。这个属性是 API level 3 中引入的

android:permission

android:process

一 个activity运行时所在的进程名,所有程序组件运行在应用程序默认的进程中,这个进程名跟应用程序的包名一致。中的元素process属性能够为所有组件设定一个新的默认值。但是任何组件都可以覆盖这个默认值,允许你将你的程序放在多进程中运行。 如果这个属性被分配的名字以:开头,当这个activity运行时, 一个新的专属于这个程序的进程将会被创建。如果这个进程名以小写字母开头,这个activity将会运行在全局的进程中,被它的许可所提供。

android:screenOrientation

activity显示的模式, “unspecified” 默认值 “landscape” 风景画模式,宽度比高度大一些 “portrait” 肖像模式, 高度比宽度大。 “user” 用户的设置 “behind” “sensor” “nosensor”

android:stateNotNeeded

是否 activity被销毁和成功重启并不保存状态

android:taskAffinity

activity的亲属关系, 默认情况同一个应用程序下的activity有相同的关系

android:theme

activity的样式主题, 如果没有设置,则activity的主题样式从属于应用程序,参见元素的theme属性

android:windowSoftInputMode

activity主窗口与软键盘的交互模式, 自从API level 3 被引入

活动的主窗口如何与包含屏幕上的软键盘窗口交互。这个属性的设置将会影响两件事情:

1> 软键盘的状态——是否它是隐藏或显示——当活动(Activity)成为用户关注的焦点。

2> 活动的主窗口调整——是否减少活动主窗口大小以便腾出空间放软键盘或是否当活动窗口的部分被软键盘覆盖时它的内容的当前焦点是可见的。

它的设置必须是下面列表中的一个值,或一个”state…”值加一个”adjust…”值的组合。在任一组设置多个值——多个”state…”values,例如&mdash有未定义的结果。各个值之间用|分开。例如:

在这设置的值(除”stateUnspecified”和”adjustUnspecified”以外)将覆盖在主题中设置的值

值 描述

“stateUnspecified” 软键盘的状态(是否它是隐藏或可见)没有被指定。系统将选择一个合适的状态或依赖于主题的设置。这个是为了软件盘行为默认的设置。

“stateUnchanged” 软键盘被保持无论它上次是什么状态,是否可见或隐藏,当主窗口出现在前面时。

“stateHidden” 当用户选择该Activity时,软键盘被隐藏——也就是,当用户确定导航到该Activity时,而不是返回到它由于离开另一个Activity。

“stateAlwaysHidden” 软键盘总是被隐藏的,当该Activity主窗口获取焦点时。

“stateVisible” 软键盘是可见的,当那个是正常合适的时(当用户导航到Activity主窗口时)。

“stateAlwaysVisible” 当用户选择这个Activity时,软键盘是可见的——也就是,也就是,当用户确定导航到该Activity时,而不是返回到它由于离开另一个Activity。

“adjustUnspecified” 它不被指定是否该Activity主窗口调整大小以便留出软键盘的空间,或是否窗口上的内容得到屏幕上当前的焦点是可见的。系统将自动选择这些模式中一种主要依赖于是否窗口的内容有任何布局视图能够滚动他们的内容。如果有这样的一个视图,这个窗口将调整大小,这样的假设可以使滚动窗口的内容在一个较小的区域中可见的。这个是主窗口默认的行为设置。

“adjustResize” 该Activity主窗口总是被调整屏幕的大小以便留出软键盘的空间。

“adjustPan” 该Activity主窗口并不调整屏幕的大小以便留出软键盘的空间。相反,当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。这个通常是不期望比调整大小,因为用户可能关闭软键盘以便获得与被覆盖内容的交互操作。

Android EditText 属性汇总

android:layout_gravity=”center_vertical”

设置控件显示的位置:默认top,这里居中显示,还有bottom

android:hint=”请输入数字!”

设置显示在空间上的提示信息

android:numeric=”integer”

设置只能输入整数,如果是小数则是:decimal

android:singleLine=”true”

设置单行输入,一旦设置为true,则文字不会自动换行。

android:password=”true”

设置只能输入密码

android:textColor = “#ff8c00”

字体颜色

android:textStyle=”bold”

字体,bold, italic, bolditalic

android:textSize=”20dip”

大小

android:capitalize = “characters”

以大写字母写

android:textAlign=”center”

EditText没有这个属性,但TextView有

android:textColorHighlight=”#cccccc”

被选中文字的底色,默认为蓝色

android:textColorHint=”#ffff00”

设置提示信息文字的颜色,默认为灰色

android:textScaleX=”1.5”

控制字与字之间的间距

android:typeface=”monospace”

字型,normal, sans, serif, monospace

android:background=”@null”

空间背景,这里没有,指透明

android:layout_weight=”1”

权重,控制控件之间的地位,在控制控件显示的大小时蛮有用的。

android:textAppearance=”?android:attr/textAppearanceLargeInverse”

文字外观,这里引用的是系统自带的一个外观,?表示系统是否有这种外观,否则使用默认的外观。不知道这样理解对不对?

通过EditText的layout xml文件中的相关属性来实现:

  1. 密码框属性 android:password=”true” 这条可以让EditText显示的内容自动为星号,输入时内容会在1秒内变成*字样。

  2. 纯数字 android:numeric=”true” 这条可以让输入法自动变为数字输入键盘,同时仅允许0-9的数字输入

  3. 仅允许 android:capitalize=”cwj1987” 这样仅允许接受输入cwj1987,一般用于密码验证

下面是一些扩展的风格属性

android:editable=”false” 设置EditText不可编辑

android:singleLine=”true” 强制输入的内容在单行

android:ellipsize=”end” 自动隐藏尾部溢出数据,一般用于文字内容过长一行无法全部显示时

RelativeLayout布局

android:layout_marginTop=”25dip” //顶部距离

android:gravity=”left” //空间布局位置

android:layout_marginLeft=”15dip //距离左边距

// 相对于给定ID控件

android:layout_above 将该控件的底部置于给定ID的控件之上;

android:layout_below 将该控件的底部置于给定ID的控件之下;

android:layout_toLeftOf 将该控件的右边缘与给定ID的控件左边缘对齐;

android:layout_toRightOf 将该控件的左边缘与给定ID的控件右边缘对齐;

android:layout_alignBaseline 将该控件的baseline与给定ID的baseline对齐;

android:layout_alignTop 将该控件的顶部边缘与给定ID的顶部边缘对齐;

android:layout_alignBottom 将该控件的底部边缘与给定ID的底部边缘对齐;

android:layout_alignLeft 将该控件的左边缘与给定ID的左边缘对齐;

android:layout_alignRight 将该控件的右边缘与给定ID的右边缘对齐;

// 相对于父组件

android:layout_alignParentTop 如果为true,将该控件的顶部与其父控件的顶部对齐;

android:layout_alignParentBottom 如果为true,将该控件的底部与其父控件的底部对齐;

android:layout_alignParentLeft 如果为true,将该控件的左部与其父控件的左部对齐;

android:layout_alignParentRight 如果为true,将该控件的右部与其父控件的右部对齐;

// 居中

android:layout_centerHorizontal 如果为true,将该控件的置于水平居中;

android:layout_centerVertical 如果为true,将该控件的置于垂直居中;

android:layout_centerInParent 如果为true,将该控件的置于父控件的中央;

// 指定移动像素

android:layout_marginTop 上偏移的值;

android:layout_marginBottom 下偏移的值;

android:layout_marginLeft 左偏移的值;

android:layout_marginRight   右偏移的值;

android:id —- 为控件指定相应的ID

android:text —- 指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串

android:grivity —- 指定控件的基本位置,比如说居中,居右等位置这里指的是控件中的文本位置并不是控件本身。

android:textSize —- 指定控件当中字体的大小

android:background —- 指定该控件所使用的背景色,RGB命名法

android:width —- 指定控件的宽度

android:height —- 指定控件的高度

android:padding* —- 指定控件的内边距,也就是说控件当中的内容

android:sigleLine —- 如果设置为真的话,则控件的内容在同一行中进行显示

下边是相对布局属性的说明:RelativeLayout

android:layout_above 将该控件的底部至于给定ID控件之上

android:layout_below 将该控件的顶部至于给定ID的控件之下

android:layout_toLeftOf 将该控件的右边缘和给定ID的控件左边缘对齐

android:layout_toRightOf 将该控件的左边缘和给定ID的控件的右边缘对齐

android:layout_alignBaseline 该控件的baseline和给定ID的控件的baseline对齐

android:layout_alignBottom 将该控件的底部边缘与给定ID控件的底部边缘对齐

android:layout_alignLeft 将该控件的左边缘与给定ID控件的左边缘对齐

android:layout_alignRight 将该控件的右边缘与给定ID控件的右边缘对齐

android:layout_alignTop 将该控件的顶部边缘与给定ID控件的顶部对齐

android:alignParentBottom 如果该值为true,则将该控件的底部和父控件的底部对齐

android:layout_alignParentLeft 如果该值为true,则将该控件左边与父控件的左边对齐

android:layout_alignParentRight 如果该值为true,则将该控件的右边与父控件的右边对齐

android:layout_alignParentTop 如果该值为true,则将该控件的顶部与父控件的顶部对齐

android:layout_centerHorizontal 如果为真,该控件将被至于水平方向的中央

android:layout_centerInParent 如果为真,该控件将被至于父控件水平方向和垂直方向的中央

android:layout_centerVertical 如果为真,该控件将被至于垂直方向的中央

android:layout_marginLeft此属性用来设置控件之间的间隙(控件和控件之间和内边距不同)

android:padding=”3dip”说明了四边的内边距是3dip

TableLayout

android:stretchColumns=”0”第一列作为拉伸列填满整行

Java中修饰符总结:

1、访问控制修饰符

public的访问级别是最高的,其次是protected、默认和private

成员变量和成员方法可以处于4个访问级别中的一个:公开、受保护、默认或私有

顶层类可以处于公开或默认级别,顶层类不能被protected和private修饰

局部变量不能被访问控制修饰符修饰

2、abstract修饰符

抽象类不能被实例化

抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象方法

如果子类没有实现父类中所有的抽象方法,子类也必须定义为抽象类

抽象类不能被定义为private、final、和static类型

没有抽象的构造方法

抽象方法没有方法体

3、final修饰符

用final修饰的类不能被继承

用final修饰的方法不能被子类的方法覆盖

private类型的方法都默认为是final方法,因而不能被子类的方法覆盖

final变量必须被显式初始化,并且只能被赋值一次值

4、static修饰符

静态变量在内存中只有一个拷贝,在类的所有实例中共享

在静态方法中不能直接访问实例方法和实例变量

在静态方法中不能使用this和super关键字

静态方法不能被abstract修饰

静态方法和静态变量都可以通过类名直接访问

当类被加载时,静态代码块只能被执行一次。类中不同的静态方法代码块按他们在类中出现的顺序被依次执行

当多个修饰符连用时,修饰符的顺序可以颠倒,不过作为普遍遵守的编程规范,通常把访问控制修饰符放在首位,其次是static或abstact修饰符,接着就是其他的修饰符

5、以下修饰符连用是无意义的,会导致编译错误:

abstract与private

abstract与final

abstract与static

控件布局心得

2015/8/26问题集

让控制置于底部

android 让一个控件按钮居于底部的几种方法

  • 1.采用linearlayout布局:
    android:layout_height=”0dp” !— 这里不能设置fill_parent —>
    android:layout_weight=”1” !— 这里设置layout_weight=1是最关键的,否则底部的LinearLayout无法到底部 —>

  • 2:采用relativelayout布局:
    android:layout_alignParentBottom=”true” !— 这里设置layout_alignParentBottom=true是最关键的,这个属性上级必须是RelativeLayout —>

  • 3: 采用 fragment 布局(activitygroup 已经被弃用不建议使用)

http://www.cnblogs.com/zdz8207/archive/2012/12/13/2816906.html

与底部之间的距离

这个要设置在布局文件中(learnlayout之类的)

android:layout_marginBottom="100dp"

将控件底部与父类底部对齐

android:layout_alignParentBottom="true"

将控件底部与父类右边对齐

android:layout_alignParentRight="true"

相对布局中居中对齐

android:layout_centerHorizontal="true"

pager使用,listview绑定adapter之感悟,Adapter的操作,item点击

2015/8/25问题集

pager页面加载顺序问题

ViewPager页面加载时要先把Pager加载进来,然后才能加载里面的控件

pager先加载进来的layout

用pager加载的页面,只预先加载了一个页面。
而其他页面的控件并没有加载进来,这就导致了null指针异常。

解决办法:在前面先加上一个view名称。

ll= (LinearLayout) myView.findViewById(R.id.ll);

listview绑定adapter

这回竟然是因为忘记吧List NEW出来了

package com.zsz.develop.wisdomcommunity.my;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.zsz.develop.wisdomcommunity.R;

import java.util.ArrayList;
import java.util.List;

public class MyHomeActivity extends AppCompatActivity {

private ListView lvMyHome;
private MyHomeAdapter adapter;
private List<MyHomeData> myHomeLists;
private MyHomeData myHomeData;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_home);
    lvMyHome= (ListView) findViewById(R.id.lvMyHome);
    lvMyHome=new ListView(this);
    myHomeLists=new ArrayList<>();
    for (int i=0;i<5;i++){
        myHomeData=new MyHomeData(i+" 父子","天大地大","审核中");

        myHomeLists.add(myHomeData);

    }

    adapter=new MyHomeAdapter(MyHomeActivity.this,myHomeLists);
    lvMyHome.setAdapter(adapter);

    setContentView(lvMyHome);
}


}

listview绑定adapter之感悟

首先在这里面的设置:

  • 1.首先需要准备的数据listview承载数据,Adapter适配数据,data是数据。还需要一个装data的list集合
  • 找到listview并实例化。(并不需要实例化)
  • 实例化list和data,并把data装进list中
  • 把list装进adapter中
  • 绑定adapter
  • setContentView(lvMyHome);(错误:这也重新覆盖掉了布局)

-
更改后的代码

package com.zsz.develop.wisdomcommunity.myOneLine;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Window;
import android.widget.ListView;

import com.zsz.develop.wisdomcommunity.R;

import java.util.ArrayList;
import java.util.List;

public class MyBillctivity extends AppCompatActivity {

private List<MyBillData> myBillDataList;
private MyBillAdapter adapter;
private ListView lvMyBill;
private MyBillData myBillData;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_bill);
    lvMyBill= (ListView) findViewById(R.id.lvMyBill);
//不要        lvMyBill=new ListView(this);
    myBillDataList=new ArrayList<>();
    for (int i=1;i<5;i++){
        myBillData=new MyBillData("2015-1-1至2015-1-31","未交","35"+i);
        myBillDataList.add(myBillData);
    }
    adapter=new MyBillAdapter(this,myBillDataList);
    lvMyBill.setAdapter(adapter);
//不要        setContentView(lvMyBill);

}


}

Adapter的操作

错误之:setTag()这里是传入整个类。而不是字符串

package com.zsz.develop.wisdomcommunity.myOneLine;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.zsz.develop.wisdomcommunity.R;

import java.util.List;

/**
 * Created by shengzhong on 2015/8/25.
 */
public class MyBillAdapter extends BaseAdapter {
private Context context;
private List<MyBillData> myBillDataList;

public MyBillAdapter(Context context,List<MyBillData> myBillDataList){
    this.context=context;
    this.myBillDataList=myBillDataList;
}

@Override
public int getCount() {
    return myBillDataList.size();
}

@Override
public Object getItem(int i) {
    return myBillDataList.get(i);
}

@Override
public long getItemId(int i) {
    return i;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {

    ViewHolder holder;
    if (view==null) {
        view= LayoutInflater.from(context).inflate(R.layout.my_bill_layout,null);
        holder=new ViewHolder();
        holder.tv_my_bill_layout_Time= (TextView) view.findViewById(R.id.tv_my_bill_layout_Time);
        holder.tv_my_bill_layout_CostState= (TextView) view.findViewById(R.id.tv_my_bill_layout_CostState);
        holder.tv_my_bill_layout_Cost= (TextView) view.findViewById(R.id.tv_my_bill_layout_Cost);
        holder.tv_my_bill_layout_Time.setText(myBillDataList.get(i).getTime());
        holder.tv_my_bill_layout_CostState.setText(myBillDataList.get(i).getCoatState());
        holder.tv_my_bill_layout_Cost.setText(myBillDataList.get(i).getCoat());
        view.setTag(holder);
    }else {
        holder= (ViewHolder) view.getTag();
        holder.tv_my_bill_layout_Time.setText(myBillDataList.get(i).getTime());
        holder.tv_my_bill_layout_CostState.setText(myBillDataList.get(i).getCoatState());
        holder.tv_my_bill_layout_Cost.setText(myBillDataList.get(i).getCoat());

    }

    return view;
}
private static class ViewHolder{
    TextView tv_my_bill_layout_Time;
    TextView tv_my_bill_layout_CostState;
    TextView tv_my_bill_layout_Cost;
}
}

如果要对listview的每个item添加一个点击事件操作

lvMyInterflowMain.setOnItemClickListener(new AdapterView.OnItemClickListener() {
      @Override
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
          Intent intent=new Intent(MyInterflowMainActivity.this,MyInterflowActivity.class);
          startActivity(intent);
      }

FrameLayout(框架布局),shape包裹框的设置,ScrollView让页面也可以滚动拖,使用include重用UI組件,在textView上面在添加一张图片

2015/8/24问题集

FrameLayout(框架布局)

框架布局是最简单的布局形式。所有添加到这个布局中的视图都以层叠的方式显示。第一个添加的控件被放在最底层,最后一个添加到框架布局中的视图显示在最顶层,上一层的控件会覆盖下一层的控件。这种显示方式有些类似于堆栈。

shape包裹框的设置

xml要添加在drawable

<?xml version=”1.0” encoding=”utf-8”?>









ScrollView让页面也可以滚动拖

 <ScrollView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

    //这里面填写要滚动的内容
 </ScrollView>

</LinearLayout>

使用include重用UI組件

把需要重用的Ui组件单独列在layout中

当再次需要使用的时候,在其他布局中使用include来调用。

include android:id="@+id/title" layout="@layout/title_include"></include>

在textView上面在添加一张图片

android:drawableTop=”@drawable/3to1”

android布局—Android fill_parent、wrap_content和match_parent的区别

三个属性都用来适应视图的水平或垂直大小,一个以视图的内容或尺寸为基础的布局比精确地指定视图范围更加方便。

  • 1)fill_parent

设置一个构件的布局为fill_parent将强制性地使构件扩展,以填充布局单元内尽可能多的空间。这跟Windows控件的dockstyle属性大体一致。设置一个顶部布局或控件为fill_parent将强制性让它布满整个屏幕。

  • 2) wrap_content

设置一个视图的尺寸为wrap_content将强制性地使视图扩展以显示全部内容。以TextView和ImageView控件为例,设置为wrap_content将完整显示其内部的文本和图像。布局元素将根据内容更改大小。设置一个视图的尺寸为wrap_content大体等同于设置Windows控件的Autosize属性为True。

  • 3)match_parent
    Android2.2中match_parent和fill_parent是一个意思 .两个参数意思一样,match_parent更贴切,于是从2.2开始两个词都可以用。那么如果考虑低版本的使用情况你就需要用fill_parent了a

Android颜色对比

http://www.cnblogs.com/bluestorm/p/3644669.html

android获取SHA1和MD5,LinearLayout中的控件对齐问题,Android之事件监听的使用(OnClickListener)

2015/8/21问题集

android获取SHA1和MD5

android studio安全码,在许多申请key的时候都要用到安全码。例如百度地图等

具体的操作方法:

  • 1.找到debug.keystore的位置,默认位置在C:\Users\shengzhong.android
  • 2.cmd打开命令提示符,cd到keystore的位置
  • 3.输入 keytool -list -v -keystore debug.keystore
  • 回车就显示了要的SHA1和MD5

java.lang.IllegalArgumentException: No config chosen

这种情况:

解决1.模拟器选项勾选gpu

解决2.用真机测试

LinearLayout中的控件对齐问题

LinearLayout中的控件对齐,如果他是水平布局,那么当他向左向右对齐的时候。他就不行,水平没有边界

解决办法:用相对布局啊!!RelativeLayout

android:layout_alignParentLeft 如果该值为true,则将该控件的左边与父控件的左边对齐
android:layout_alignParentRight 如果该值为true,则将该控件的右边与父控件的右边对齐

Android之事件监听的使用(OnClickListener)

  • 实现implements View.OnClickListener接口
  • 并实现OnClick方法。
  • 取得每个的id,并根据id去判断
public void onClick(View view) {
    int id=view.getId();
    switch (id){
        case R.id.tvCloud:
            pager.setCurrentItem(0);
            break;
        case R.id.tvDoor:
            pager.setCurrentItem(1);
            break;
        case R.id.tvMy:
            pager.setCurrentItem(2);
            break;
    }

ViewPager,ViewPager实现的功能,setOnPageChangeListener的三个方法,pager error

ViewPager

ViewPager的简介

ViewPager是android扩展包v4包中的类,这个类可以让用户左右切换当前的view。

所以这时候定义View要这么定义android.support.v4.view.ViewPager

我们首先来看看API对于这个类的表述:

Layout manager that allows the user to flip left and right through pages of data. You supply an implementation of a PagerAdapter to generate the pages that the view shows.
Note this class is currently under early design and development. The API will likely change in later updates of the compatibility library, requiring changes to the source code of apps when they are compiled against the newer version.
ViewPager is most often used in conjunction with Fragment, which is a convenient way to supply and manage the lifecycle of each page. There are standard adapters implemented for using fragments with the ViewPager, which cover the most common use cases. These are FragmentPagerAdapter andFragmentStatePagerAdapter; each of these classes have simple code showing how to build a full user interface with them.

在编写ViewPager的应用的使用,还需要使用两个组件类分别是PagerTitleStrip类和PagerTabStrip类,PagerTitleStrip类直接继承自ViewGroup类,而PagerTabStrip类继承PagerTitleStrip类,所以这两个类也是容器类。但是有一点需要注意,在定义XML的layout的时候,这两个类必须是ViewPager标签的子标签,不然会出错。

ViewPager实现的功能

ViewPager类提供了多界面切换的新效果,
新效果有如下特征:

  • <1>当前显示一组界面中的其中一个界面;
  • <2>当用户通过左右滑动界面时,当前的屏幕显示当前界面和下一个界面的一部分;
  • <3>滑动结束后,界面自动跳转到当前选择的界面中。

setOnPageChangeListener的三个方法

  • 1.onPageSelected(int position):这个方法有一个参数position,代表哪个页面被选中。当用手指滑动翻页的时候,如果翻动成功了(滑动的距离够长),手指抬起来就会立即执行这个方法,position就是当前滑动到的页面。如果直接setCurrentItem翻页,那position就和setCurrentItem的参数一致,这种情况在onPageScrolled执行方法前就会立即执行。

  • 2.onPageScrolled(int position,float positionOffset, int positionOffsetPixels):这个方法会在屏幕滚动过程中不断被调用。
    有三个参数,第一个position,这个参数要特别注意一下。当用手指滑动时,如果手指按在页面上不动,position和当前页面index是一致的;如果手指向左拖动(相应页面向右翻动),这时候position大部分时间和当前页面是一致的,只有翻页成功的情况下最后一次调用才会变为目标页面;如果手指向右拖动(相应页面向左翻动),这时候position大部分时间和目标页面是一致的,只有翻页不成功的情况下最后一次调用才会变为原页面。
    当直接设置setCurrentItem翻页时,如果是相邻的情况(比如现在是第二个页面,跳到第一或者第三个页面),如果页面向右翻动,大部分时间是和当前页面是一致的,只有最后才变成目标页面;如果向左翻动,position和目标页面是一致的。这和用手指拖动页面翻动是基本一致的。
    如果不是相邻的情况,比如我从第一个页面跳到第三个页面,position先是0,然后逐步变成1,然后逐步变成2;我从第三个页面跳到第一个页面,position先是1,然后逐步变成0,并没有出现为2的情况。
    positionOffset是当前页面滑动比例,如果页面向右翻动,这个值不断变大,最后在趋近1的情况后突变为0。如果页面向左翻动,这个值不断变小,最后变为0。
    positionOffsetPixels是当前页面滑动像素,变化情况和positionOffset一致。

  • 3.onPageScrollStateChanged(int state):这个方法在手指操作屏幕的时候发生变化。有三个值:0(END),1(PRESS) , 2(UP) 。
    当用手指滑动翻页时,手指按下去的时候会触发这个方法,state值为1,手指抬起时,如果发生了滑动(即使很小),这个值会变为2,然后最后变为0 。总共执行这个方法三次。一种特殊情况是手指按下去以后一点滑动也没有发生,这个时候只会调用这个方法两次,state值分别是1,0 。
    当setCurrentItem翻页时,会执行这个方法两次,state值分别为2 , 0 。

三个方法的执行顺序为:用手指拖动翻页时,最先执行一遍onPageScrollStateChanged(1),然后不断执行onPageScrolled,放手指的时候,直接立即执行一次onPageScrollStateChanged(2),然后立即执行一次onPageSelected,然后再不断执行onPageScrollStateChanged,最后执行一次onPageScrollStateChanged(0)。
其它的情况由这个可以推出来,不再赘述。

pager.setCurrentItem(0)的使用

pager.setCurrentItem(0)直接设置显示的页面。0代表第一个页面,1代表第二个。

简单小实例

layout.xml:

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

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <android.support.v4.view.PagerTabStrip
        android:id="@+id/tabstrip"
        android:layout_width="wrap_content"
        android:layout_height="50dip"
        android:gravity="center" />
</android.support.v4.view.ViewPager>

</RelativeLayout>

MainActivity.java

  • 1.先找到viewPager和pagerTabStrip。

  • 2.定义两个Array来当容器一个装载view一个装载title

  • 3.pagerTabStrip对设置

  • 4.把view和title装载进去
  • 5.设置Adapter

    package com.example.android_viewpager1;

    import java.util.ArrayList;

    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.os.Bundle;
    import android.support.v4.view.PagerAdapter;
    import android.support.v4.view.PagerTabStrip;
    import android.support.v4.view.ViewPager;
    import android.support.v4.view.ViewPager.OnPageChangeListener;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;

    public class MainActivity extends Activity {

    ViewPager pager = null;
    PagerTabStrip tabStrip = null;
    ArrayList viewContainter = new ArrayList();
    ArrayList titleContainer = new ArrayList();
    public String TAG = “tag”;

    @SuppressLint(“ResourceAsColor”)
    @Override
    protected void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
    
      pager = (ViewPager) this.findViewById(R.id.viewpager);
      tabStrip = (PagerTabStrip) this.findViewById(R.id.tabstrip);
      //取消tab下面的长横线
      tabStrip.setDrawFullUnderline(false);
      //设置tab的背景色
      tabStrip.setBackgroundColor(this.getResources().getColor(R.color.bg));
      //设置当前tab页签的下划线颜色
      tabStrip.setTabIndicatorColor(this.getResources().getColor(R.color.red));
      tabStrip.setTextSpacing(200);
    
      View view1 = LayoutInflater.from(this).inflate(R.layout.tab1, null);
      View view2 = LayoutInflater.from(this).inflate(R.layout.tab2, null);
      View view3 = LayoutInflater.from(this).inflate(R.layout.tab3, null);
      View view4 = LayoutInflater.from(this).inflate(R.layout.tab4, null);
    //viewpager开始添加view
      viewContainter.add(view1);
      viewContainter.add(view2);
      viewContainter.add(view3);
      viewContainter.add(view4);
    //页签项
      titleContainer.add("网易新闻");
      titleContainer.add("网易体育");
      titleContainer.add("网易财经");
      titleContainer.add("网易女人");
    
      pager.setAdapter(new PagerAdapter() {
    
          //viewpager中的组件数量
          @Override
          public int getCount() {
              return viewContainter.size();
          }
        //滑动切换的时候销毁当前的组件
          @Override
          public void destroyItem(ViewGroup container, int position,
                  Object object) {
              ((ViewPager) container).removeView(viewContainter.get(position));
          }
        //每次滑动的时候生成的组件
          @Override
          public Object instantiateItem(ViewGroup container, int position) {
              ((ViewPager) container).addView(viewContainter.get(position));
              return viewContainter.get(position);
          }
    
          @Override
          public boolean isViewFromObject(View arg0, Object arg1) {
              return arg0 == arg1;
          }
    
          @Override
          public int getItemPosition(Object object) {
              return super.getItemPosition(object);
          }
    
          @Override
          public CharSequence getPageTitle(int position) {
              return titleContainer.get(position);
          }
      });
    
      pager.setOnPageChangeListener(new OnPageChangeListener() {
          @Override
          public void onPageScrollStateChanged(int arg0) {
              Log.d(TAG, "--------changed:" + arg0);
          }
    
          @Override
          public void onPageScrolled(int arg0, float arg1, int arg2) {
              Log.d(TAG, "-------scrolled arg0:" + arg0);
              Log.d(TAG, "-------scrolled arg1:" + arg1);
              Log.d(TAG, "-------scrolled arg2:" + arg2);
          }
    
          @Override
          public void onPageSelected(int arg0) {
              Log.d(TAG, "------selected:" + arg0);
          }
      });
    

    }

    }

程式中要使用ViewPager來顯示資訊必須自己繼承PagerAdapter,來完成手指滑動切換視窗的動作。

ViewPage :Required method instantiateItem was not overridde

错误代码提示

java.lang.UnsupportedOperationException: Required method instantiateItem was not overridden

解决办法
把return super.instantiateItem(container, position);

换成:

return container;

pager错误之二

java.lang.UnsupportedOperationException: Required method destroyItem was not overridden

这里说必须的方法没有实现,因为先super了。所以就没有实现了。把super删除就可以实现

//每次滑动删除的页面
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {

//就是删除这行        super.destroyItem(container, position, object);
        ((ViewPager) container).removeView(viewContainter.get(position));
    }

pager错误之三

页面没有显示出来,

解决过程

  • 1.查看页面本身是否有问题
  • 2.ArrayList有没有添加页面
  • 3.在instantiateItem中有没有添加页面并返回页面。

我的原因是没有返回页面所以导致错误

//每次滑动增加的页面

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            container.addView(viewContainter.get(position));

            return viewContainter.get(position);
        }

pager错误之四

pager.setCurrentItem(1);

设置初始值没有反应。
设置的时候要放在Adapter里面


设置只可以通过点选,而不是滑动来切换页面

  • 1.首先去掉layout中PagerTabStrip,采用TextView来当tab
  • 2.点击TextView的时候再通过pager.setCurrentItem(0)来设置切换的页面

动态加载Fragment,Fragment常用的API

动态加载Fragment

在动态加载Fragment里面,就不需要把Fragment写死,写成View.而是采用动态加载的方式来实现操作。

我们先看布局文件:他是由一个FragmentLayout容器来存放Fragmeng(动态加载就是加载到这个地方)。还有两个选择按钮组成

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

<TextView android:text="@string/hello_world" android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<FrameLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/fl"
    ></FrameLayout>

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="tv01"
        android:id="@+id/tv01"
        />
    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="tv02"
        android:id="@+id/tv02"
        />

    </LinearLayout>

</LinearLayout>

在mainActivity里面就实现他的动态添加与管理

package com.zsz.develop.firstfragment;

import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.TextView;


public class MainActivity extends ActionBarActivity implements View.OnClickListener {


private FragmentTest fragmentTest;
private FragmentTest02 fragmentTest02;
private TextView tv01,tv02;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    initView();
}

private void initView() {
    tv01= (TextView) findViewById(R.id.tv01);
    tv02= (TextView) findViewById(R.id.tv02);
    tv01.setOnClickListener(this);
    tv02.setOnClickListener(this);

    // 设置默认的Fragment
    setDefaultFragment();

}

private void setDefaultFragment() {
    //使用FragmentManager来管理
    FragmentManager manager=getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();

    fragmentTest=new FragmentTest();
    //使用transaction.replace去FragmentLayout里添加Fragment。
    transaction.replace(R.id.fl,fragmentTest);
    transaction.commit();
}


@Override
public void onClick(View view) {

    FragmentManager fm = getFragmentManager();
    // 开启Fragment事务
    FragmentTransaction transaction = fm.beginTransaction();
    switch (view.getId()) {
        case R.id.tv01:
            if ( fragmentTest== null) {
                fragmentTest = new FragmentTest();
            }
            // 使用当前Fragment的布局替代id_content的控件
            transaction.replace(R.id.fl, fragmentTest);
            break;
        case R.id.tv02:
            if (fragmentTest02 == null) {
                fragmentTest02 = new FragmentTest02();
            }
            transaction.replace(R.id.fl, fragmentTest02);
            break;
    }
    // transaction.addToBackStack();
    // 事务提交
    transaction.commit();
}
}

Fragment常用的API:

Fragment常用的三个类:

  • android.app.Fragment 主要用于定义Fragment

  • android.app.FragmentManager 主要用于在Activity中操作Fragment

  • android.app.FragmentTransaction 保证一些列Fragment操作的原子性,熟悉事务这个词,一定能明白~

a、获取FragmentManage的方式:

getFragmentManager() // v4中,getSupportFragmentManager

b、主要的操作都是FragmentTransaction的方法

FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务

transaction.add()

往Activity中添加一个Fragment

transaction.remove()

从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。

transaction.replace()

使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~

transaction.hide()

隐藏当前的Fragment,仅仅是设为不可见,并不会销毁

transaction.show()

显示之前隐藏的Fragment

detach()

将此Fragment从Activity中分离,会销毁其布局,但不会销毁该实例

attach()

将从Activity中分离的Fragment,重新关联到该Activity,重新创建其视图层次

transatcion.commit()//提交一个事务

注意:常用Fragment的哥们,可能会经常遇到这样Activity状态不一致:State loss这样的错误。主要是因为:commit方法一定要在Activity.onSaveInstance()之前调用。

上述,基本是操作Fragment的所有的方式了,在一个事务开启到提交可以进行多个的添加、移除、替换等操作。

值得注意的是:如果你喜欢使用Fragment,一定要清楚这些方法,哪个会销毁视图,哪个会销毁实例,哪个仅仅只是隐藏,这样才能更好的使用它们。

  • a、比如:我在FragmentA中的EditText填了一些数据,当切换到FragmentB时,如果希望会到A还能看到数据,则适合你的就是hide和show;也就是说,希望保留用户操作的面板,你可以使用hide和show,当然了不要使劲在那new实例,进行下非null判断。

  • b、再比如:我不希望保留用户操作,你可以使用remove(),然后add();或者使用replace()这个和remove,add是相同的效果。

  • c、remove和detach有一点细微的区别,在不考虑回退栈的情况下,remove会销毁整个Fragment实例,而detach则只是销毁其视图结构,实例并不会被销毁。那么二者怎么取舍使用呢?如果你的当前Activity一直存在,那么在不希望保留用户操作的时候,你可以优先使用detach。

上述已经介绍完成了Fragment常用的一些方法,相信看完,大家一定清楚了Fragment的产生理由,以及如何使用Fragment,再根据API的讲解,也能明白,曾经为何觉得Fragment会出现一些列乱七八槽的问题,终究是因为没有弄清楚其生命周期。

Fragment的产生与介绍,Fragment的生命周期,Fragment相当于一个控件,静态Fragment的简单实例

2015/8/20问题集

Fragment的产生与介绍

Fragment支持在不同的Activity中使用并且可以处理自己的输入事件以及生命周期方法等。可以看做是一个子Activity。

Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视。针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后拷贝一份,修改布局以适应平板神马超级大屏的。难道无法做到一个App可以同时适应手机和平板么,当然了,必须有啊。Fragment的出现就是为了解决这样的问题。你可以把Fragment当成Activity的一个界面的一个组成部分,甚至Activity的界面可以完全有不同的Fragment组成,更帅气的是Fragment拥有自己的生命周期和接收、处理用户的事件,这样就不必在Activity写一堆控件的事件处理的代码了。更为重要的是,你可以动态的添加、替换和移除某个Fragment。

Fragment的生命周期

Fragment必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。官网这张图很好的说明了两者生命周期的关系:

可以看到Fragment比Activity多了几个额外的生命周期回调方法:
onAttach(Activity)
当Fragment与Activity发生关联时调用。
onCreateView(LayoutInflater, ViewGroup,Bundle)
创建该Fragment的视图
onActivityCreated(Bundle)
当Activity的onCreate方法返回时调用
onDestoryView()
与onCreateView想对应,当该Fragment的视图被移除时调用
onDetach()
与onAttach相对应,当Fragment与Activity关联被取消时调用
注意:除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现,

Fragment相当于一个控件

Fragment可以被多个Activity重用,但是您也必须把Fragment关联到一个FragmentActivity上

静态Fragment的简单实例

先自己定义一个Fragment的view的layout。

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

<ImageButton
    android:id="@+id/id_title_left_btn"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:layout_centerVertical="true"
    android:background="@drawable/my_icon" />

<TextView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:text="我是Fragment"
     />

</LinearLayout>

再定义Fragment,这个Fragment就相当于一个小Activity,Activity可以包含多个Fragment

package com.zsz.develop.firstfragment;

import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.Toast;

/**
 * Created by shengzhong on 2015/8/20.
 */
public class FragmentTest extends Fragment {

private ImageButton mButton;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.title_fragment, container, false);
    mButton = (ImageButton)view.findViewById(R.id.id_title_left_btn);
    mButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Toast.makeText(getActivity(),
                    "i am an ImageButton in TitleFragment ! ",
                    Toast.LENGTH_SHORT).show();
        }
    });
    return view;
}
}

在Mainlayout里面添加Fragment,这就相当于一个view的使用

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

<TextView android:text="@string/hello_world" android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<fragment
    android:layout_width="wrap_content"
    android:layout_height="45dp"
    android:id="@+id/fragmentTitle"
    android:name="com.zsz.develop.firstfragment.FragmentTest"
    ></fragment>

</RelativeLayout>

在Main里调用

package com.zsz.develop.firstfragment;

import android.app.Fragment;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;


public class MainActivity extends ActionBarActivity {

private View fragmentTitle;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    fragmentTitle=findViewById(R.id.fragmentTitle);
}


}

volley的简单使用

2015/8/19问题集

volley的简单使用

MyApplication中的代码:主要是建立一个queue对列。并给出一个调用方法

package com.zsz.develop.volleydemo;

import android.app.Application;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;

/**
 * Created by shengzhong on 2015/8/19.
 */
public class MyApplication extends Application {

public static RequestQueue queue;

@Override
public void onCreate() {
    super.onCreate();
    queue= Volley.newRequestQueue(getApplicationContext());
}

public static RequestQueue getHttpQueue(){
    return queue;
}

}

=

MainActivity中的代码。调用和实现volley的post和get方法

package com.zsz.develop.volleydemo;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;


public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
//        volley_Get();
    volley_Post();
}

private void volley_Post() {
    String url="http://apis.juhe.cn/mobile/get?";
    StringRequest request=new StringRequest(Request.Method.POST,url,new Response.Listener<String>() {
        @Override
        public void onResponse(String s) {
            Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show();
        }
    },new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
            Toast.makeText(MainActivity.this,"网络请求失败",Toast.LENGTH_LONG).show();
        }
    }){
        //与get最大的不同就是在这后面要添加getParams的方法来传递参数
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            HashMap<String,String> map=new HashMap<>();
            map.put("phone","13616008640");
            map.put("key","a8d4ff7a12cabef64ac6fe7871baf073");
            //返回map就好了
            return map;
        }
    };
    request.setTag("abcPost");
    MyApplication.getHttpQueue().add(request);
}

private void volley_Get() {
    String url="http://apis.juhe.cn/mobile/get?phone=13616008640&key=a8d4ff7a12cabef64ac6fe7871baf073";
    StringRequest request=new StringRequest(Request.Method.GET,url,new Response.Listener<String>() {
        @Override
        public void onResponse(String s) {

            Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show();
        }
    },new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
            Toast.makeText(MainActivity.this,"网络请求失败",Toast.LENGTH_LONG).show();
        }
    });
    //添加标签,当取消这个请求的时候可以取消这个标签
    request.setTag("abcGET");
    //将我们的请求添加到我们的对列里面
    MyApplication.getHttpQueue().add(request);

}


}