学习Android从0开始之基础篇(4)-TextView与EditText
最后更新于:2022-04-01 11:26:27
##TextView与EditText详解
TextView 顾名思义:就是在界面上呈现文本信息,主要用于显示,没有特殊的事件响应。然而EditText与TexView非常相似,EditText就是多了一个可以让用户输入内容的编辑框功能。 大家可以把EditText看作是编辑内容的那个框,TextView是用于显示文本内容的框。 其实就是这么简单。然而EditText是TextView的子类。接下来就是TextView和EditText的全部XML属性如下。不过在此之前,要先解释一个属性margin和padding
margin和padding如下图所示:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c854c94.jpg)
margin是子容器相距父容器边框的距离,而padding是子容器中的内容距离子容器边框的距离。那么margin_left和margin_right、padding_left和padding_right之类的属性就很好理解了。比如margin_left就是子容器距离父容器左边这一边的偏移距离,其他什么right、top、bottom都是这个意思。
1. TextView和EditText的xml属性。
好了理解了这两个属性之后,我们来看看官网对TextView的属性介绍: 经常用的用红色显示
<table class="jd-sumtable " id="lattrs"><tbody><tr><th colspan="12">XML Attributes</th></tr><tr><td><nobr><em>Attribute Name(xml)</em></nobr></td><td><nobr><em>Related Method(方法)</em></nobr></td><td><nobr><em>Description(说明)</em></nobr></td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:autoLink">android:autoLink</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setAutoLinkMask%28int%29">setAutoLinkMask(int)</a></td><td width="100%" class="jd-descrcol"><div><span style="color:#ff0000">是否将符合指定格式的文本转化为可点击的超链接形式,比如(网址,电话等)</span></div><div><br/></div></td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:autoText">android:autoText</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setKeyListener%28android.text.method.KeyListener%29">setKeyListener(KeyListener)</a></td><td width="100%" class="jd-descrcol">是否将URL、E-mail地址等链接自动转换为可单击的链接</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:breakStrategy">android:breakStrategy</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setBreakStrategy%28int%29">setBreakStrategy(int)</a></td><td width="100%" class="jd-descrcol">Break strategy (control over paragraph layout). </td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:bufferType">android:bufferType</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setText%28java.lang.CharSequence,%20android.widget.TextView.BufferType%29">setText(CharSequence,TextView.BufferType)</a></td><td width="100%" class="jd-descrcol">Determines the minimum type that getText() will return. </td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:capitalize">android:capitalize</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setKeyListener%28android.text.method.KeyListener%29">setKeyListener(KeyListener)</a></td><td width="100%" class="jd-descrcol"><div><span style="color:#ff0000">控制是否将用户输入的文本转化为大写字母,支持一下属性值:</span></div><div><span style="color:#ff0000"><br/></span></div><div><span style="color:#ff0000"> none:不转换</span></div><div><span style="color:#ff0000"> sentences:每个句子的首字母大写</span></div><div><span style="color:#ff0000"> words:每个单词的首字母大写</span></div><div><span style="color:#ff0000"> characters:每个字母都大写</span></div><div><br/></div></td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:cursorVisible">android:cursorVisible</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setCursorVisible%28boolean%29">setCursorVisible(boolean)</a></td><td width="100%" class="jd-descrcol">设置该文本框的光标是否可见</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:digits">android:digits</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setKeyListener%28android.text.method.KeyListener%29">setKeyListener(KeyListener)</a></td><td width="100%" class="jd-descrcol">如果设置为true,则该文本框对应一个数字输入方法,并且只接受那些合法字符</td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:drawableBottom">android:drawableBottom</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setCompoundDrawablesWithIntrinsicBounds%28int,%20int,%20int,%20int%29">setCompoundDrawablesWithIntrinsicBounds(int,int,int,int)</a></td><td width="100%" class="jd-descrcol">在文本框底部绘制指定图像</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:drawableEnd">android:drawableEnd</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setCompoundDrawablesRelativeWithIntrinsicBounds%28int,%20int,%20int,%20int%29">setCompoundDrawablesRelativeWithIntrinsicBounds(int,int,int,int)</a></td><td width="100%" class="jd-descrcol">在文本框的结尾处绘制指定图像</td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:drawableLeft">android:drawableLeft</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setCompoundDrawablesWithIntrinsicBounds%28int,%20int,%20int,%20int%29">setCompoundDrawablesWithIntrinsicBounds(int,int,int,int)</a></td><td width="100%" class="jd-descrcol">在文本框的左边绘制指定的图像</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:drawablePadding">android:drawablePadding</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setCompoundDrawablePadding%28int%29">setCompoundDrawablePadding(int)</a></td><td width="100%" class="jd-descrcol">设置文本框内文本与图像之间的间距</td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:drawableRight">android:drawableRight</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setCompoundDrawablesWithIntrinsicBounds%28int,%20int,%20int,%20int%29">setCompoundDrawablesWithIntrinsicBounds(int,int,int,int)</a></td><td width="100%" class="jd-descrcol">在文本框的右边绘制指定的图像</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:drawableStart">android:drawableStart</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setCompoundDrawablesRelativeWithIntrinsicBounds%28int,%20int,%20int,%20int%29">setCompoundDrawablesRelativeWithIntrinsicBounds(int,int,int,int)</a></td><td width="100%" class="jd-descrcol">在文本框的开始处绘制绘制指定的图像</td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:drawableTint">android:drawableTint</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setCompoundDrawableTintList%28android.content.res.ColorStateList%29">setCompoundDrawableTintList(ColorStateList)</a></td><td width="100%" class="jd-descrcol">为文本的图像指定颜色</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:drawableTintMode">android:drawableTintMode</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setCompoundDrawableTintMode%28android.graphics.PorterDuff.Mode%29">setCompoundDrawableTintMode(PorterDuff.Mode)</a></td><td width="100%" class="jd-descrcol">混合模式用于调节文本图像的颜色,如(颜色渐变之类的)</td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:drawableTop">android:drawableTop</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setCompoundDrawablesWithIntrinsicBounds%28int,%20int,%20int,%20int%29">setCompoundDrawablesWithIntrinsicBounds(int,int,int,int)</a></td><td width="100%" class="jd-descrcol">在文本框的顶部绘制指定的图像</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:editable">android:editable</a></td><td class="jd-linkcol"> </td><td width="100%" class="jd-descrcol">设置文本框是否允许编辑</td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:editorExtras">android:editorExtras</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setInputExtras%28int%29">setInputExtras(int)</a></td><td width="100%" class="jd-descrcol"><code>参考一个包含额外的<a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/R.styleable.html#InputExtras"><input-extras></a></code> XML资源用给输入法,这是私人对输入方法的执行。</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:elegantTextHeight">android:elegantTextHeight</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setElegantTextHeight%28boolean%29">setElegantTextHeight(boolean)</a></td><td width="100%" class="jd-descrcol">优雅的文字高度,特别是对于不那么复杂的文字文字。</td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:ellipsize">android:ellipsize</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setEllipsize%28android.text.TextUtils.TruncateAt%29">setEllipsize(TextUtils.TruncateAt)</a></td><td width="100%" class="jd-descrcol"><div><span style="color:#ff0000">设置显示文本超过了TextView的长度时如何处理文本内容,有以下属性值:</span></div><div><span style="color:rgb(255,0,0)"> </span></div><div><span style="color:rgb(255,0,0)"> none:不做任何处理</span></div><div><span style="color:rgb(255,0,0)"> start:在文本开始处截断,并显示省略号</span></div><div><span style="color:rgb(255,0,0)"> middle:在文本中间处截断,并显示省略号</span></div><div><span style="color:rgb(255,0,0)"> end:在文本结尾处截断,并显示省略号</span></div><div><span style="color:rgb(255,0,0)"> marquee:使用marquee滚动动画显示文本( 跑马灯效果 )</span></div><div><br/></div></td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:ems">android:ems</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setEms%28int%29">setEms(int)</a></td><td width="100%" class="jd-descrcol">设置该组件的宽度,以em为单位</td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:fontFamily">android:fontFamily</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setTypeface%28android.graphics.Typeface%29">setTypeface(Typeface)</a></td><td width="100%" class="jd-descrcol">设置文本框内文本的字体</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:fontFeatureSettings">android:fontFeatureSettings</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setFontFeatureSettings%28java.lang.String%29">setFontFeatureSettings(String)</a></td><td width="100%" class="jd-descrcol"><div class="trans-prompt"><p class="prompt-wrap"/></div><div class="original-mean-output"/><div class="trans-right clearfix"><div class="trans-output-wrap"><div class="output-container"><div class="output-wrap"><div class="output-mod ordinary-wrap"><div class="output-bd" dir="ltr" style="padding-bottom:0px"><p class="ordinary-output source-output" dir="ltr">Font feature settings.</p><p class="ordinary-output target-output">设置文本字体特征</p></div></div></div></div></div></div></td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:freezesText">android:freezesText</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setFreezesText%28boolean%29">setFreezesText(boolean)</a></td><td width="100%" class="jd-descrcol">如果设置,文本视图将包括目前的完整文本在冰冻的冰除了元数据,如当前光标位置。</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:gravity">android:gravity</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setGravity%28int%29">setGravity(int)</a></td><td width="100%" class="jd-descrcol"><span style="color:#ff0000">设置文本框内文本的对齐方式,一般center用的多</span></td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:height">android:height</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setHeight%28int%29">setHeight(int)</a></td><td width="100%" class="jd-descrcol">设置文本框的高度,以px为单位</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:hint">android:hint</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setHint%28int%29">setHint(int)</a></td><td width="100%" class="jd-descrcol"><span style="color:#ff0000">设置当文本框内的内容为空时,文本框内默认显示的提示文本</span></td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:hyphenationFrequency">android:hyphenationFrequency</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setHyphenationFrequency%28int%29">setHyphenationFrequency(int)</a></td><td width="100%" class="jd-descrcol">自动断字频率。</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:imeActionId">android:imeActionId</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setImeActionLabel%28java.lang.CharSequence,%20int%29">setImeActionLabel(CharSequence,int)</a></td><td width="100%" class="jd-descrcol"><code>当文本框指定特定的输入法时,为输入法指定额外的<a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/view/inputmethod/EditorInfo.html#actionId">EditorInfo.actionId</a></code> 值</td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:imeActionLabel">android:imeActionLabel</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setImeActionLabel%28java.lang.CharSequence,%20int%29">setImeActionLabel(CharSequence,int)</a></td><td width="100%" class="jd-descrcol"><code><span style="font-family:Courier New">当文本框指定特定的输入法时,为输入法指定额外的</span><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/view/inputmethod/EditorInfo.html#actionId"/><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/view/inputmethod/EditorInfo.html#actionLabel">EditorInfo.actionLabel值</a></code> </td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:imeOptions">android:imeOptions</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setImeOptions%28int%29">setImeOptions(int)</a></td><td width="100%" class="jd-descrcol"><span style="font-family:Courier New">当文本框指定特定的输入法时,为输入法指定额外的选项</span></td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:includeFontPadding">android:includeFontPadding</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setIncludeFontPadding%28boolean%29">setIncludeFontPadding(boolean)</a></td><td width="100%" class="jd-descrcol">设置是否为字体保留足够多的空间,默认值为 true</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:inputMethod">android:inputMethod</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setKeyListener%28android.text.method.KeyListener%29">setKeyListener(KeyListener)</a></td><td width="100%" class="jd-descrcol">为文本框指定特定的输入法,该属性值为输入法的权限定类名</td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:inputType">android:inputType</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setRawInputType%28int%29">setRawInputType(int)</a></td><td width="100%" class="jd-descrcol"><span style="color:#ff0000">设置文本字中的数据类型(比如手机号 密码之类的)</span></td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:letterSpacing">android:letterSpacing</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setLetterSpacing%28float%29">setLetterSpacing(float)</a></td><td width="100%" class="jd-descrcol"><a target="_blank" class="operate-btn op-sound data-hover-tip" href="http://fanyi.baidu.com/translate?aldtype=16047&query=Tint+to+apply+to+the+compound+%28left%2C+top%2C+etc.%29+drawables.+&keyfrom=baidu&smartresult=dict&lang=auto2zh###" style="display:block"/><div class="trans-prompt"><p class="prompt-wrap"/></div><div class="original-mean-output"/><div class="trans-right clearfix"><div class="trans-output-wrap"><div class="output-container"><div class="output-wrap"><div class="output-mod ordinary-wrap"><div class="output-bd" dir="ltr" style="padding-bottom:0px"><p class="ordinary-output source-output" dir="ltr">Text letter-spacing.</p><p class="ordinary-output target-output"><span>文字字母间距</span></p></div></div></div></div></div></div></td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:lineSpacingExtra">android:lineSpacingExtra</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setLineSpacing%28float,%20float%29">setLineSpacing(float,float)</a></td><td width="100%" class="jd-descrcol">控制两行文本之间的额外间距,与android:lineSpacingMultiplier属性结合使用</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:lineSpacingMultiplier">android:lineSpacingMultiplier</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setLineSpacing%28float,%20float%29">setLineSpacing(float,float)</a></td><td width="100%" class="jd-descrcol">控制两行文本之间的额外间距,每行的高度*该属性值+android:lineSpacingExtra属性值</td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:lines">android:lines</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setLines%28int%29">setLines(int)</a></td><td width="100%" class="jd-descrcol">设置该文本框默认占用几行</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:linksClickable">android:linksClickable</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setLinksClickable%28boolean%29">setLinksClickable(boolean)</a></td><td width="100%" class="jd-descrcol"><span style="color:#ff0000">控制该文本框的URL、E-mail等链接是否可用</span></td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:marqueeRepeatLimit">android:marqueeRepeatLimit</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setMarqueeRepeatLimit%28int%29">setMarqueeRepeatLimit(int)</a></td><td width="100%" class="jd-descrcol">设置marquee动画重复的次数</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:maxEms">android:maxEms</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setMaxEms%28int%29">setMaxEms(int)</a></td><td width="100%" class="jd-descrcol">指定文本框的最大宽度</td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:maxHeight">android:maxHeight</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setMaxHeight%28int%29">setMaxHeight(int)</a></td><td width="100%" class="jd-descrcol">指定文本框的醉倒高度</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:maxLength">android:maxLength</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setFilters%28android.text.InputFilter[]%29">setFilters(InputFilter)</a></td><td width="100%" class="jd-descrcol">设置文本框的最大字符长度</td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:maxLines">android:maxLines</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setMaxLines%28int%29">setMaxLines(int)</a></td><td width="100%" class="jd-descrcol">设置文本框最多占用几行</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:maxWidth">android:maxWidth</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setMaxWidth%28int%29">setMaxWidth(int)</a></td><td width="100%" class="jd-descrcol">设置文本框的最大宽度(以px单位)</td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:minEms">android:minEms</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setMinEms%28int%29">setMinEms(int)</a></td><td width="100%" class="jd-descrcol">设置文本框的最小宽度(以em单位)</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:minHeight">android:minHeight</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setMinHeight%28int%29">setMinHeight(int)</a></td><td width="100%" class="jd-descrcol">设置文本框的最小高度(以px单位)</td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:minLines">android:minLines</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setMinLines%28int%29">setMinLines(int)</a></td><td width="100%" class="jd-descrcol">设为文本框最少占用几行</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:minWidth">android:minWidth</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setMinWidth%28int%29">setMinWidth(int)</a></td><td width="100%" class="jd-descrcol">设置文本框的最大宽度(以px单位)</td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:numeric">android:numeric</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setKeyListener%28android.text.method.KeyListener%29">setKeyListener(KeyListener)</a></td><td width="100%" class="jd-descrcol"><div><span style="color:#ff0000">设置该文本框关联的输入法,有以下属性值:</span></div><div><span style="color:#ff0000"><br/></span></div><div><span style="color:#ff0000"> integer:指定关联整数输入法</span></div><div><span style="color:#ff0000"> signed:允许输入符号的数值输入法</span></div><div><span style="color:#ff0000"> decimal:允许输入小数点的数值输入法</span></div><div><br/></div></td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:password">android:password</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setTransformationMethod%28android.text.method.TransformationMethod%29">setTransformationMethod(TransformationMethod)</a></td><td width="100%" class="jd-descrcol"><span style="color:#ff0000">设置文本框为一个密码框(以 * 代替字符)</span></td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:phoneNumber">android:phoneNumber</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setKeyListener%28android.text.method.KeyListener%29">setKeyListener(KeyListener)</a></td><td width="100%" class="jd-descrcol"><span style="color:#ff0000">设置文本框为只能接受电话号码 </span></td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:privateImeOptions">android:privateImeOptions</a></td><td class="jd-linkcol"><div>setPrivateImeOptions(String)</div></td><td width="100%" class="jd-descrcol"> </td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:scrollHorizontally">android:scrollHorizontally</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setHorizontallyScrolling%28boolean%29">setHorizontallyScrolling(boolean)</a></td><td width="100%" class="jd-descrcol"> </td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:selectAllOnFocus">android:selectAllOnFocus</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setSelectAllOnFocus%28boolean%29">setSelectAllOnFocus(boolean)</a></td><td width="100%" class="jd-descrcol">设置文本框的内容可选择时,是否在获得焦点时整个文本的内容都被选中</td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:shadowColor">android:shadowColor</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setShadowLayer%28float,%20float,%20float,%20int%29">setShadowLayer(float,float,float,int)</a></td><td width="100%" class="jd-descrcol">设置文本框中文本的阴影颜色</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:shadowDx">android:shadowDx</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setShadowLayer%28float,%20float,%20float,%20int%29">setShadowLayer(float,float,float,int)</a></td><td width="100%" class="jd-descrcol">设置文本框内的文本的阴影在水平方向的偏移量</td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:shadowDy">android:shadowDy</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setShadowLayer%28float,%20float,%20float,%20int%29">setShadowLayer(float,float,float,int)</a>设置文本框内的文本的阴影在水平方向的偏移量</td><td width="100%" class="jd-descrcol"> </td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:shadowRadius">android:shadowRadius</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setShadowLayer%28float,%20float,%20float,%20int%29">setShadowLayer(float,float,float,int)</a></td><td width="100%" class="jd-descrcol">设置文本框中文本阴影的模糊程度,值越大越模糊</td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:singleLine">android:singleLine</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setTransformationMethod%28android.text.method.TransformationMethod%29">setTransformationMethod(TransformationMethod)</a></td><td width="100%" class="jd-descrcol"><span style="color:#ff0000">设置文本框中文本是否不换行,设置为true,则不换行,为单行</span></td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:text">android:text</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setText%28java.lang.CharSequence,%20android.widget.TextView.BufferType%29">setText(CharSequence,TextView.BufferType)</a></td><td width="100%" class="jd-descrcol"><span style="color:#ff0000">设置文本框中文本显示的内容</span></td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:textAllCaps">android:textAllCaps</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setAllCaps%28boolean%29">setAllCaps(boolean)</a></td><td width="100%" class="jd-descrcol">设置是否将文本框中的文本的所有字母显示为大写字母</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:textAppearance">android:textAppearance</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setTextAppearance%28int%29">setTextAppearance(int)</a></td><td width="100%" class="jd-descrcol"><span style="color:#ff0000">设为文本框的颜色、字体、大小等样式</span></td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:textColor">android:textColor</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setTextColor%28int%29">setTextColor(int)</a></td><td width="100%" class="jd-descrcol"><span style="color:#ff0000">设置文本框的文本的颜色</span></td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:textColorHighlight">android:textColorHighlight</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setHighlightColor%28int%29">setHighlightColor(int)</a></td><td width="100%" class="jd-descrcol">设置文本框中文本被选中的颜色</td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:textColorHint">android:textColorHint</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setHintTextColor%28int%29">setHintTextColor(int)</a></td><td width="100%" class="jd-descrcol"><span style="color:#ff0000">设置文本框中提示文本的颜色</span></td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:textColorLink">android:textColorLink</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setLinkTextColor%28int%29">setLinkTextColor(int)</a></td><td width="100%" class="jd-descrcol"><span style="color:#ff0000">设置文本框中超链接的颜色</span></td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:textIsSelectable">android:textIsSelectable</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#isTextSelectable%28%29">isTextSelectable()</a></td><td width="100%" class="jd-descrcol">设置文本框不能被编辑时,文本框内的文本是否可以被选中</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:textScaleX">android:textScaleX</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setTextScaleX%28float%29">setTextScaleX(float)</a></td><td width="100%" class="jd-descrcol">设置文本框中文本在水平方向上的缩放因子</td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:textSize">android:textSize</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setTextSize%28int,%20float%29">setTextSize(int,float)</a></td><td width="100%" class="jd-descrcol"><span style="color:#ff0000">设置文本框内文本的字号大小</span></td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:textStyle">android:textStyle</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setTypeface%28android.graphics.Typeface%29">setTypeface(Typeface)</a></td><td width="100%" class="jd-descrcol">设置文本框中文本的字体风格,如 粗体、斜体</td></tr><tr class=" api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:typeface">android:typeface</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setTypeface%28android.graphics.Typeface%29">setTypeface(Typeface)</a></td><td width="100%" class="jd-descrcol">设置文本框内文本的字体风格</td></tr><tr class="alt-color api apilevel-"><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#attr_android:width">android:width</a></td><td class="jd-linkcol"><a target="_blank" href="file:///E:/Android/sdk/docs/reference/android/widget/TextView.html#setWidth%28int%29">setWidth(int)</a></td><td width="100%" class="jd-descrcol"><span style="color:#ff0000">设置该文本框的宽度</span></td></tr></tbody></table>
下面是TextView 的一些效果,如下面的图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c86824d.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c88d34a.jpg)
2.EditText。的重要方法如下;
通过官网,我们可以看到,官网给出了EditText的一些方法。如下:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c8a653e.jpg)
其中最重要的就是 getText() 这个方法。通过这个方法,可以获得EditText中的文本信息。这样就能提取信息,一般都是在登陆界面和评论的地方,通过getText()方法来获取用户输入的内容。然后,把这些内容发送到服务器,然后提交服务器成功后。然后就把最新的评论数据从网络中返回到手机上。然后手机上面呈现出最新的评论结果。好了TetxtView和Edittext的方法和xml属性就介绍完了,然后如果不记得textview和EditText的xml属性是什么属性的话就查看上面的xml属性表。
学习Android从0开始之基础篇(3)-视图组件之布局管理器
最后更新于:2022-04-01 11:26:25
## Android布局管理器
**Android的Activity**组件通过setContentView(xml resId) 来为activity绑定显示界面,然而为了更好的更方便的管理Android应用的用户界面里面的各种控件(按钮 文本框 编辑框 图片等一系列组件),Android向我们提供了布局管理器。通过使用布局管理器,Android的图形界面跟java代码间具有很好 的 无关性,使代码与布局分开,这样就能减少代码量,代码只需要做一些界面组件的控制和一些数据处理,这样就有点类似java 中的MVC( modle view control)结构,android中的布局管理器就起到了View的作用,而java代码就起到了control的作用,android中的数据存储就起到了modle的作用。介绍完了布局管理器是什么了以后,接下来就介绍布局管理器有哪几类,布局管理器有:线性布局(LinearLayout) 相对布局(RelativeLayout) 网格布局(GridLayout) 帧布局(FrameLayout) 绝对布局(AbsoluteLayout) 接下来一一介绍各种布局管理器的作用。
1. **线性布局(LinearLayout)**
首先来到官方文档,看看官方文档的介绍(一定要会看官方文档)如下
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c617953.jpg)
官方大意为:在一个单一的列或一行排列其子的布局。该行的方向可以通过调用setorientation()来设置水平还是垂直。你也可以指定排列方式,通过设置LinearLayout.layoutparams来指定所排列的所有子元素调用setgravity()或指定特定的孩子的权重来填补剩余的空间布局。默认方向为水平。
还有一点非常重要,那就是LinearLayout中的组件排列起来的沿排列方向超出了屏幕的宽度,多出的部分是不会显示出来的。
再来看看LinearLayout的XML属性及相关方法,如下表:官方文档
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c62b14d.jpg)
接下来就跟着官方文档的属性介绍单个详细介绍:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c66e302.jpg)
该属性设置为false,将会阻止该布局管理器与它的子元素的基线对齐。当它的子元素使用不同的权重值时这个熟悉特别有用,默认是true。
必须是Boolean值,是true或者false;
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c683835.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c698e71.jpg)
设置垂直布局时两个按钮之间的分割条
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c6ae8a9.jpg)
设置布局管理器内组件的对齐方式,该属性支持top、bottom、left、right、center_vertical、fill_vertical、center_horizoontal、fill_horizontal、center、fill、clip_vertical、clip_horizontal这几个属性值,也可以同时指定多种组合,比如:left | center_vertical 代表的是出现在屏幕的左边,而且垂直居中;
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c6cb9bd.jpg)
当该属性设置为true时,所有带权重的子元素都会具有最大子元素的最小尺寸
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c6e21ba.jpg)
设置布局管理器内部组件的排列方式,可以设置为horizontal(水平)、vertical(垂直)之一,默认是vertical;
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c7024d8.jpg)
在LinearLayout的XML中,举个例子:android:weightSum="5" 表示这个LinearLayout总共平分成5块大小区域;然后再LinearLayout里面的控件,使用android:layout_wetght=“1”,这表示它占用整个布局的1/5。
通过介绍了上面LinearLayout的属性后,我们在通过下面的几个例子来展示这个几个属性的使用:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c714dba.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c7311d8.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c74e528.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c76880f.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c7847a9.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c7a3857.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c7c335b.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c7dedc8.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c7dedc8.jpg)
通过上面几个例子的展示,可以很只管的了解LinearLayout的那几个属性的使用效果。
2. 相对布局 (RelativeLayout)
通过Linearlayout的官方文档介绍方法,大家可以上Android官网去查看,就按照上面的步骤学习其他组件。后面几个布局管理器就不以上面的方式讲解,就直接以简短明了的方式向大家介绍。
相对布局容器内部的子组件的位置总是相对兄弟组件、父容器来决定的,因此这种布局方式被称之为相对布局,例如:如果B组件的位置要由A组件的位置来决定的话,那么就必须先定义B组件并且,确定B的位置后,才能定义A组件。
RelativeLayout的XML属性及相关方法说明
<table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td valign="top"><p align="left"> XML属性</p></td><td valign="top"><p align="left"> Java方法</p></td><td valign="top"><p align="left"> 说明</p></td></tr><tr><td valign="top"><p align="left"><span><span style="font-size:14px">android:gravity</span></span></p></td><td valign="top"><p align="left">setGravity(int)</p></td><td valign="top"><p align="left">设置该布局容器内各子组件的对齐方式</p></td></tr><tr><td valign="top"><p align="left">Android:ignoreGravity</p></td><td valign="top"><p align="left">setIgnoreGravity(int)</p></td><td valign="top"><p align="left">设置哪个组件不收gravity属性影响</p></td></tr></tbody></table>
为了能够控制该布局容器中各个子组件的布局分布,Relative也提供了一个内部类:RelativeLayout.LayoutParams,该类提供了大量的XML属性来控制Relative布局容器中子组件的布局分布,它的xml属性如下表所示:
下面的值只能是true或false
<table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td valign="top"><p align="left">android:layout_centerHorizontal</p></td><td valign="top"><p align="left">控制该子组件是否位于布局容器的水平居中</p></td></tr><tr><td valign="top"><p align="left">android:layout_centerVertical</p></td><td valign="top"><p align="left">控制该子组件是否位于布局容器的垂直居中</p></td></tr><tr><td valign="top"><p align="left">android:layout_centerInparent</p></td><td valign="top"><p align="left">控制该子组件是否位于布局容器的中央位置</p></td></tr><tr><td valign="top"><p align="left">android:layout_alignParentBottom</p></td><td valign="top"><p align="left">控制该子组件是否于布局容器底部对齐</p></td></tr><tr><td valign="top"><p align="left">android:layout_alignParentLeft</p></td><td valign="top"><p align="left">控制该子组件是否于布局容器左边对齐</p></td></tr><tr><td valign="top"><p align="left">android:layout_alignParentRight</p></td><td valign="top"><p align="left">控制该子组件是否于布局容器右边对齐</p></td></tr><tr><td valign="top"><p align="left">android:layout_alignParentTop</p></td><td valign="top"><p align="left">控制该子组件是否于布局容器顶端对齐</p></td></tr></tbody></table>
下面的属性的值只能是其他UI组件的id值
<table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td valign="top"><p align="left">android:layout_toRightOf</p></td><td valign="top"><p align="left">控制该子组件位于给出id组件的右侧</p></td></tr><tr><td valign="top"><p align="left">android:layout_toLeftOf</p></td><td valign="top"><p align="left">控制该子组件位于给出id组件的左侧</p></td></tr><tr><td valign="top"><p align="left">android:layout_above</p></td><td valign="top"><p align="left">控制该子组件位于给出id组件的上方</p></td></tr><tr><td valign="top"><p align="left">android:layout_below</p></td><td valign="top"><p align="left">控制该子组件位于给出id组件下方</p></td></tr><tr><td valign="top"><p align="left">android:layout_alignTop</p></td><td valign="top"><p align="left">控制该子组件位于给出id组件的上边界对齐</p></td></tr><tr><td valign="top"><p align="left">android:layout_alignBottom</p></td><td valign="top"><p align="left">控制该子组件位于给出id组件的下边界对齐</p></td></tr><tr><td valign="top"><p align="left">android:layout_alignLeft</p></td><td valign="top"><p align="left">控制该子组件位于给出id组件的左边界对齐</p></td></tr><tr><td valign="top"><p align="left">android:layout_alignRight</p></td><td valign="top"><p align="left">控制该子组件位于给出id组件的右边界对齐</p></td></tr></tbody></table>
下面是通过一个雪花效果来展示Relative的具体使用效果
~~~
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000">
<!--定义该组件位于父容器的中央-->
<TextView
android:id="@+id/xuehua_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="@drawable/iconfont_xuehua" />
<!--定义该组件位于view1的上方-->
<TextView
android:id="@+id/xuehua_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/xuehua_1"
android:layout_alignLeft="@id/xuehua_1"
android:background="@drawable/iconfont_xuehua" />
<!--定义该组件位于view1的下方-->
<TextView
android:id="@+id/xuehua_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/xuehua_1"
android:layout_below="@id/xuehua_1"
android:background="@drawable/iconfont_xuehua" />
<!--定义该组件位于view1的左方-->
<TextView
android:id="@+id/xuehua_4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/xuehua_1"
android:layout_toLeftOf="@id/xuehua_1"
android:background="@drawable/iconfont_xuehua" />
<!--定义该组件位于view1的右方-->
<TextView
android:id="@+id/xuehua_5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/xuehua_1"
android:layout_toRightOf="@id/xuehua_1"
android:background="@drawable/iconfont_xuehua" />
<!--定义该组件位于父容器的上方中央-->
<TextView
android:id="@+id/xuehua_6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:background="@drawable/iconfont_xuehua" />
<!--定义该组件位于父容器的左边中央-->
<TextView
android:id="@+id/xuehua_7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:background="@drawable/iconfont_xuehua" />
<!--定义该组件位于父容器的右边中央-->
<TextView
android:id="@+id/xuehua_8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:background="@drawable/iconfont_xuehua" />
<!--定义该组件位于父容器的下边居中-->
<TextView
android:id="@+id/xuehua_9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@drawable/iconfont_xuehua" />
</RelativeLayout>
~~~
下面是效果图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c811b00.jpg)
3. **网格布局(GridLayout)**
**网格布局是 Android4.0以后新推出的布局管理器,顾名思义,网格布局就是把整个容器划分为rows X columns个网格,每个网格放一个组件,除此之外还可以设置一个组件横跨多少列、一个组件纵跨多少行。gridlayout的xml属性和相关方法如下:**
****
<table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td valign="top"><p align="left">Xml属性</p></td><td valign="top"><p align="left">相关方法</p></td><td valign="top"><p align="left">说明</p></td></tr><tr><td valign="top"><p align="left">Andorid:alignmentMode</p></td><td valign="top"><p align="left">setAlignmentMode(int)</p></td><td valign="top"><p align="left">设置该布局管理器采用的对齐方式</p></td></tr><tr><td valign="top"><p align="left">Android:columnCount</p></td><td valign="top"><p align="left">setColumnCount(int)</p></td><td valign="top"><p align="left">设置该网格的列数量</p></td></tr><tr><td valign="top"><p align="left">Android:columnOrderPreserved</p></td><td valign="top"><p align="left">setColumnOrderPreserved(boolean)</p></td><td valign="top"><p align="left">设置该网格空容器是否保留列序号</p></td></tr><tr><td valign="top"><p align="left">Android:rowCount</p></td><td valign="top"><p align="left">setRowCount(int)</p></td><td valign="top"><p align="left">设置该网格的行数量</p></td></tr><tr><td valign="top"><p align="left">Android:rowOrderPreserved</p></td><td valign="top"><p align="left">setRowOrderPreserved(boolean)</p></td><td valign="top"><p align="left">设置该网格容器是否保留行序号</p></td></tr><tr><td valign="top"><p align="left">Androi:useDefaultMargins</p></td><td valign="top"><p align="left">setDefaultMargins(boolean)</p></td><td valign="top"><p align="left">设置该布局管理器是否使用默认的页边距</p></td></tr></tbody></table>
为了控制GridLayout布局容器中各子组件的布局分布,GridLayout也提供了一个内部类:GridLayouut.Params,该类提供了大量的XML属性来控制GridLayout布局容器中子组件的布局分布。
GridLayout.LayoutParams的XML属性
<table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td valign="top"><p align="center">Xml属性</p></td><td valign="top"><p align="center">相关方法</p></td><td valign="top"><p align="center">说明</p></td></tr><tr><td valign="top"><p align="center">Android:layout_column</p></td><td valign="top"><p align="center"> </p></td><td valign="top"><p align="center">设置该子组件在GridLayout的第几列</p></td></tr><tr><td valign="top"><p align="center">Android:layout_columSpan</p></td><td valign="top"><p align="center"> </p></td><td valign="top"><p align="center">设置该子组件在GridLayout横向上跨几列</p></td></tr><tr><td valign="top"><p align="center">Android:layout_gravity</p></td><td valign="top"><p align="center">setGravity(int)</p></td><td valign="top"><p align="center">设置该子组件采用何种方式占据该网格的空间</p></td></tr><tr><td valign="top"><p align="center">Android:layout_row</p></td><td valign="top"><p align="center"> </p></td><td valign="top"><p align="center">设置该子组件在GridLayout的第几行</p></td></tr><tr><td valign="top"><p align="center">Android:layout_rowSpan</p></td><td valign="top"><p align="center"> </p></td><td valign="top"><p align="center">设置该子组件在GridLayout纵向上跨几行</p></td></tr></tbody></table>
下面以计算器为例来讲解GridLayout的使用:
~~~
<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:rowCount="6"
android:background="#000"
android:columnCount="4">
<!--定义一个横跨4列的文本框-->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_columnSpan="4"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:padding="5dp"
android:layout_gravity="right"
android:background="#EEEEEE"
android:textColor="#000"
android:text="0"
android:singleLine="true"
android:textSize="50sp"/>
<!--定义一个横跨4列的按钮-->
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_columnSpan="4"
android:text="清除"
android:textSize="22sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="7"
android:textSize="20sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="8"
android:textSize="20sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="9"
android:textSize="20sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="/"
android:layout_gravity="fill"
android:textSize="20sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="4"
android:textSize="20sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="5"
android:textSize="20sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="6"
android:textSize="20sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="*"
android:layout_gravity="fill"
android:textSize="20sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1"
android:textSize="20sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2"
android:textSize="20sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="3"
android:textSize="20sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="-"
android:layout_gravity="fill"
android:textSize="20sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="."
android:textSize="20sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textSize="20sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="="
android:textSize="20sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="+"
android:layout_gravity="fill_horizontal"
android:textSize="20sp"/>
</GridLayout>
~~~
效果图如下:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c826e7d.jpg)
4. 帧布局(FramLayout)
帧布局为为每个加入其中的组件创建一个空白的区域,称为一帧,每个子组件各占据一帧,然而这些组件都会根据grivaty属性执行自动对齐。其实可以理解为堆扑克牌一样,一张一张的堆在一起,上面的一张卡片放在下面一张卡片上面。
FrameLayout的常用属性及相关方法
<table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td valign="top"><p align="center">Xml属性</p></td><td valign="top"><p align="center">相关方法</p></td><td valign="top"><p align="center">说明</p></td></tr><tr><td valign="top"><p align="center">Android:foreground</p></td><td valign="top"><p align="center">setForeground(Drawable)</p></td><td valign="top"><p align="center">设置该帧布局容器的前景图像</p></td></tr><tr><td valign="top"><p align="center">Android:foregroundGravity</p></td><td valign="top"><p align="center">setForegroundGravity(int)</p></td><td valign="top"><p align="center">定义绘制前景图像的gravity属性</p></td></tr></tbody></table>
~~~
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:width="300dp"
android:height="300dp"
android:background="#f00"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:width="200dp"
android:height="200dp"
android:background="#0f0"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:width="100dp"
android:height="100dp"
android:background="#00f"/>
</FrameLayout>
~~~
效果图如下:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c83b57a.jpg)
**5. 绝对布局(AbsoluteLayout)**
绝对布局通过直接设置组件的X 、Y坐标来设置组件的位置,然而布局管理器将不会管理子组件的位置和大小,完全有开发人员设置。但是,使用绝对布局来控制子组件的大小是一个不太推荐的思路,因为市面上运行Android系统的手机差距相差万别,它们的屏幕大小、分辨率都很不同,使用绝对布局是不可能做到各种屏幕上面显示效果都一样。因此AbsoluteLayout不觉管理器已经不适合在项目中使用了。
学习Android从0开始之基础篇(2)-AndroidMainfest.xml文件详解
最后更新于:2022-04-01 11:26:23
## AndroidMainfest.xml文件详解
**一、关于AndroidManifest.xml**
AndroidManifest.xml 是每个android程序中必须的文件。它位于整个项目的根目录,描述了package中暴露的组件(activities, services, 等等),他们各自的实现类,各种能被处理的数据和启动位置。 除了能声明程序中的Activities, ContentProviders, Services, 和Intent Receivers,还能指定permissions和instrumentation(安全控制和测试)
它在目录中的位置位于java文件夹上面,如下图所示:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c5d6fc3.jpg)
新建一个项目时,系统为我们的AndroidManifest.xml文件默认设置了一些属性,如下图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c5ec7ce.jpg)
二、**AndroidManifest.xml的结构**
****
~~~
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myfirst.helloworld" >
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<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>
<activity-alias>
<meta-data/>
<intent-filter>
<action/>
<category/>
<data/>
</intent-filter>
</activity-alias>
<meta-data>
</meta-data>
<provider>
<meta-data/>
<grant-uri-permission/>
<path-permission/>
</provider>
<receiver>
<meta-data/>
<intent-filter>
<action/>
<category/>
<data/>
</intent-filter>
</receiver>
<service>
<intent-filter>
<action/>
<category/>
<data/>
</intent-filter>
</service>
<uses-library/>
</application>
<compatible-screens>
<screen/>
</compatible-screens>
<instrumentation/>
<library/>
<original-package/>
<package-verifier/>
<permission/>
<permission-group />
<permission-tree />
<protected-broadcast/>
<resource-overlay/>
<uses-configuration/>
<uses-feature/>
<uses-permission/>
<uses-permission-sdk-23 />
<uses-sdk/>
</manifest>
~~~
****
三、**各个节点分别介绍**
上面就是整个am(androidManifest).xml的结构,下面以外向内开始阐述~~
1、第一层(<Manifest>):(属性)
~~~
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myfirst.helloworld"
android:revisionCode="integer"
android:sharedUserId="string"
android:sharedUserLabel="string resource"
android:versionCode="integer"
android:versionName="string"
android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
</manifest>
~~~
A、xmlns:android
定义android命名空间,一般为[http://schemas.android.com/apk/res/android](http://schemas.android.com/apk/res/android),这样使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据。
B revisionCode
android:revisionCode表示该软件的修改版本号,对用户是可见的,它必须是一个int型的整数,它的大小代表该软件版本升级过多少次,因此每次发布新版本该值都会+1,如Android:versionCode = ”5″ ,代表此软件已经发布过5次了。
C、package
指定本应用内java主程序包的包名,它也是一个应用进程的默认名称
D、sharedUserId
表明数据权限,因为默认情况下,Android给每个APK分配一个唯一的UserID,所以是默认禁止不同APK访问共享数据的。若要共享数据,第一可以采用Share Preference方法,第二种就可以采用sharedUserId了,将不同APK的sharedUserId都设为一样,则这些APK之间就可以互相共享数据了。详见:[http://wallage.blog.163.com/blog/static/17389624201011010539408/](http://wallage.blog.163.com/blog/static/17389624201011010539408/)
E、sharedUserLabel
一个共享的用户名,它只有在设置了sharedUserId属性的前提下才会有意义
F、versionCode
是给设备程序识别版本(升级)用的必须是一个interger值代表app更新过多少次,比如第一版一般为1,之后若要更新版本就设置为2,3等等。。。
G、versionName
这个名称是给用户看的,你可以将你的APP版本号设置为1.1版,后续更新版本设置为1.2、2.0版本等等。。。
H、installLocation
安装参数,是Android2.2中的一个新特性,installLocation有三个值可以选择:internalOnly、auto、preferExternal
选择preferExternal,系统会优先考虑将APK安装到SD卡上(当然最终用户可以选择为内部ROM存储上,如果SD存储已满,也会安装到内部存储上)
选择auto,系统将会根据存储空间自己去适应
选择internalOnly是指必须安装到内部才能运行
(注:需要进行后台类监控的APP最好安装在内部,而一些较大的游戏APP最好安装在SD卡上。现默认为安装在内部,如果把APP安装在SD卡上,首先得设置你的level为8,并且要配置android:installLocation这个参数的属性为preferExternal)
2、第二层(<Application>):属性
一个AndroidManifest.xml中必须含有一个Application标签,这个标签声明了每一个应用程序的组件及其属性(如icon,label,permission等)
~~~
<application android:allowClearUserData=["true" | "false"]
android:allowTaskReparenting=["true" | "false"]
android:backupAgent="string"
android:debuggable=["true" | "false"]
android:description="string resource"
android:enabled=["true" | "false"]
android:hasCode=["true" | "false"]
android:icon="drawable resource"
android:killAfterRestore=["true" | "false"]
android:label="string resource"
android:manageSpaceActivity="string"
android:name="string"
android:permission="string"
android:persistent=["true" | "false"]
android:process="string"
android:restoreAnyVersion=["true" | "false"]
android:taskAffinity="string"
android:theme="resource or theme" >
</application>
~~~
A、android:allowClearUserData('true' or 'false')
用户是否能选择自行清除数据,默认为true,程序管理器包含一个选择允许用户清除数据。当为true时,用户可自己清理用户数据,反之亦然
B、android:allowTaskReparenting('true' or 'false')
是否允许activity更换从属的任务,比如从短信息任务切换到浏览器任务
C、android:backupAgent
这也是Android2.2中的一个新特性,设置该APP的备份,属性值应该是一个完整的类名,如com.project.TestCase,此属性并没有默认值,并且类名必须得指定(就是个备份工具,将数据备份到云端的操作)
D、android:debuggable
这个从字面上就可以看出是什么作用的,当设置为true时,表明该APP在手机上可以被调试。默认为false,在false的情况下调试该APP,就会报以下错误:
Device XXX requires that applications explicitely declare themselves as debuggable in their manifest.
Application XXX does not have the attribute 'debuggable' set to TRUE in its manifest and cannot be debugged.
E、android:description/android:label
此两个属性都是为许可提供的,均为字符串资源,当用户去看许可列表(android:label)或者某个许可的详细信息(android:description)时,这些字符串资源就可以显示给用户。label应当尽量简短,之需要告知用户该许可是在保护什么功能就行。而description可以用于具体描述获取该许可的程序可以做哪些事情,实际上让用户可以知道如果他们同意程序获取该权限的话,该程序可以做什么。我们通常用两句话来描述许可,第一句描述该许可,第二句警告用户如果批准该权限会可能有什么不好的事情发生
F、android:enabled
Android系统是否能够实例化该应用程序的组件,如果为true,每个组件的enabled属性决定那个组件是否可以被 enabled。如果为false,它覆盖组件指定的值;所有组件都是disabled。
G、android:hasCode('true' or 'false')
表示此APP是否包含任何的代码,默认为true,若为false,则系统在运行组件时,不会去尝试加载任何的APP代码
一个应用程序自身不会含有任何的代码,除非内置组件类,比如Activity类,此类使用了AliasActivity类,当然这是个罕见的现象
(在Android2.3可以用标准C来开发应用程序,可在androidManifest.xml中将此属性设置为false,因为这个APP本身已经不含有任何的JAVA代码了)
H、android:icon
这个很简单,就是声明整个APP的图标,图片一般都放在drawable文件夹下
I、android:killAfterRestore
J、android:manageSpaceActivity
K、android:name
为应用程序所实现的Application子类的全名。当应用程序进程开始时,该类在所有应用程序组件之前被实例化。
若该类(比方androidMain类)是在声明的package下,则可以直接声明android:name="androidMain",但此类是在package下面的子包的话,就必须声明为全路径或android:name="package名称.子包名成.androidMain"
L、android:permission
设置许可名,这个属性若在<application>上定义的话,是一个给应用程序的所有组件设置许可的便捷方式,当然它是被各组件设置的许可名所覆盖的
M、android:presistent
该应用程序是否应该在任何时候都保持运行状态,默认为false。因为应用程序通常不应该设置本标识,持续模式仅仅应该设置给某些系统应用程序才是有意义的。
N、android:process
应用程序运行的进程名,它的默认值为<manifest>元素里设置的包名,当然每个组件都可以通过设置该属性来覆盖默认值。如果你想两个应用程序共用一个进程的话,你可以设置他们的android:process相同,但前提条件是他们共享一个用户ID及被赋予了相同证书的时候
O、android:restoreAnyVersion
同样也是android2.2的一个新特性,用来表明应用是否准备尝试恢复所有的备份,甚至该备份是比当前设备上更要新的版本,默认是false
P、android:taskAffinity
拥有相同的affinity的Activity理论上属于相同的Task,应用程序默认的affinity的名字是<manifest>元素中设定的package名
Q、android:theme
是一个资源的风格,它定义了一个默认的主题风格给所有的activity,当然也可以在自己的theme里面去设置它,有点类似style。
3、第三层(<Activity>):属性
~~~
<activity android:allowTaskReparenting=["true" | "false"]
android:alwaysRetainTaskState=["true" | "false"]
android:clearTaskOnLaunch=["true" | "false"]
android:configChanges=["mcc", "mnc", "locale",
"touchscreen", "keyboard", "keyboardHidden",
"navigation", "orientation", "screenLayout",
"fontScale", "uiMode"]
android:enabled=["true" | "false"]
android:excludeFromRecents=["true" | "false"]
android:exported=["true" | "false"]
android:finishOnTaskLaunch=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:launchMode=["multiple" | "singleTop" |
"singleTask" | "singleInstance"]
android:multiprocess=["true" | "false"]
android:name="string"
android:noHistory=["true" | "false"]
android:permission="string"
android:process="string"
android:screenOrientation=["unspecified" | "user" | "behind" |
"landscape" | "portrait" |
"sensor" | "nosensor"]
android:stateNotNeeded=["true" | "false"]
android:taskAffinity="string"
android:theme="resource or theme"
android:windowSoftInputMode=["stateUnspecified",
"stateUnchanged", "stateHidden",
"stateAlwaysHidden", "stateVisible",
"stateAlwaysVisible", "adjustUnspecified",
"adjustResize", "adjustPan"] >
</activity>
~~~
(注:有些在application中重复的就不多阐述了)
1、android:alwaysRetainTaskState
是否保留状态不变, 比如切换回home, 再从新打开,activity处于最后的状态。比如一个浏览器拥有很多状态(当打开了多个TAB的时候),用户并不希望丢失这些状态时,此时可将此属性设置为true
2、android:clearTaskOnLaunch
比如 P 是 activity, Q 是被P 触发的 activity, 然后返回Home, 重新启动 P,是否显示 Q
3、android:configChanges
当配置list发生修改时, 是否调用 onConfigurationChanged() 方法 比如 "locale|navigation|orientation".
这个我用过,主要用来看手机方向改变的. android手机在旋转后,layout会重新布局, 如何做到呢?
正常情况下. 如果手机旋转了.当前Activity后杀掉,然后根据方向重新加载这个Activity. 就会从onCreate开始重新加载.
如果你设置了 这个选项, 当手机旋转后,当前Activity之后调用onConfigurationChanged() 方法. 而不跑onCreate方法等.
4、android:excludeFromRecents
是否可被显示在最近打开的activity列表里,默认是false
5、android:finishOnTaskLaunch
当用户重新启动这个任务的时候,是否关闭已打开的activity,默认是false
如果这个属性和allowTaskReparenting都是true,这个属性就是王牌。Activity的亲和力将被忽略。该Activity已经被摧毁并非re-parented
6、android:launchMode(Activity加载模式)
在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity。这需要为Activity配置特定的加载模式,而不是使用默认的加载模式
Activity有四种加载模式:
standard、singleTop、singleTask、singleInstance(其中前两个是一组、后两个是一组),默认为standard
standard:就是intent将发送给新的实例,所以每次跳转都会生成新的activity。
singleTop:也是发送新的实例,但不同standard的一点是,在请求的Activity正好位于栈顶时(配置成singleTop的Activity),不会构造新的实例
singleTask:和后面的singleInstance都只创建一个实例,当intent到来,需要创建设置为singleTask的Activity的时候,系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。
singleInstance:
首先说明一下task这个概念,Task可以认为是一个栈,可放入多个Activity。比如启动一个应用,那么Android就创建了一个Task,然后启动这个应用的入口Activity,那在它的界面上调用其他的Activity也只是在这个task里面。那如果在多个task中共享一个Activity的话怎么办呢。举个例来说,如果开启一个导游服务类的应用程序,里面有个Activity是开启GOOGLE地图的,当按下home键退回到主菜单又启动GOOGLE地图的应用时,显示的就是刚才的地图,实际上是同一个Activity,实际上这就引入了singleInstance。singleInstance模式就是将该Activity单独放入一个栈中,这样这个栈中只有这一个Activity,不同应用的intent都由这个Activity接收和展示,这样就做到了共享。当然前提是这些应用都没有被销毁,所以刚才是按下的HOME键,如果按下了返回键,则无效
7、android:multiprocess
是否允许多进程,默认是false
具体可看该篇文章:[http://www.bangchui.org/simple/?t3181.html](http://www.bangchui.org/simple/?t3181.html)
8、android:noHistory
当用户从Activity上离开并且它在屏幕上不再可见时,Activity是否从Activity stack中清除并结束。默认是false。Activity不会留下历史痕迹
9、android:screenOrientation
activity显示的模式
默认为unspecified:由系统自动判断显示方向
landscape横屏模式,宽度比高度大
portrait竖屏模式, 高度比宽度大
user模式,用户当前首选的方向
behind模式:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
sensor模式:有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换
nosensor模式:忽略物理感应器,这样就不会随着用户旋转设备而更改了
10、android:stateNotNeeded
activity被销毁或者成功重启时是否保存状态
11、android:windowSoftInputMode
activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性。
这个属性能影响两件事情:
【A】当有焦点产生时,软键盘是隐藏还是显示
【B】是否减少活动主窗口大小以便腾出空间放软键盘
各值的含义:
【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【C】stateHidden:用户选择activity时,软键盘总是被隐藏
【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【E】stateVisible:软键盘通常是可见的
【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
4、第四层(<intent-filter>)
结构图:
~~~
<intent-filter android:icon="drawable resource"
android:label="string resource"
android:priority="integer" >
<action />
<category />
<data />
</intent-filter>
~~~
intent-filter属性
android:priority(解释:有序广播主要是按照声明的优先级别,如A的级别高于B,那么,广播先传给A,再传给B。优先级别就是用设置priority属性来确定,范围是从-1000~1000,数越大优先级别越高)
Intent filter内会设定的资料包括action,data与category三种。也就是说filter只会与intent里的这三种资料作对比动作
action属性
action很简单,只有android:name这个属性。常见的android:name值为android.intent.action.MAIN,表明此activity是作为应用程序的入口。有关android:name具体有哪些值,可参照这个网址:[http://hi.baidu.com/linghtway/blog/item/83713cc1c2d053170ff477a7.html](http://hi.baidu.com/linghtway/blog/item/83713cc1c2d053170ff477a7.html)
category属性
category也只有android:name属性。常见的android:name值为android.intent.category.LAUNCHER(决定应用程序是否显示在程序列表里)
有关android:name具体有哪些值,可参照这个网址:[http://chroya.javaeye.com/blog/685871](http://chroya.javaeye.com/blog/685871)
data属性
~~~
<data android:host="string"
android:mimeType="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:port="string"
android:scheme="string"/>
~~~
【1】每个<data>元素指定一个URI和数据类型(MIME类型)。它有四个属性scheme、host、port、path对应于URI的每个部分:
scheme://host:port/path
scheme的值一般为"http",host为包名,port为端口号,path为具体地址。如:[http://com.test.project:200/folder/etc](http://com.test.project:200/folder/etc)
其中host和port合起来构成URI的凭据(authority),如果host没有指定,则port也会被忽略
要让authority有意义,scheme也必须要指定。要让path有意义,scheme+authority也必须要指定
【2】mimeType(指定数据类型),若mimeType为'Image',则会从content Provider的指定地址中获取image类型的数据。还有'video'啥的,若设置为video/mp4,则表示在指定地址中获取mp4格式的video文件
【3】而pathPattern和PathPrefix主要是为了格式化path所使用的
5、第四层<meta-data>
~~~
<meta-data android:name="string"
android:resource="resource specification"
android:value="string"/>
~~~
这是该元素的基本结构.可以包含在<activity> <activity-alias> <service> <receiver>四个元素中。
android:name(解释:元数据项的名字,为了保证这个名字是唯一的,采用java风格的命名规范,如com.woody.project.fried)
android:resource(解释:资源的一个引用,指定给这个项的值是该资源的id。该id可以通过方法Bundle.getInt()来从meta-data中找到。)
android:value(解释:指定给这一项的值。可以作为值来指定的数据类型并且组件用来找回那些值的Bundle方法:[getString],[getInt],[getFloat],[getString],[getBoolean])
6、第三层<activity-alias>属性
~~~
<activity-alias android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:targetActivity="string">
<intent-filter/>
<meta-data/>
</activity-alias>
~~~
<activity-alias>是为activity创建快捷方式的,如下实例:
~~~
<activity android:name=".shortcut">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
<activity-alias android:name=".CreateShortcuts" android:targetActivity=".shortcut" android:label="@string/shortcut">
<intent-filter>
<action android:name="android.intent.action.CREATE_SHORTCUT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity-alias>
~~~
其中android.targetActivity是指向对应快捷方式的activity,如上述的shortcut(此Activity名)
android:label是指快捷方式的名称,而快捷方式的图标默认是给定的application图标
7、第三层<service>
【1】service与activity同级,与activity不同的是,它不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行。比如听音乐,网络下载数据等,都是由service运行的
【2】service生命周期:Service只继承了onCreate(),onStart(),onDestroy()三个方法,第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法
【3】service与activity间的通信
Service后端的数据最终还是要呈现在前端Activity之上的,因为启动Service时,系统会重新开启一个新的进程,这就涉及到不同进程间通信的问题了(AIDL),Activity与service间的通信主要用IBinder负责。具体可参照:[http://zhangyan1158.blog.51cto.com/2487362/491358](http://zhangyan1158.blog.51cto.com/2487362/491358)
【4】
~~~
<service android:enabled=["true" | "false"]
android:exported[="true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string">
</service>
~~~
service标签内的属性之前已有描述,在此不重复了~
8、第三层<receiver>
receiver的属性与service一样,这里就不显示了
BroadcastReceiver:用于发送广播,broadcast是在应用程序之间传输信息的一种机制,而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件,具体参照[http://kevin2562.javaeye.com/blog/686787](http://kevin2562.javaeye.com/blog/686787)
9、第三层<provider>属性
~~~
<provider android:authorities="list"
android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:grantUriPermissions=["true" | "false"]
android:icon="drawable resource"
android:initOrder="integer"
android:label="string resource"
android:multiprocess=["true" | "false"]
android:name="string"
android:permission="string"
android:process="string"
android:readPermission="string"
android:syncable=["true" | "false"]
android:writePermission="string">
<grant-uri-permission/>
<meta-data/>
</provider>
~~~
contentProvider(数据存储)
【1】android:authorities:
标识这个ContentProvider,调用者可以根据这个标识来找到它
【2】android:grantUriPermission:
对某个URI授予的权限
【3】android:initOrder
10、第三层<uses-library>
用户库,可自定义。所有android的包都可以引用
11、第一层<supports-screens>
~~~
<supports-screens android:smallScreens=["true" | "false"]
android:normalScreens=["true" | "false"]
android:largeScreens=["true" | "false"]
android:anyDensity=["true" | "false"] />
~~~
这是在android1.6以后的新特性,支持多屏幕机制
各属性含义:这四个属性,是否支持大屏,是否支持中屏,是否支持小屏,是否支持多种不同密度
12、第二层<uses-configuration />与<uses-feature>性能都差不多
~~~
<uses-configuration android:reqFiveWayNav=["true" | "false"]
android:reqHardKeyboard=["true" | "false"]
android:reqKeyboardType=["undefined" | "nokeys" | "qwerty" | "twelvekey"]
android:reqNavigation=["undefined" | "nonav" | "dpad" | "trackball" | "wheel"]
android:reqTouchScreen=["undefined" | "notouch" | "stylus" | "finger"] />
<uses-feature android:glEsVersion="integer"
android:name="string"
android:required=["true" | "false"] />
~~~
这两者都是在描述应用所需要的硬件和软件特性,以便防止应用在没有这些特性的设备上安装。
13、第二层<uses-sdk />
~~~
<uses-sdk android:minSdkVersion="integer"
android:targetSdkVersion="integer"
android:maxSdkVersion="integer"/>
~~~
描述应用所需的api level,就是版本,目前是android 2.2 = 8,android2.1 = 7,android1.6 = 4,android1.5=3
在此属性中可以指定支持的最小版本,目标版本以及最大版本
14、第二层<instrumentation />
~~~
<instrumentation android:functionalTest=["true" | "false"]
android:handleProfiling=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:targetPackage="string"/>
~~~
定义一些用于探测和分析应用性能等等相关的类,可以监控程序。在各个应用程序的组件之前instrumentation类被实例化
android:functionalTest(解释:instrumentation类是否能运行一个功能测试,默认为false)
15、<permission>、<uses-permission>、<permission-tree />、<permission-group />区别~
最常用的当属<uses-permission>,当我们需要获取某个权限的时候就必须在我们的manifest文件中声明,此<uses-permission>与<application>同级,具体权限列表请看此处通常情况下我们不需要为自己的应用程序声明某个权限,除非你提供了供其他应用程序调用的代码或者数据。这个时候你才需要使用<permission> 这个标签。很显然这个标签可以让我们声明自己的权限。比如:
`<permission android:name="com.teleca.project.MY_SECURITY" . . . />`
那么在activity中就可以声明该自定义权限了,如:
~~~
<application . . .>
<activity android:name="XXX" . . . >
android:permission="com.teleca.project.MY_SECURITY"> </activity>
</application>
~~~
当然自己声明的permission也不能随意的使用,还是需要使用<uses-permission>来声明你需要该权限<permission-group> 就是声明一个标签,该标签代表了一组permissions,而<permission-tree>是为一组permissions声明了一个namespace。这两个标签可以看之前的系列文章。
学习Android从0开始之基础篇(1)-Android的四大基本组件
最后更新于:2022-04-01 11:26:20
## Android应用的四大基本组件简介
Android应用通常由四部分组成,包括:Activity Service BroadcastReceiver ContentProvider;本篇博客将对这四个组件做基本介绍,让大家对这些组件有一个大致的认识,后面的博客将还会对它们做详细讲解。
1. **Activity**
Activity是android应用中负责与用户进行交互的的组件,就是我们android手机呈现界面的组件,你可以把它想象成相框,我们android应用呈现的画面都是在这个相框里面,而这个相框的大小就是我们手机屏幕的大小。他负责呈现画面给我们用户,并接受我们用户的点击 滑动等一系类响应事件。当我们把android应用要呈现的界面(XML文件)设计好后,然而activity只能通过setContentView(View) 来显示指定的界面,好比,我们把照片拍好后,选择用哪个相框来装载这张照片,因此这样 来为activity绑定显示界面。
setContentView(View)的使用一般是下面的形式:
~~~
<span style="font-size:14px;">setContentView(R.layout.main);</span>
~~~
其中的R.layout.main 是android资源文件中的一个布局文件,相当于是相片。
注意的是,实际上Actvity是Window的容器,Activity包含一个getWindow()方法,这个方法返回Activity所包含的窗口,对于Activity,作为开发者的我们是不用关心它的window对象,如果应用程序不用调用Activity的setContentView()方法来设置该activity的显示界面,那么该应用将显示一个空的窗口。
一个android应用包含很多个Activity,多个activity组成activity栈,存储方式为先进后出,就像箱子里面放书一样,先放进去的书放在最下面,最后放进去的在最上面,所以当前运行的activity位于栈顶。
还有一点就是我们Activity可以设计它自身的风格,就是主题,使用setTheme(int resouceId)就可以指定activity的使用风格,比如有些时候我们的activity不需要使用actionBar 或者以对话框的形式显示,就可以使用这个方法实现,也可以在AndroidManifest.xml指定activity的显示风格。
2.**Service**
**Service可以说** 是和activity一样重要的,它只是没有显示界面而已,service通常运行在后台,因为没有界面显示,所以一般不需要与用户进行交互。
Service组件需要继承Service基类,Service运行之后拥有自己独立的生命周期,Service组件通常是用于为其他组件提供后台服务,或者监听其他组件的运行状态。其中典型的应用就是 音乐播放器,首页是activity呈现给用户的界面,后台播放音乐有Service来完成,Service播放了多少秒然后通知Activity更新界面。Activity的播放暂停按钮被用户点击了,然后通知Service停止或播放音乐。
3. **BroadcastReceiver**
**BroadcastReceiver 是 android 应用** 中一个非常重要的组件,根据这个名字,大家肯定知道了它其实就是广播消息接收器,与普通的监听器不同的是:普通的监听器监听的事件源氏程序中的对象,而BroadcastReceiver监听的事件源是Android应用中的其他组件(activity receiver)。
使用broadcastReceiver组件接受广播消息比较简单,我们只需要实现自己的BroadcatReceiver子类,并重写onRecerver(Context context,Intent intent)方法即可。当其他组件通过sendBroadcast() 或者sentStickyBroadcast() 或者sentOrderBroadcast()方法发送广播消息时,如果该BroadcastReceiver对这个消息感兴趣,通过IntentFilter配置(这是一个过滤器,设置一些条件,如果某个消息和这些条件匹配,则激活BroadcastReceiver),BroadcastReceiver的onReceive()方法就会被激活,这个方法中设置的一些动作就会被执行。就像Service中播放音乐播放完了之后,它就通过sendBroadcast()向activity发送消息,activity收到消息后,就会执行BroadcastReceiver中的onReceive()中的方法,activity就会在界面上做出相应的界面更新。
BroadcastReceiver有两种注册方式,只有注册之后才能启动,否则是不会有消息发送和接收的。如下两种方法:
(1). 在java代码中通过Context.registReceiver()方法注册BroadcastReceiver;
(2). 在AndroidManifest.xml中使用<receiver.../>元素完成注册;
这里只对BroadcastReceiver做简短介绍,后面的博客中将会对它进行详细讲解,并教会大家怎样开发和使用它。
4. **ContentProvider**
对于Android应用程序,它们是单独运行在自己的Dalvik虚拟机实例中,如果这些Android应用之间需要进行实时的数据交换,则需要contentProvider来完成这个工作,当要获取手机联系人时,就会用到它;
ContentProvider是Android系统为跨应用的数据交换的一个标准,当用户实现自己的ContentProvider的时候,要实现它的以后4个方法:
(1) insert(Uri, ContentValues):向ContentProvider插入数据;
(2) delete(Uri, ContentValues):删除contentProvider中指定的数据;
(3) update(Uri,ContentValues,String,String[ ]):更新ContentProvider中指定的ContentProvider;
(4) query(Uri, String[ ], String ,String[ ],String): 从ContentResolver查询数据;
通常使用ContentProvider时都会结合使用ContentResolver,一个应用程序来暴露自己的数据给外界,而另一个程序则通过ContentResolver来访问数据;
5.**Intent 和 IntentFilter**
**intent在android 应 用 程序** 中的地位非常之高,作用非常之大。它是Android应用程序内部不同组件之间通信的载体。当android运行时需要链接不同的组件时,就需要Intent来实现。Intent可以启动一个Activity,也可以启动一个Service,也可以通过发送广播消息来触发系统中的BroadcastReceiver。也就是说,intent是Activity,Service,BroadcastReceiver 这3个组件之间通信的载体,只是它们使用Intent的方式机制有些不同罢了。
(1)当需要启动一个activity时,可调用Context的startActivity(Intent intent)或者 startActivityForResult(Intent intent,int requestCode)方法,这两个方法中的intent都封装了需要启动的目标activity的信息;
(2)当需要启动一个Service时,可调用Context的startService(Intent intent)或者bindService(Intent service, ServiceConnection conn,int flags)方法,这两个方法中的intent都封装了需要启动的目标service的信息;
(3)当需要触发一个BroadcastReceiver时,可调用Context的sendBroadcast(Intent intent) 或 sendStickyBroadcast(Intent intent) 或 sendOrderBroadcast(Intent intent,String receiverPermission) 方法来发送广播消息,这三个方法中的intent封装了需要触发的目标BroadcastReceiver 的信息;
通过上面的介绍,可以看出,Intent封装了当前组件需要启动或触发的目标的信息,然而Intent分为两类:
(1) 显示 Intent :显示Intent明确指定需要启动或者触发的组件的类名;
(2) 隐示 Intent:隐示Intent只是指定了需要启动启动或者触发的组件需要应满足怎样的条件;
对于显示Intent,Android系统无需对该Intent做任何解析,系统直接找到指定的目标组件,启动会触发它即可;
对于隐示Intent,Android系统需要对该Intent进行解析,解析出它的条件,然后去系统中查找与之匹配的目标组件。如果有满足条件的组件就启动或触发它。
隐示Intent通过IntentFilter来实现的,被调用组件可以通过IntentFilter来声明自己所满足的条件,就是声明自己到底能处理哪些Intent。Intent和IntentFilter有很多内容,后面的博客会做详细介绍。本次博客就介绍这么多。
学习Android从0开始之开发工具篇-Android studio详解
最后更新于:2022-04-01 11:26:18
## Android studio详解
我们古人又云:工欲善其事,必先利其器。
1、android studio的背景
Android Studio 是一个Android开发环境,基于[IntelliJ IDEA](http://baike.baidu.com/view/2735945.htm). 类似[Eclipse](http://baike.baidu.com/subview/23576/9374802.htm)[ADT](http://baike.baidu.com/view/1237351.htm),Android Studio 提供了集成的 Android 开发工具用于开发和调试。下面是android studio的发展历史
**2013年**
2013年5月16日,在I/O大会上,谷歌推出新的Android开发环境——Android Studio,并对开发者控制台进行了改进,增加了五个新的功能 。
Android Studio是谷歌推出了新的Android开发环境,开发者可以在编写程序的同时看到自己的应用在不同尺寸屏幕中的样子。
谷歌对开发者控制台进行了改进,增加了五个新的功能,包括优化小贴士、应用翻译服务、推荐跟踪、营收曲线图、用版测试和阶段性展示。
1、优化小贴士:在主体中打开你的应用,点击小贴士,会得到这样的建议:为你的应用开发平板电脑版本。
2、应用翻译服务:允许开发者直接在开发主体中获得专业的翻译。上传你的需求,选择翻译,其会显示翻译方和价格,并在一周内发回译本。
3、推荐跟踪:允许开发者找出最有效的广告
4、营收曲线图:向开发者展示其应用营收,以国家进行划分
5、试用版测试和阶段性展示:开发者可以对应用进行测试,然后向测试用户推出,测试结果不会对外公布。当一个版本的测试结束,开发者可以向特定比例用户推出。
Android Studio这款开发工具被首次公布,这也是为了方便开发者基于Android开发。
首先解决的一个问题是多分辨率。Android设备拥有大量不同尺寸的屏幕和分辨率,根据新的Studio,开发者可以很方便的调整在各个分辨率设备上的应用。
同时Studio还解决语言问题,多语言版本(**但是没有中文版本)**、支持翻译都让开发者更适应全球开发环境。Studio还提供收入记录功能。
最大的改变在于Beta测试的功能。Studio提供了Beta Testing,可以让开发者很方便试运行。
**2015年**
2015年5月29日,在谷歌I/O开发者大会上,谷歌发布AndroidStudio 1.3版,支持C++编辑和查错功能。Android Studio 1.3版开发码代码变得更加容易,速度提升,而且支持C++编辑和查错功能。
然而在2015年的11月份,android studio迎来了2.0的更新,大家都知道,升级2.0必定是一次大跟新,其中突破点如下:
1、Instant Run:只要点击运行,使用者可以立即察看新程序码的执行效果。该版的 Instant Run 速度是以往的 50 倍![搜索](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e2152b05b6.png)
。而以前点击 Instant Run 之后所花费的时间,足够开发者去上个厕所。
2、GPU Profiler 工具:允许使用者记录完整 OpenGL 会话,并逐格检查所有变动。使用者也能察看每一格程序码,并获得 GL State 和 Commands 讯息。
3、更快的 Android 模拟器。
4、支持使用者将 APK 文件拖曳到模拟器,并能透过拉动窗口调整尺寸。
5、界面获得更新,增加一条悬浮工具列。
6、据称,现在使用 Android Studio 2.0 版为 Android M 开发应用的速度比之前快上 5 倍。
综上可以看出,android studio的发展速度是非常快速的,体现了google对android的重视程度之高。总所周知,以前android开发是在Eclipse上面进行的,然而Eclipse是一个非常广的开发工具,能够开发很多java能够做的事情。然而Android系统现在如日中天,居然没有一款自己的开发工具,于是,在13年google就大力开发专门用于android开发的IDE(Integrated Development Environment,集成开发环境)。在仅仅两年的时间AS(Android Studio)就发展的非常齐全和细致,版本也迭代非常快,越来越稳定成熟。
Android Studio和Eclipse ADT相比,Eclipse好比是田径赛中的铁人五项,非常全面,Android Studio 好比是其中一项的世界记录保持着。在专业性上面Eclipse是无法比的。早些时候在 [Android官网](http://developer.android.com/index.html) 首页也能看到Eclipse ADT 的下载,现在只有Android Studio下载了,可见,google完全放弃了对Eclipse的支持。所以现在只能用Android studio开发Android 应用了。接下来我就教大家怎样下载安装和使用Android Studio。
2 、Android Studio的下载和安装:
因为android程序使用java编写的,在开发android 之前先要搭建java开发环境,点击后面链接进行配置,很简单的:[java开发环境搭建](http://jingyan.baidu.com/article/ff42efa91880bbc19e2202b6.html)
1.
首先在浏览器中输入android studio的官网:http://developer.android.com/index.html,由于Google在国内不支持,你们懂得,需要翻墙,才能进入官网,不要灰心,在下面我会给出国内做的很好的镜像网站,官网如下: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e2152c437e.jpg)
这就是android的官网,在这里我们可以点击左上角的Develop,进入开发者界面,如下:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e215302b10.jpg)
android 官网给出了一个指导教程,在这里可以先点击左上角的API Guides,然后进到一个guides界面,如图中的2所示,根据2号一列的android 开发指导,你就会学会android开发了,但是这需要你的英文能力过关。关于android 开发人员,必备的一项技能就是能够读懂API(Application Programming Interface,应用程序编程接口),很多编程的源文件介绍都是英文写的。所以在做android 开发的时候一定要习惯读英文文档,这不仅是英文能力的提高,更是一种工作能力的提高。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e215326674.jpg)
根据上面的指示就能下载官方推荐的稳定版本的android studio,点击2 指示的按钮就能出现下载界面如下:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e21534a786.jpg)
勾选好 同意条款后就可以点击上面的点击按钮了,然后就在下载了,稍后片刻下载完成,就能够使用了。
如果同学们觉得翻墙麻烦,接下来我就给大家推荐一个非常不错的国内镜像网站:http://www.androiddevtools.cn/
这个网站有最新的android studio下载,建议下载android studio倒数第2个版本,这里建议下载 2.0 Preview3 这个版本,因为刚出来的版本可能还有一些小问题,然而,之前一个版本,也经过市场的检验,所以要稳定些。建议大家收藏这个网站,以后有很多android最新的工具,和解决方案这里都有,这个网站的下面还有很多小工具,大家肯定用得着。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e215368fd1.jpg)
点击这个链接查看 [Android studio的安装](http://jingyan.baidu.com/article/ad310e80a9328a1849f49e30.html) 在这里就不介绍android studio的安装了,因为我的电脑上面已经安装了android studio,所以大家按照百度上面的方法就可以安装了。
3、android studio的首次使用
新建一个工程流程图如下:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e215388712.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e2153a3483.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e2153becda.jpg)
到这里android studio给我们做了很多模板,比如:Navigation Drawer Acticity, 但是这些我们用的都比较少,一般选择Black activity 或 Empty Activity,
然后下一步如下图,点击下一步完成项目的创建
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e2153d9db6.jpg)
首先android 呈现给我们的目录结构如下图中红色框 框起来的地方就是Android默认的目录结构,但是这个目录结构和文件存储的结构是不一样的,文件存储结构是以project 为目录结构,然而android 系统为了方便我们开发,才设计了Android开发目录结构。如下图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e2153f350f.jpg)
点击Android旁边的下拉按钮 显示出不同的文件结构,以方便开发人员个人的开发习惯和工程需求。以后会讲到各种目录结构的优缺点。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e215421878.jpg)
查看文件的目录结构和android studio中以project的目录结构是一样的,如下面两图所示:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e2154437a5.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e215457a29.jpg)
上面介绍了android studio是怎样创建项目的,以及项目中的文件目录结构构成。
下面开始介绍Android开发的一些重要配置:
1 .开发android 首先要下载android 的SDK即是软件开发工具包(外语首字母缩写:**SDK**、外语全称:**S*oftware*D*evelopment *K*it*)**一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合。要有了这些SDK后才能对我们的代码进行编译,进行效果呈现。如下图按照1,2的步骤打开SDK manager,这个很重要,以后管理SDK那些都是在这个里面进行。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e215476e0e.jpg)
首先必须要安装Tools下面的 Android SDK Tools , Platform-tools ,Build-tools ,Build-tools可安装最新的两三个就行了,我是应为从很早的版本一直到做到现在,所以有很多个版本。 本人建议Android 各个api下面之需要安装SDK platform, Samples for SDK,
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e215499c33.jpg)
下图是下载android 4.4.2版本的虚拟机镜像文件,用来建立android 虚拟机。建议下载一个4.4的版本,我一个5.0.1的版本,有这个连个虚拟机镜像文件就可以了。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e2154bac97.jpg)
下图是下载extras 额外资源,建议下载我勾选的这几个,特别是最后一个Intel虚拟机加速插件,下载完成后还需要到文件夹下面去安装它,只下载下来不去安装是没有用的。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e2154df9e4.jpg)
最后勾选上了自己要下载的文件之后,就点击右下角上面的安装包。如下图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e21551086a.jpg)
然后勾选接受许可,然后就静等下载。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e21552eadd.jpg)
下载完成后,SDKmanager中的安装成功的包前面会有一个红色的勾,如下图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42b39b51e.jpg)
2 . SDK和一些重要的文件包下载下来之后就可以打开自己的模拟器管理,为android 提供一个android虚拟机,如下流程图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c34a957.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c3681ec.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c391b16.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c3b2b52.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c3d2c6d.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c400504.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c430fb5.jpg)
通过以上的流程图就建好了一个供android开发进行效果展示的android虚拟机。用起来还是非常流畅的,我用的是studio2.0版本,对虚拟机进行了优化
3 . 开启了虚拟机之后就可以对虚拟机进行管理,点击SDK manager旁边的Android Device Monitor 设备管理器;
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c45bab5.jpg)
通过如下的设备管理器可以查看设备的文件管理器,如下图所示: 以后很多项目中都会用到这个文件管理器,特别是有关数据存储时,要到这里来查看数据库和文件存储是否成功。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c476c00.jpg)
下图是模拟器设置,可以模拟打电话,发短信等功能。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c497b18.jpg)
4 . 点击下面设置按钮,接下来就是要设置一些android studio的常用属性。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c4b3517.jpg)
这里是设置studio 的主题的,第一个是android studio 的经典主题,如下所示,Darcula, 这就是我正在用的黑色主题,也是最受欢迎的主题。建议使用这个主题,看久了也不会眼疲劳,非常优秀。 第3个步骤可以设置代码的大小。如下图所示:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c4cd082.jpg)
下面是勾选SDK的升级选项,建议都勾选上。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c4ebb97.jpg)
通过下图可以更改SDK的路径。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c515263.jpg)
通过下图可以设置android studio的快捷键设置,很多开发人员都是从java过来的,以前都是用的eclipse来开发软件,自然对Eclipse很熟悉,然后就可以通过如下图的第2步更改为我们熟悉的Eclipse快捷键。最重要的一点是android studio把eclipse的Alt+/更改为了Alt+Enter。这点非常重要,Alt+Enter的功能强大了很多。以后用起来就可知道了。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c531c15.jpg)
通过如下图,勾选上中间的那个,那样就可以通过 鼠标+鼠标滚轮 来动态改变代码中的大小。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c556e81.jpg)
勾选下面第2步中的这几个自动加载 并将import on paste 选为ALL。然后代码中就不用自己手动添加库了。android studio会自动添加,这样方便了开发。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c578c22.jpg)
下面是设置代码大小的设置,并且可以设置文体类型,不过需要save as 就是另存为另外一个自己定义的名字,本例中就是My,
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c593cbf.jpg)
下面就是设置工程的编码格式,现在服务器的编码都为UTF-8,所以这里设置为UTF-8,这里要看个人的项目中的需求。不过大环境下都是用UTF-8,所以这里建议用UTF-8.
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f42c5b1685.jpg)
总结:通过上面手把手的下载并配置android studio。那么刀已磨好了,接下来就该砍柴了,利器在手,相信接下来我们就用android studio开发出出色的android软件。
学习Android从0开始之背景篇-Android系统介绍
最后更新于:2022-04-01 11:26:16
## android系统介绍
**Android**(**安卓**),是一个以Linux为基础的开源移动设备操作系统,主要用于智能手机和平板电脑,由Google[](http://baike.baidu.com/view/105.htm)成立的Open Handset AllianceOHA,开放手持设备联盟)持续领导与开发中。Android已发布的最新版本为Android 6.0.1(M)。
Android系统最初由[安迪·鲁宾](http://baike.baidu.com/view/5897333.htm)(Andy Rubin)等人开发制作 ,最初开发这个系统的目的是创建一个数码相机的先进操作系统;但是后来发现市场需求不够大,加上智能手机市场快速成长,于是Android被改造为一款面向智能手机的操作系统。於2005年8月被美国科技企业Google收购。2007年11月,Google与84家制造商、开发商及电信营运商成立[开放手持设备联盟](http://baike.baidu.com/view/6576231.htm)来共同研发改良Android系统,随後,Google以Apache免费开放原始码许可证的授权方式,发布了Android的原码,让生产商推出搭载Android的智能手机,Android後来更逐渐拓展到平板电脑及其他领域上。
2015年末数据显示,仅正式推出6年的Android作业系统在市场占有率上已经超过70%,成为全球第一大智能手机操作系统。
其中百度百科对Android系统的进化历史进行了详细介绍,以下是链接
[点击打开链接查看android操作系统的详细介绍](http://baike.baidu.com/link?url=UG9qZhMvOHMZl8f-8vRKaryQl1VBYNzGpcpl2CnZMm8g9wIkI3WP1SFTM2QrZAPdZlrK5T53R53zcjAzua4Wu_)
通过对android 系统的了解,可以看出安卓操作系统的未来是非常光明,现在Android如日中天,平均每天有150万部的Android设备被激活,全球有超过二十亿的设 备安装Android操作系统。未来Android系统的应用绝不仅局限于手机产业,已迅速扩张到相 关领域,如平板电脑、车载系统等。随着Android 平台的扩张,引发了Android人才荒,目 前移动开发人才需求缺口将达百万,但符合条件的Android工程师还是少数。Android开发工 程师成为IT行业炙手可热的岗位之一。
上面一段话是在互联网培训机构对android人才缺口的评价,真是因为android系统的如日中天,人才紧缺,使得android开发人员的薪水水涨船高,市面上面出现了很多android开发的培训机构,使得android在人们之间的传播越来越快,android就变得越来越火。
**从Android系统的本身来分析Android系统为什么那么火,而其他系统为什么就没有火起来呢?**
Android相对其他操作系统Windows Phone和iOS等,具有非常大的优点和优势。在优势方面,Android平台首先就是其开放性,开发的平台允许任何移动终端厂商加入到Android中来,主要是开源,使得它是免费,这对硬件厂商是非常有优势的,第一:硬件厂商能剩下一大笔授权费。第二:硬件厂商能够根据自家商品的特点,对系统进行深度地址,使得自己的系统与原始android系统又有区别,使得自己的手机系统跟能使用地区人民是使用特点,比如国内就有做得好的自家android系统,小米的MIUI系统,华为的EMUI,魅族的Flyme等,这些国内厂商对原始andorid系统进行了定制,让人们用起来更方便,跟习惯。而且他们自己也剩下一大笔系统费用,使得他们卖的手机价格非常的亲民,从而最近几年使得小米和魅族及华为的手机占领了2000元以下90%以上的市场,让三星和HTC的份额急剧下降,并且最近HTC还传出退出手机市场的新闻。最主要的是android系统的开源,使得android开发人员不断的增加,市面上各种各样的嵌入式黑科技不断出现,也不断的推动着android系统源源不断的蓬勃发展,至少目前10年都看不到android衰退的迹象。
讲了android系统很多自身的优势,那么要有比较才能开出的真正的竞争力。从目前市场占有率来看,苹果的IOS是android的最大竞争对手。然而它的份额20%都不到,下图是最近网上对移动端操作系统的占有率的统计。如下图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e21529236c.jpg)
从上图可以看出苹果的ios系统是android的最大竞争对手,虽然占有率对android系统来说是碾压,但是从苹果对其他操作系统来说,还是很有优势的。从乔布斯离开这个世界开始,苹果的产品就缺少了创新,比如最近的ipad 和ipadmini非常的低迷,还有才推出的ipad pro虽然很大页很不错,但是在移动办公的市场上面早已有surface 占据着主导地位,更然人们失望的是苹果居然在ipad pro上面增加了一支笔,然而苹果推出ipad的初衷就是要让人们放弃使用笔。再者,苹果6s缺乏创新,在仅仅上市2个月就降价了好几百,而这是苹果手机历史上面还是首次出现。总结:苹果在产品上面出现了一些下坡路的现象,然而,ios系统只能用在苹果的移动设备上面,所以,苹果的移动设备买得不好,会直接影响ios系统的市场占有率。最后,android系统从5.0开始流畅度和Material Design的设计使得android系统用起来和看起来都是非常出色的。由此可以看出,ios在最近时期看不到压倒android系统的趋势。
接下来是android系统对其他系统的总结:
**市场份额大**:超80%,iOS不到13%; Windows Phone 不到4%;
**应用程序发展迅速:**Android应用商店最大的优势是,不对应用程序进行严格。在这一点上优于苹果。
**智能厂家助力:**世界很多智能手机厂家几乎都加入了Android阵营,并推出了一系列的Android智能机。终端越多,其市场潜力就越大。大部分厂家参与建立了Android平台技术联盟。
**Android价廉性能不低:**虽然Android平台的手机价廉,但是其性能却一点也不低廉。Android平台简单实用,无论是功能还是外观设计。
**机型多 硬件配置优:**每一家手机厂商都推出了各自的Android智能机,数不胜数。
**系统开源 利于创新:**苹果的自我封闭性,使其创新必须源自内部。而Android是开源的,允许修改,这在很大程度上容许厂家根据自己的硬件更改版本,从而能够更好的适应硬件,与之形成良好的结合。
**开发者最多:**国内开发者众多,本土化软件齐全
**方便开发:**Android平台提供给第三方开发商一个十分宽泛、自由的环境,会有多少新颖别致的软件会诞生。
**有利创业:**方便技术创业,投入很少,关键在创新、服务和技术。
Android开发中怎样使用cookieManager来管理cookie
最后更新于:2022-04-01 11:26:13
在项目开发中遇到一个问题,就是在登录界面向服务器发送登录请求后,然后就跳到一个与用户订阅有关的界面,然后,我想服务器发送的是正确的Url,用Log打印出返回结果,但是只有一个html的元素信息。通过对这个html的元素信息发的分析,与后台同事分析发现,我的url没有cookie 信息。在登录界面向服务器发送的登录验证信息,但是服务器没有存储相应的用户信息,就导致我登录进去后向服务器索要用户相关信息时,服务器判断是一个新用户,就返回了一个登录界面hxml给我。所以就出现了开头那个问题,那么怎样才能解决这个问题呢,在网上查了很多资料,本人发现了一个简单易用的方法,那就是用cookieManager来管理cookie。下面就是使用步骤;
1、首先 在android应用程序开始的activity中的oncreaty()方法中注册cookiemanager。如下:
~~~
<span style="font-size:18px;">//设置网络请求cookie
CookieSyncManager.createInstance(this);</span>
~~~
2、然后在到网络请求的那个类中设置如下 设置和获取cookie的方法
~~~
<span style="font-size:18px;"> protected String getCookie() {
CookieManager cookieManager = CookieManager.getInstance();
String cookie = cookieManager.getCookie("cookie");
if (cookie != null) {
return cookie;
} else {
return "";
}
}
protected void setCookie(String cookie) {
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setCookie("cookie", cookie);
}</span>
~~~
3、最后一步就在urlConnection.openConnectin()的后面设置如下方法:
~~~
uc = (HttpURLConnection) new URL(url + "?" + paramsStr.toString()).openConnection();
uc.setRequestProperty("Cookie", getCookie());
~~~
~~~
<pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'宋体';font-size:12.0pt;"><span style="background-color:#344134;">setCookies</span>(uc.getHeaderFields())<span style="color:#cc7832;">;</span>
~~~
~~~
~~~
好了到这里就完成了cookie的设置
3. 过期按需处理一下
附1:cookie的获取
~~~
response.headerFields = conn.getHeaderFields();
setCookies(response.headerFields);
~~~
~~~
/**
* 存储cookie
* @param headerFields
*/
protected void setCookies(Map<String, List<String>> headerFields) {
if (null == headerFields) {
return;
}
List<String> cookies = headerFields.get(COOKIES_KEY);
if (null == cookies) {
return;
}
for (String cookie : cookies) {
setCookie(cookie);
}
}
~~~
listView动态影藏显现列表项中的多项部分
最后更新于:2022-04-01 11:26:11
现在很多流行的APP要表达的内容都很多,很多app为了节省布局资源,在listview 的靠右的部分加入了“更多”之类的字样,提醒用户点击这里 可以看到跟多的内容,这样整个listview要表达的内容就少了,看起来就要简洁舒服。接下来我就为大家实现一下这个特效。先来看看效果,源码放在最后供下载参看:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e215251741.jpg)
效果看完了,那就来一步一步实现这个效果。
1.布局代码如下:
主布局:
~~~
<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:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/listView"
android:layout_gravity="center_horizontal" />
</LinearLayout>
~~~
单项布局:
~~~
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="100dp">
<ImageView
android:id="@+id/touXiang"
android:background="#f00"
android:layout_width="100dp"
android:layout_height="match_parent" />
<TextView
android:id="@+id/tv"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"/>
<Button
android:id="@+id/more"
android:layout_width="60dp"
android:layout_height="match_parent"
android:background="#ccc"
android:text="更多"/>
</LinearLayout>
<LinearLayout
android:id="@+id/moreLayout"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#aaa"
android:gravity="center|center_horizontal">
<ImageButton
android:id="@+id/dianZan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/shoucang"/>
</LinearLayout>
</LinearLayout>
~~~
效果如下:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e2152726ca.jpg)
2、主代码如下:
~~~
package com.example.my.learnactionbarexample;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ListView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private ListView lv;
private item item;
private ArrayList<item> items;
private int[] touxiang ={R.drawable.touxiang1,R.drawable.touxiang2,R.drawable.touxiang3,
R.drawable.touxiang4,R.drawable.touxiang5,R.drawable.touxiang6};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.listView);
items = new ArrayList<item>();
for (int i = 0; i < 6; i++) {
item = new item();
item.setName("名字:"+i);
item.setImg(touxiang[i]);
item.setIsDianZan(false);
items.add(item);
}
lv.setAdapter(new myAdapter(MainActivity.this,items));
}
}
~~~
自定义实体类如下:
~~~
package com.example.my.learnactionbarexample;
/**
* Created by Administrator on 2015/11/16.
*/
public class item {
public Integer getImg() {
return img;
}
public void setImg(Integer img) {
this.img = img;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getIsDianZan() {
return isDianZan;
}
public void setIsDianZan(Boolean isDianZan) {
this.isDianZan = isDianZan;
}
private Integer img;
private String name;
private Boolean isDianZan;
}
~~~
实体类主要是封装一些单项列表的数据,这个可以根据具体情况定义,我这拿点赞来做演示。
3、BaseAdapter的实现:
~~~
package com.example.my.learnactionbarexample;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;
/**
* Created by Administrator on 2015/11/16.
*/
public class myAdapter extends BaseAdapter {
private Context context;
private ArrayList<item> items;
private LayoutInflater inflater;
private Boolean[] isOpens = new Boolean[20];
public myAdapter(Context context, ArrayList<item> items) {
this.context = context;
this.items = items;
inflater = LayoutInflater.from(context);
for (int i = 0; i < items.size(); i++) {
isOpens[i] = false;
}
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null){
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.list_item,null);
holder.tv = (TextView) convertView.findViewById(R.id.tv);
holder.touXiang = (ImageView) convertView.findViewById(R.id.touXiang);
holder.more = (Button) convertView.findViewById(R.id.more);
holder.ll = (LinearLayout) convertView.findViewById(R.id.moreLayout);
holder.dianZan = (ImageButton) convertView.findViewById(R.id.dianZan);
convertView.setTag(holder);
}else {
holder = (ViewHolder) convertView.getTag();
}
holder.touXiang.setImageResource(items.get(position).getImg());
holder.tv.setText(items.get(position).getName());
if (items.get(position).getIsDianZan()){
holder.dianZan.setImageResource(R.drawable.dianzan1);
}else {
holder.dianZan.setImageResource(R.drawable.dianzan0);
}
holder.more.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isOpens[position]) {
isOpens[position] = false;
notifyDataSetChanged();
} else {
isOpens[position] = true;
for (int i = 0; i < getCount(); i++) {
if (i == position){
continue;
}
isOpens[i] = false;
}
notifyDataSetChanged();
}
}
});
if (isOpens[position]){
holder.ll.setVisibility(View.VISIBLE);
}else {
holder.ll.setVisibility(View.GONE);
}
holder.dianZan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (items.get(position).getIsDianZan()){
items.get(position).setIsDianZan(false);
}else {
items.get(position).setIsDianZan(true);
}
notifyDataSetChanged();
}
});
return convertView;
}
public final class ViewHolder{
private TextView tv;
public ImageView touXiang;
public Button more;
public LinearLayout ll;
public ImageButton dianZan;
}
}
~~~
[源码下载地址](http://download.csdn.net/detail/oqihaogongyuan/9273377)
android开发小经验总结
最后更新于:2022-04-01 11:26:09
1、TextView中的getTextSize返回值是以像素(px)为单位的,而setTextSize()是以sp为单位的。
所以如果直接用返回的值来设置会出错,解决办法是用setTextSize()的另外一种形式,可以指定单位:
~~~
setTextSize(int unit, int size)
TypedValue.COMPLEX_UNIT_PX : Pixels
TypedValue.COMPLEX_UNIT_SP : Scaled Pixels
TypedValue.COMPLEX_UNIT_DIP : Device Independent Pixels
~~~
2、在继承自View时,绘制bitmap时,需要将图片放到新建的drawable-xdpi中,否则容易出现绘制大小发生改变。
3、在文字中加下划线: textView.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
4、scrollView是继承自frameLayout,所以在使用LayoutParams时需要用frameLayout的。
5、在Android中几种网络编程的方式:
(1)针对TCP/IP的Socket、ServerSocket。
(2)针对UDP的DatagramSocket、DatagramPackage。这里需要注意的是,考虑到Android设备
通常是手持终端,IP都是随着上网进行分配的。不是固定的。因此开发也是有 一点与普通互联网应用有所差异的。
(3)针对直接URL的HttpURLConnection。
(4)Google集成了Apache HTTP客户端,可使用HTTP进行网络编程。针对HTTP,Google集成了Appache Http core和httpclient 4版本,因此特别注意Android不支持 httpclient 3.x系列,而且目前并不支持Multipart(MIME),需要自行添加httpmime.jar。
(5)使用Web Service。Android可以通过开源包如Jackson去支持Xmlrpc和Jsonrpc,另外也可以用Ksoap2去实现Webservice。
(6) 直接使用WebView视图组件显示网页。基于WebView 进行开发,Google已经提供了一个基于chrome-lite的Web浏览器,直接就可以进行上网浏览网页。
6、TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
这个是我们最常用的一个构造方法:
float fromXDelta:这个参数表示动画开始的点离当前View X坐标上的差值;
float toXDelta:这个参数表示动画结束的点离当前View X坐标上的差值;
float fromYDelta:这个参数表示动画开始的点离当前View Y坐标上的差值;
float toYDelta:这个参数表示动画开始的点离当前View Y坐标上的差值;
注:如果view在A(x,y)点,那么动画就是从B点(x+fromXDelta, y+fromYDelta)点移动到C 点(x+toXDelta,y+toYDelta)点。
7、Spinner不能用在dialog和tabhost中的解决办法。
8、eclipse关联JDK源码
(1)点 “window”-> “Preferences” -> “Java” -> “Installed JRES”
(2)此时”Installed JRES”右边是列表窗格,列出了系统中的 JRE 环境,选择你的JRE,然后点边上的 “Edit…”, 会出现一个窗口(Edit JRE)
(3)选中rt.jar文件的这一项:“c:\program files\java\jre_1.5.0_06\lib\rt.jar”点 左边的“+” 号展开
(4)展开后,可以看到“Source Attachment:(none)”,点这一项,点右边的按钮“Source Attachment…”, 选择你的JDK目录下的 “src.zip”文件。
9、Unable to open sync connection!报着个错误时,请把设置里的USB调试重启即可。
10、EditText设置光标位置问题
EditText中有一些预置文本的时候,想把光标调到最前面,一开始是使用的setSelection(0),结果发现在三星P1000上面有问题。经过研究发现需要先调用EditText.requestFocus(),再调用setSelection(0)。否则的话,在2.x的机器上有问题,但3.x上面是好着的。
11、Android中Home键被系统保留,无法象监听回退键一样用onKeyDown,但是可以根据按下home键时会触发的activity和view的一些事件来添加自己的处理代码.网上有人说可以用onAttachWindow来拦截Home键。
12、在用surfaceView渲染时,如果要想在需要时其中出现其他View,可以将surfaceView和其他View放在layout中,平常时可以将其他view隐藏。
13、使用android:imeOptinos可对Android自带的软键盘进行一些界面上的设置:
~~~
android:imeOptions="flagNoExtractUi" //使软键盘不全屏显示,只占用一部分屏幕。同时,这个属性还能控件软键盘右下角按键的显示内容,默认情况下为回车键
android:imeOptions="actionNone" //输入框右侧不带任何提示
android:imeOptions="actionGo" //右下角按键内容为'开始'
android:imeOptions="actionSearch" //右下角按键为放大镜图片,搜索
android:imeOptions="actionSend" //右下角按键内容为'发送'
android:imeOptions="actionNext" //右下角按键内容为'下一步'
android:imeOptions="actionDone" //右下角按键内容为'完成'
~~~
8、为TextView添加阴影
~~~
<style name="Overlay">
<item name="android:paddingLeft">2dip</item>
<item name="android:paddingBottom">2dip</item>
<item name="android:textColor">#ffffff</item>
<item name="android:textSize">12sp</item>
<item name="android:shadowColor">#00ff00</item>
<item name="android:shadowDx">5</item>
<item name="android:shadowDy">3</item>
<item name="android:shadowRadius">6</item>
</style>
<TextView android:id="@+id/test"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
style="@style/<span style="background-color: rgb(250, 250, 250); font-family: Helvetica,Tahoma, Arial, sans-serif; ">Overlay</span>"
android:text="test"
android:gravity="center" />
~~~
9、如何将TextView中的中文设置成粗体:
在xml文件中使用android:textStyle=”bold” 可以将英文设置成粗体,但是不能将中文设置成粗体,将中文设置成粗体的方法是:
~~~
TextView tv = (TextView)findViewById(R.id.TextView01);
TextPaint tp = tv.getPaint();
tp.setFakeBoldText(true);
~~~
Android中Display及DisplayMetrics理解
最后更新于:2022-04-01 11:26:07
Android已经提供DisplayMetircs类可以很方便的获取分辨率。下面简要介绍DisplayMetics类:
Andorid.util包下的DisplayMetrics类提供了一种关于显示的通用信息,如显示大小,分辨率和字体。
为了获取DisplayMetrics成员,首先初始化一个对象如下:
DisplayMetrics metrics =new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics;
注:构造函数DisplayMetrics不需要传递任何参数;调用getWindowManager()之后,会取得现有Activity的Handle,此时,getDefaultDisplay()方法将取得的宽高维度存放于DisplayMetrics对象中,而取得的宽高维度是以像素为单位(Pixel),“像素”所指的是“绝对像素”而非“相对像素”。
一般通用程序写法如下:
~~~
Display display = getWindow().getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics();
display.getMetrics(outMetrics);
~~~
这里很奇怪,和我们一般的理解不一样,这里是把测量的结果存放到outMetrics 中。outMetrics中就存放了,我们需要的屏幕的宽高数据,通过outMetrics. 后面就会出现很多有关屏幕信息的数据,例如常用的宽WidthPixels 和高 heightPixels;
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e215230aaf.jpg)
例如下面一句代码就是获取屏幕一半的宽度:
~~~
int with = outMetrics.widthPixels/2;
~~~
EditText怎样设置成下划线
最后更新于:2022-04-01 11:26:04
###EditText怎样设置成下滑线
android5.0以后开始兴起一片扁平化的UI风,现在android系统自带的edittext是一个带有凹凸感的框,不适合扁平化的设计,而且edittext的自带属性中没有设置样式的属性。那么我们想把edittext设置成一条下划线的形式,就只能重新自定义一个edittext,重写他的ondraw方法;代码如下:![微笑](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-18_569ca449c5105.gif)
~~~
public class LineEditText extends EditText {
private Paint paint;
public LineEditText(Context context, AttributeSet attrs) {
super(context, attrs);
//设置画笔的属性
paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
//可以自定义画笔的颜色,我这里设置成黑色
paint.setColor(Color.BLACK);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
/**canvas画直线,从左下角到右下角,this.getHeight()-2是获得父edittext的高度,但是必须要-2这样才能保证
* 画的横线在edittext上面,那样才看得见,如果不-2,你可以试一试看一下是否能看得见。
*/
canvas.drawLine(0, this.getHeight()-2, this.getWidth()-2, this.getHeight()-2, paint);
}
}
~~~
这样自定义的LineEditText就好了,那么就可以在xml中使用他了
~~~
<com.youle.bige.view.LineEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:layout_marginTop="20dp"
android:hint="@string/register_name"
android:singleLine="true"
android:background="@null"/>
~~~
请注意,上面有一句非常关键的代码,那就是
~~~
android:background="@null"
~~~
只有当background设置成null的时候才能生效。以下是效果图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e21521c13a.jpg)
看起来是不是非常的扁平化呢!好了自定义edittext实现下划线!
希望对各位的学习和工作有所帮助!谢谢!
如何解决listView或scrollView+viewpager手势冲突的问题
最后更新于:2022-04-01 11:26:02
因为我在项目中遇到了这样一个问题:我的主页面是一个scrollview,里面包含了一个横向显示图片的listview,在滑动横向listview的时候scrollview也在微微上下滑动,此时的横向listview滑动起来也是出现非常卡顿的情况。因此我百度看了很多资料,很多都讲了一大篇的理论,看得头晕眼花。我后来总结了一下,实际怎么解决这样的问题;
首先,每个listview或则scrollview的源代码中有这么一段代码,如下:
~~~
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
/*
* This method JUST determines whether we want to intercept the motion.
* If we return true, onMotionEvent will be called and we do the actual
* scrolling there.
*/
/*
* Shortcut the most recurring case: the user is in the dragging
* state and he is moving his finger. We want to intercept this
* motion.
*/
final int action = ev.getAction();
if ((action == MotionEvent.ACTION_MOVE) && (mIsBeingDragged)) {
return true;
}
/*
* Don't try to intercept touch if we can't scroll anyway.
*/
if (getScrollY() == 0 && !canScrollVertically(1)) {
return false;
}
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_MOVE: {
/*
* mIsBeingDragged == false, otherwise the shortcut would have caught it. Check
* whether the user has moved far enough from his original down touch.
*/
/*
* Locally do absolute value. mLastMotionY is set to the y value
* of the down event.
*/
final int activePointerId = mActivePointerId;
if (activePointerId == INVALID_POINTER) {
// If we don't have a valid id, the touch down wasn't on content.
break;
}
final int pointerIndex = ev.findPointerIndex(activePointerId);
if (pointerIndex == -1) {
Log.e(TAG, "Invalid pointerId=" + activePointerId
+ " in onInterceptTouchEvent");
break;
}
final int y = (int) ev.getY(pointerIndex);
final int yDiff = Math.abs(y - mLastMotionY);
if (yDiff > mTouchSlop) {
mIsBeingDragged = true;
mLastMotionY = y;
initVelocityTrackerIfNotExists();
mVelocityTracker.addMovement(ev);
if (mScrollStrictSpan == null) {
mScrollStrictSpan = StrictMode.enterCriticalSpan("ScrollView-scroll");
}
final ViewParent parent = getParent();
if (parent != null) {
parent.requestDisallowInterceptTouchEvent(true);
}
}
break;
}
case MotionEvent.ACTION_DOWN: {
final int y = (int) ev.getY();
if (!inChild((int) ev.getX(), (int) y)) {
mIsBeingDragged = false;
recycleVelocityTracker();
break;
}
/*
* Remember location of down touch.
* ACTION_DOWN always refers to pointer index 0.
*/
mLastMotionY = y;
mActivePointerId = ev.getPointerId(0);
initOrResetVelocityTracker();
mVelocityTracker.addMovement(ev);
/*
* If being flinged and user touches the screen, initiate drag;
* otherwise don't. mScroller.isFinished should be false when
* being flinged.
*/
mIsBeingDragged = !mScroller.isFinished();
if (mIsBeingDragged && mScrollStrictSpan == null) {
mScrollStrictSpan = StrictMode.enterCriticalSpan("ScrollView-scroll");
}
break;
}
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
/* Release the drag */
mIsBeingDragged = false;
mActivePointerId = INVALID_POINTER;
recycleVelocityTracker();
if (mScroller.springBack(mScrollX, mScrollY, 0, 0, 0, getScrollRange())) {
postInvalidateOnAnimation();
}
break;
case MotionEvent.ACTION_POINTER_UP:
onSecondaryPointerUp(ev);
break;
}
/*
* The only time we want to intercept motion events is if we are in the
* drag mode.
*/
return mIsBeingDragged;
}
~~~
其实大家只要知道这个方法是事件拦截就行了,关于他的具体机制去看看这篇博客[点击打开链接](http://blog.csdn.net/chunqiuwei/article/details/41084921),写得很详细,好了我们接下来就要在我们的自定义组件中覆写这个方法就行了,一切就是这么简单。我实现的是在scrollview中嵌套一个横向滑动的ListView,先来看看我复写的ScrollView:
~~~
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView;
public class MyScrollView extends ScrollView {
private float mDX, mDY, mLX, mLY;
int mLastAct = -1;
boolean mIntercept = false;
public MyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public MyScrollView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN :
mDX = mDY = 0f;
mLX = ev.getX();
mLY = ev.getY();
break;
case MotionEvent.ACTION_MOVE :
final float curX = ev.getX();
final float curY = ev.getY();
mDX += Math.abs(curX - mLX);
mDY += Math.abs(curY - mLY);
mLX = curX;
mLY = curY;
if (mIntercept && mLastAct == MotionEvent.ACTION_MOVE) {
return false;
}
if (mDX > mDY) {
mIntercept = true;
mLastAct = MotionEvent.ACTION_MOVE;
return false;
}
}
mLastAct = ev.getAction();
mIntercept = false;
return super.onInterceptTouchEvent(ev);}
~~~
好了,接下来我为大家详细讲解这个方法的具体含义;首先,这方法是View的事件拦截,如果返回true的话,说明触摸事件(包括DOWN,MOVE,UP)不会往下面传递,就在该view上面处理了,怎么理解呢?例如我的ScrollView是A ,横向的ListView是B, B包含在A中,B是A的子view。那么触摸事件是先让A判断了,然后再传给B。如果在A中实现上面那个事件拦截事件,在特定情况下才将事件传给B处理,如果不是B的事件,那个A就不会传给B,这样A和B就分离开了。
其中
~~~
if (mDX > mDY)
{
mIntercept = true;
mLastAct = MotionEvent.ACTION_MOVE;
return false;
}
~~~
就是判断 手指在屏幕上面滑动的 方向,这里判断出是在横向上面滑动,那么就返回false,表示不拦截这个事件,这个事件就会传到B,让B来处理这个事件,刚好B是横向的Listview,就会对横向方向的滑动事件进行处理。如果手指滑动的方向不是横向,就supper父类的默认拦截事件。这里就相当于给拦截事件增加了一些判断,而增加的判断无非就是手指的滑动方向,ListView或ScrollView都是竖向的,而横向的ListView和横向滑动的Veiwpager是横向的,不管是谁嵌套谁,只需要在重写第一个View,把它的
~~~
public boolean onInterceptTouchEvent(MotionEvent ev)
~~~
方法重新写一下,就可以解决手势冲突的问题!
希望对大家的学习和工作有所帮助,谢谢!
自定义android圆形ImageView
最后更新于:2022-04-01 11:26:00
### 使用自定义ImageView实现圆形Imageview
android自带的Imageview是只能调节它的宽高,不能实现一些圆形的Imageview,而很多社交软件的头像或者一些小图形都是圆形的,看起来非常美观,接下来,我就为大家实现一个自定义的imageview,能够实现圆形图案。
~~~
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;
/**
* 自定义的圆形ImageView,可以直接当组件在布局中使用。
*/
@SuppressLint("DrawAllocation")
public class CircleImageView extends ImageView{
private Paint paint ;
public CircleImageView(Context context) {
this(context,null);
}
public CircleImageView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
paint = new Paint();
}
/**
* 绘制圆形图片
* @author se7en
*/
@SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable();
if (drawable != null) {
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
Bitmap b = getCircleBitmap(bitmap, 14);
int z = Math.min(b.getWidth(),b.getHeight());
final Rect rectSrc = new Rect(0, 0, z , z);
final Rect rectDest = new Rect(0,0,getWidth(),getHeight());
paint.reset();
canvas.drawBitmap(b, rectSrc, rectDest, paint);
} else {
super.onDraw(canvas);
}
}
/**
* 获取圆形图片方法
* @param bitmap
* @param pixels
* @return Bitmap
* @author se7en
*/
private Bitmap getCircleBitmap(Bitmap bitmap, int pixels) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
int min = Math.min(bitmap.getWidth(),bitmap.getHeight());
final Rect rect = new Rect(0, 0, min , min);
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawCircle(min / 2, min / 2, min / 2, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
}
~~~
要说明的有如下几点:
1. 注意导入包的选择,请看清楚我导的那具体的包,导错了,我不保证能不能实现;
1. int z = Math.min(b.getWidth(),b.getHeight()); 这句代码非常重要,如果你原始图片的宽和长不相等的话,这句代码就能保证画出来的是一个圆。而不是那种一个圆被砍了一刀,我不知道那种图形叫什么名字,暂且这样描述;
1.
~~~
int min = Math.min(bitmap.getWidth(),bitmap.getHeight());
~~~
~~~
final Rect rect = new Rect(0, 0, min , min);
~~~
~~~
canvas.drawCircle(min / 2, min / 2, min / 2, paint); 这3句代码也是和第2点差不多,能够保证画出来的圆是一个填充满的圆,而不是椭圆或者少了一点(像是被砍了一刀)的圆;
~~~
1.
~~~
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));这句代码是为paint设置绘图模式,具体含义如下:
~~~
~~~
setXfermode设置两张图片相交时的模式。
在正常的情况下,
~~~
就是在已有的图像上绘图将会在其上面添加一层新的形状。如果新的Paint是完全不透明的,那么它将完全遮挡住下面的Paint;如果它是部分透明的,那么它将会被染上下面的颜色。
而setXfermode就可以来解决这个问题 .
canvas原有的图片可以理解为背景,就是dst;
新画上去的图片可以理解为前景,就是src。请看如下图表:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e2151bff3a.jpg)
自定好了CircleImageView 后就可以在xml中使用了,用起来非常的方便,大家也可以把这个代码封装起来,以后直接用就可以了;
xml的代码如下:
~~~
<pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ray_menu"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/menu_bg"
android:orientation="vertical"
android:gravity="center" >
<com.youle.bige.view.CircleImageView
android:id="@+id/person_title_image"
android:layout_width="200dp"
android:layout_height="200dp"
android:src="@drawable/zhoujielun" />
</LinearLayout>
~~~
效果如下:
1. ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e2151e57b8.jpg)
现在看起来就非常漂亮和美观了;好了下班吃饭了!88
SimpleAdapter的使用
最后更新于:2022-04-01 11:25:57
android中为我们提供了3种adapter来为各种各样的list来适配数据,其ArrayAdapter 对只有纯字符列表的list适应,如果遇到list的每个item都有添加几项的情况,如下图,有头像,名字,作品,人气等,那么ArrayAdapter就不是适用了,就可以使用SimpleAdapter 了,而baseAdapter 用起来对初学者有点难,建议使用simpleAdapter。首先来看整体的布局文件:
~~~
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
style="?android:attr/textAppearanceLarge"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:text="@string/tab_author" />
<ListView
android:id="@+id/author_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none">
</ListView>
</LinearLayout>
~~~
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e2151679e4.jpg)
其中定义了一个列表的标题,下面定义了一个列表,列表中的scroolbars=“none”是隐藏滚动条。接下来就要为每个item设置布局了,分别有头像,作者,作品,人气。
~~~
<?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="wrap_content"
android:background="#FFFFFFFF"
android:orientation="vertical" >
<View
android:layout_width="match_parent"
android:layout_height="7dp"
android:background="#FFdddddd" >
</View>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<ImageView
android:id="@+id/list_item_author_touxiang"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_margin="10dp"
android:src="@drawable/icon_stub" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginBottom="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp"
android:orientation="vertical" >
<TextView
android:id="@+id/list_item_author"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:text="作者"
android:textSize="18sp"/>
<TextView
android:id="@+id/list_item_author_zuopin"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="bottom"
android:text="作品:"
android:textColor="#FF777777" />
<TextView
android:id="@+id/list_item_author_renqi"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="bottom"
android:text="人气:"
android:textColor="#FF777777" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
~~~
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e215186e93.jpg)
然后我们就可以在java代码中编写程序,来实现一个漂亮的列表;
~~~
public class AuthorListFragment extends Fragment {
private ListView listView;
private View authorList;
private String[] authors = {"周杰伦","王力宏","郭敬明",
"周杰伦","王力宏","郭敬明",
"周杰伦","王力宏","郭敬明"};
private String[] zuopin = {"《搞笑》《东风破》","《落叶归根》","《围城》《小时代》",
"《搞笑》《东风破》","《落叶归根》","《围城》《小时代》",
"《搞笑》《东风破》","《落叶归根》","《围城》《小时代》"};
private String[] renqi = {"9999","12345","98687","9999","12345","98687","9999","12345","98687"};
private int[] touxiang = {R.drawable.zhoujielun,R.drawable.wanglihong,R.drawable.guojingm,
R.drawable.zhoujielun,R.drawable.wanglihong,R.drawable.guojingm,
R.drawable.zhoujielun,R.drawable.wanglihong,R.drawable.guojingm};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
authorList = inflater.inflate(R.layout.author_list, container,false);
viewHolder();
List<HashMap<String,Object>> data = new ArrayList<HashMap<String,Object>>();
for(int i = 0; i < authors.length; i++){
HashMap<String,Object> map = new HashMap<String,Object>();
map.put("touxiang", touxiang[i]);
map.put("name", authors[i]);
map.put("zuopin", "作品:"+zuopin[i]);
map.put("renqi", "人气:"+renqi[i]);
data.add(map);
}
SimpleAdapter adapter = new SimpleAdapter(getActivity(), data, R.layout.author_list_item, new String[]{"touxiang","name","zuopin","renqi"},
new int[]{R.id.list_item_author_touxiang,
R.id.list_item_author,
R.id.list_item_author_zuopin,
R.id.list_item_author_renqi});
listView.setAdapter(adapter);
return authorList;
}
private void viewHolder() {
listView = (ListView) authorList.findViewById(R.id.author_list);
}
}
~~~
我这是在一个fragment里面实现的,大家可以在Activity里面试试,都是能 行的。我在真机上面运行的,我截个图给大家看看:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-25_571e21519ae61.jpg)
到此为止,simpleadapter就能实现很漂亮的列表界面。 祝大家开开兴兴,每天进步一点!88
实现横向listview(HorizontalListview)
最后更新于:2022-04-01 11:25:55
直接更改adapte实现横向listview,老外实现的吧,其他代码和平时的listview一样。
~~~
public class HorizontalListView extends AdapterView<ListAdapter> {
public boolean mAlwaysOverrideTouch = true;
protected ListAdapter mAdapter;
private int mLeftViewIndex = -1;
private int mRightViewIndex = 0;
protected int mCurrentX;
protected int mNextX;
private int mMaxX = Integer.MAX_VALUE;
private int mDisplayOffset = 0;
protected Scroller mScroller;
private GestureDetector mGesture;
private Queue<View> mRemovedViewQueue = new LinkedList<View>();
private OnItemSelectedListener mOnItemSelected;
private OnItemClickListener mOnItemClicked;
private OnItemLongClickListener mOnItemLongClicked;
private boolean mDataChanged = false;
public HorizontalListView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
private synchronized void initView() {
mLeftViewIndex = -1;
mRightViewIndex = 0;
mDisplayOffset = 0;
mCurrentX = 0;
mNextX = 0;
mMaxX = Integer.MAX_VALUE;
mScroller = new Scroller(getContext());
mGesture = new GestureDetector(getContext(), mOnGesture);
}
@Override
public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener listener) {
mOnItemSelected = listener;
}
@Override
public void setOnItemClickListener(AdapterView.OnItemClickListener listener){
mOnItemClicked = listener;
}
@Override
public void setOnItemLongClickListener(AdapterView.OnItemLongClickListener listener) {
mOnItemLongClicked = listener;
}
private DataSetObserver mDataObserver = new DataSetObserver() {
@Override
public void onChanged() {
synchronized(HorizontalListView.this){
mDataChanged = true;
}
invalidate();
requestLayout();
}
@Override
public void onInvalidated() {
reset();
invalidate();
requestLayout();
}
};
@Override
public ListAdapter getAdapter() {
return mAdapter;
}
@Override
public View getSelectedView() {
//TODO: implement
return null;
}
@Override
public void setAdapter(ListAdapter adapter) {
if(mAdapter != null) {
mAdapter.unregisterDataSetObserver(mDataObserver);
}
mAdapter = adapter;
mAdapter.registerDataSetObserver(mDataObserver);
reset();
}
private synchronized void reset(){
initView();
removeAllViewsInLayout();
requestLayout();
}
@Override
public void setSelection(int position) {
//TODO: implement
}
private void addAndMeasureChild(final View child, int viewPos) {
LayoutParams params = child.getLayoutParams();
if(params == null) {
params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
}
addViewInLayout(child, viewPos, params, true);
child.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST),
MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST));
}
@Override
protected synchronized void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if(mAdapter == null){
return;
}
if(mDataChanged){
int oldCurrentX = mCurrentX;
initView();
removeAllViewsInLayout();
mNextX = oldCurrentX;
mDataChanged = false;
}
if(mScroller.computeScrollOffset()){
int scrollx = mScroller.getCurrX();
mNextX = scrollx;
}
if(mNextX <= 0){
mNextX = 0;
mScroller.forceFinished(true);
}
if(mNextX >= mMaxX) {
mNextX = mMaxX;
mScroller.forceFinished(true);
}
int dx = mCurrentX - mNextX;
removeNonVisibleItems(dx);
fillList(dx);
positionItems(dx);
mCurrentX = mNextX;
if(!mScroller.isFinished()){
post(new Runnable(){
@Override
public void run() {
requestLayout();
}
});
}
}
private void fillList(final int dx) {
int edge = 0;
View child = getChildAt(getChildCount()-1);
if(child != null) {
edge = child.getRight();
}
fillListRight(edge, dx);
edge = 0;
child = getChildAt(0);
if(child != null) {
edge = child.getLeft();
}
fillListLeft(edge, dx);
}
private void fillListRight(int rightEdge, final int dx) {
while(rightEdge + dx < getWidth() && mRightViewIndex < mAdapter.getCount()) {
View child = mAdapter.getView(mRightViewIndex, mRemovedViewQueue.poll(), this);
addAndMeasureChild(child, -1);
rightEdge += child.getMeasuredWidth();
if(mRightViewIndex == mAdapter.getCount()-1) {
mMaxX = mCurrentX + rightEdge - getWidth();
}
if (mMaxX < 0) {
mMaxX = 0;
}
mRightViewIndex++;
}
}
private void fillListLeft(int leftEdge, final int dx) {
while(leftEdge + dx > 0 && mLeftViewIndex >= 0) {
View child = mAdapter.getView(mLeftViewIndex, mRemovedViewQueue.poll(), this);
addAndMeasureChild(child, 0);
leftEdge -= child.getMeasuredWidth();
mLeftViewIndex--;
mDisplayOffset -= child.getMeasuredWidth();
}
}
private void removeNonVisibleItems(final int dx) {
View child = getChildAt(0);
while(child != null && child.getRight() + dx <= 0) {
mDisplayOffset += child.getMeasuredWidth();
mRemovedViewQueue.offer(child);
removeViewInLayout(child);
mLeftViewIndex++;
child = getChildAt(0);
}
child = getChildAt(getChildCount()-1);
while(child != null && child.getLeft() + dx >= getWidth()) {
mRemovedViewQueue.offer(child);
removeViewInLayout(child);
mRightViewIndex--;
child = getChildAt(getChildCount()-1);
}
}
private void positionItems(final int dx) {
if(getChildCount() > 0){
mDisplayOffset += dx;
int left = mDisplayOffset;
for(int i=0;i<getChildCount();i++){
View child = getChildAt(i);
int childWidth = child.getMeasuredWidth();
child.layout(left, 0, left + childWidth, child.getMeasuredHeight());
left += childWidth;
}
}
}
public synchronized void scrollTo(int x) {
mScroller.startScroll(mNextX, 0, x - mNextX, 0);
requestLayout();
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
boolean handled = super.dispatchTouchEvent(ev);
handled |= mGesture.onTouchEvent(ev);
return handled;
}
protected boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
synchronized(HorizontalListView.this){
mScroller.fling(mNextX, 0, (int)-velocityX, 0, 0, mMaxX, 0, 0);
}
requestLayout();
return true;
}
protected boolean onDown(MotionEvent e) {
mScroller.forceFinished(true);
return true;
}
private OnGestureListener mOnGesture = new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDown(MotionEvent e) {
return HorizontalListView.this.onDown(e);
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
return HorizontalListView.this.onFling(e1, e2, velocityX, velocityY);
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
synchronized(HorizontalListView.this){
mNextX += (int)distanceX;
}
requestLayout();
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
for(int i=0;i<getChildCount();i++){
View child = getChildAt(i);
if (isEventWithinView(e, child)) {
if(mOnItemClicked != null){
mOnItemClicked.onItemClick(HorizontalListView.this, child, mLeftViewIndex + 1 + i, mAdapter.getItemId( mLeftViewIndex + 1 + i ));
}
if(mOnItemSelected != null){
mOnItemSelected.onItemSelected(HorizontalListView.this, child, mLeftViewIndex + 1 + i, mAdapter.getItemId( mLeftViewIndex + 1 + i ));
}
break;
}
}
return true;
}
@Override
public void onLongPress(MotionEvent e) {
int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
View child = getChildAt(i);
if (isEventWithinView(e, child)) {
if (mOnItemLongClicked != null) {
mOnItemLongClicked.onItemLongClick(HorizontalListView.this, child, mLeftViewIndex + 1 + i, mAdapter.getItemId(mLeftViewIndex + 1 + i));
}
break;
}
}
}
private boolean isEventWithinView(MotionEvent e, View child) {
Rect viewRect = new Rect();
int[] childPosition = new int[2];
child.getLocationOnScreen(childPosition);
int left = childPosition[0];
int right = left + child.getWidth();
int top = childPosition[1];
int bottom = top + child.getHeight();
viewRect.set(left, top, right, bottom);
return viewRect.contains((int) e.getRawX(), (int) e.getRawY());
}
};
}
~~~
viewpager
最后更新于:2022-04-01 11:25:53
ViewPage来源于android -support.v4
1.
什么是viewPage?
ViewPage 类似于ListView 用于显示多个View集合. 支持页面左右滑动.
1.
如何使用viewPage以及需要注意点?
ViewPage 需要Adapter:
PagerAdapter 有四个重要方法:
(1) void destroyItem(ViewGroup container, int position, Object object): 销毁
(2)Object instantiateItem(ViewGroup container, int position) : 添加View
(3) int getCount() : 获得View总是
(4) boolean isViewFromObject(View view, Object obj) : View比较
监听器: setOnPageChangeListener :页面发生改变
(1) void onPageSelected(int position) :View进行切换 :position 新的页面位置
(2) void onPageScrolled(int arg0, float arg1, int arg2) :页面正在滚动的时候[滑动偏移信息],回调
(3) void onPageScrollStateChanged(int arg0) :页面状态发生变化的时候,回调
ListView 因为使用相同的View,所以采用复用。
而ViewPage ,是基于View ,子类有许多不同,所以要注销.
~~~
public Object instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub
View view= imageVisws.get(position % images.length);
container.removeView(view); // 重复加入会引起异常
container.addView(view);
return view;
~~~
导致异常:java.lang.IllegalStateException The specified child already has a parent. You must call removeView()
原因: 被加入的View 有父类, 所以添加到另外一个集合中之前,必须清除父类.
}
前言
最后更新于:2022-04-01 11:25:51
> 原文出处:[学习Android从0开始](http://blog.csdn.net/column/details/android-0-100.html)
作者:[oqihaogongyuan](http://blog.csdn.net/oqihaogongyuan)
**本系列文章经作者授权在看云整理发布,未经作者允许,请勿转载!**
# 学习Android从0开始
> 通过本人学习android的经历,从0开始详细讲解Android的原理,由浅入深,由简到难,一步一步的解剖android,从而使别人能够由菜鸟到精通,也是自己知识的总结,通过博客专栏更能够把自己的经验总结分享给更多需要帮助的人。