1. 设置TextView文字居中的2种方法
在xml文件设置:android:gravity="center"
在程序中设置:textView.setGravity(Gravity.CENTER);
2. android:gravity和android:layout_gravity的区别
前者是对控件内部操作,后者是对整个控件操作。例如:android:gravity="center"会使TextView中的文字居中,android:layout_gravity="center"会使Textview控件在整个布局中居中。很容易理解,出现layout就是控件对整个布局的操作。
另外,在Android布局中涉及的一些属性这篇文章里形象地说明了gravity、margin、padding属性的含义,忘记的时候可以看看。
3. java代码中设置margin和padding
参考资料:
Android如何在java代码中设置margin。
我们平常可以直接在xml里设置margin,如:
<ImageView android:layout_margin="5dip" android:src="@drawable/image" />
但是有些情况下,需要在java代码里来写,与设置padding不同,View本身没有setMargin方法,怎么办呢?通过查阅发现android.view.ViewGroup.MarginLayoutParams有个方法setMargins(left, top, right, bottom),其直接的子类有: FrameLayout.LayoutParams, LinearLayout.LayoutParams and RelativeLayout.LayoutParams,所以在java代码中设置pargin的方法如下
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(10, 20, 30, 40);//单位为px,依次是左、上、右、下
imageView.setLayoutParams(lp);
在java代码中设置madding就很简单了
btn.setPadding(10,20,30,40);//单位为px,依次是左、上、右、下
4. 尺寸单位
在页面布局的时候,经常会设置容器的长度,但是到底该使用哪个作为长度的单位而懊恼。在Android中支持的描述大小区域的类型有以下几种:
- px(pixels)像素:不同的设备显示效果相同,一般我们HVGA代表320x480像素。
- dip(device independent pixels)设备独立像素:这个和设备硬件有关,一般为了支持WCGA、HVGA和QVGA推荐使用这个,不依赖于像素,等同于dp。
- sp(scaled pixels—best for text size)带比例的像素。
- pt(points)磅:1pt = 1/72英寸
- in(inches)英寸。
- mm(millimeters)毫米。
px就是像素,如果用px,就会用实际像素画,比如用画一条长度为240px的横线,在480宽的模拟器上看是1/2的屏宽,而在320宽的模拟器上看就是2/3的屏宽。
dip就是把屏幕的高分成480分,宽分成320分。比如你做一条160dip的横线,无论你在320还480的模拟器上,都是1/2的屏宽。
备注: 根据google的推荐,像素统一使用dip,字体统一使用sp。
在写Android程序过程中可能会碰到px与dip相互转换的情况,为此推荐在Android工程中增加一个类DensityUtils,里面只有两个静态方法。
import android.content.Context;
public class DensityUtils
{
/**
* 根据手机的分辨率从 dip转成为px(像素)
*/
public static int dip2px(Context context, float dpValue)
{
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 根据手机的分辨率从 px(像素)转成 dip
*/
public static int px2dip(Context context, float pxValue)
{
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}
5. 设置全屏、隐藏标题、横屏/竖屏
设置全屏:在Activity的onCreate()中的setContentView()调用之前,添加如下代码
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
<activity
android:name="......"
android:screenOrientation="landscape" >
</activity>
screenOrientation 用来指定Activity的在设备上显示的方向,每个值代表如下含义,博主除了lanscape和portrait以外其他还没有试过,权当mark一下:
- unspecified:默认值,由系统来判断显示方向,判定的策略是和设备相关的,所以不同的设备会有不同的显示方向
- landscape:横屏显示
- portrait:竖屏显示
- user:用户当前首选的方向
- behind:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
- sensor:由物理的感应器来决定,如果用户旋转设备这屏幕会横竖屏切换
- nosensor:忽略物理感应器,这样就不会随着用户旋转设备而更改了 ( "unspecified"设置除外 )
6. EditText的inputType属性值
android中inputType属性在EditText输入值时启动的虚拟键盘的风格有着重要的作用。这也大大的方便的操作。有时需要虚拟键盘只为字符或只为数字。所以inputType尤为重要。
文本类型,多为大写、小写和数字符号。
android:inputType="none"
android:inputType="text"
android:inputType="textCapCharacters" 字母大写
android:inputType="textCapWords" 首字母大写
android:inputType="textCapSentences" 仅第一个字母大写
android:inputType="textAutoCorrect" 自动完成
android:inputType="textAutoComplete" 自动完成
android:inputType="textMultiLine" 多行输入
android:inputType="textImeMultiLine" 输入法多行(如果支持)
android:inputType="textNoSuggestions" 不提示
android:inputType="textUri" 网址
android:inputType="textEmailAddress" 电子邮件地址
android:inputType="textEmailSubject" 邮件主题
android:inputType="textShortMessage" 短讯
android:inputType="textLongMessage" 长信息
android:inputType="textPersonName" 人名
android:inputType="textPostalAddress" 地址
android:inputType="textPassword" 密码
android:inputType="textVisiblePassword" 可见密码
android:inputType="textWebEditText" 作为网页表单的文本
android:inputType="textFilter" 文本筛选过滤
android:inputType="textPhonetic" 拼音输入
android:inputType="none"
android:inputType="text"
android:inputType="textCapCharacters" 字母大写
android:inputType="textCapWords" 首字母大写
android:inputType="textCapSentences" 仅第一个字母大写
android:inputType="textAutoCorrect" 自动完成
android:inputType="textAutoComplete" 自动完成
android:inputType="textMultiLine" 多行输入
android:inputType="textImeMultiLine" 输入法多行(如果支持)
android:inputType="textNoSuggestions" 不提示
android:inputType="textUri" 网址
android:inputType="textEmailAddress" 电子邮件地址
android:inputType="textEmailSubject" 邮件主题
android:inputType="textShortMessage" 短讯
android:inputType="textLongMessage" 长信息
android:inputType="textPersonName" 人名
android:inputType="textPostalAddress" 地址
android:inputType="textPassword" 密码
android:inputType="textVisiblePassword" 可见密码
android:inputType="textWebEditText" 作为网页表单的文本
android:inputType="textFilter" 文本筛选过滤
android:inputType="textPhonetic" 拼音输入
数值类型
android:inputType="number" 数字
android:inputType="numberSigned" 带符号数字格式
android:inputType="numberDecimal" 带小数点的浮点格式
android:inputType="phone" 拨号键盘
android:inputType="datetime" 时间日期
android:inputType="date" 日期键盘
android:inputType="time" 时间键盘
android:inputType="number" 数字
android:inputType="numberSigned" 带符号数字格式
android:inputType="numberDecimal" 带小数点的浮点格式
android:inputType="phone" 拨号键盘
android:inputType="datetime" 时间日期
android:inputType="date" 日期键盘
android:inputType="time" 时间键盘
7. android:ems
看别人写的代码里EditText或TextView有android:ems="10"这样的属性,在网上查有人说这是使EditText或TextView的宽度为10个字符,控件显示的长度就为10个字符的长度,超出的部分将不显示。但是博主自己试了以后发现不是这样,后来在
http://www.eoeandroid.com/thread-314439-1-1.html这个帖子15楼的回复里,发现有人说::android:ems="10" 是指字符的长度为10M大小
。
![惊讶](http://static.blog.csdn.net/xheditor/xheditor_emot/default/ohmy.gif)
因为官网上
TextView的ems属性说明里,规定取值只能为整数,所以如果真表示M,至少也要是1M,博主就没有实验。但是至少可以肯定,
android:ems="10"不会使EditText或TextView的宽度只为10个字符。
8. 删除布局中的组件
博主在删除LinearLayout的子组件时,用到过两种方法
- linearLayout.removeView(View view):参数view就是要移除的子组件。
- linearLayout.removeViewAt(int index):参数index就是要移除的子组件在LinearLayout中的序号,特别要注意序号是从0标起,如果令count=linearLayout.getChildCount();,那么index只能取0到count-1。
其实,这两种方法是继承自ViewGroup,所以只要是ViewGroup的子类,都可以用这两种方法,这里附上View、ViewGroup的继承图。
博主看了一下官方API,发现ViewGroup除了这两种方法,还有removeAllViews ()、removeAllViewsInLayout ()、removeViewInLayout (View view)、removeViews (int start, int count)、removeViewsInLayout (int start, int count)。
9. TableLayout
参考资料:
使用TableLayout应该注意的地方。
TableLayout和平时在网页上见到的Table不同,它没有边框,是
由多个TableRow对象组成,每个TableRow可以有0个或多个单元格,每个单元格就是一个View。
这些单元格不能设置layout_width(默认是fill_parent),只有高度layout_height可以自定义(默认是wrap_content)。
相关常用属性
- android:shrinkColumns="1,2":列1、2的单元格在纵向上可伸缩,相当于自动换行。特别注意,TableLayout列的下标是从0开始的。
- android:stretchColumns="0,3":列0、3的单元格在横向上可伸缩。
- android:collapseColumns="1":列1的单元格被缩进,相当于隐藏。以上三种都是TableLayout的属性。
- android:layout_span="2":某单元格在横向上伸展2倍。
- android:layout_column="2":某单元格固定位置在列2上。
这些属性的具体应用可以参照
Android中TableLayout中的布局。
分割线
因为TableLayout没有边框,想实现边框,可以在TableRow或单元格间设置android:layout_margin**和android:background。
以博主自己写的App为例,表头的填充色为"#666666",为了让分割线为"#8d976f",layout中表头所在的TableRow如下
<TableRow
android:id="@+id/tableRow1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
<strong>android:background="#8d976f" </strong>>
<TextView
android:id="@+id/tvTitleNo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
<strong>android:background="#666666"</strong>
android:textColor="#ffffff"
android:text="@string/tv_title_no" />
<TextView
android:id="@+id/tvTitleInfo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
<strong>android:layout_marginLeft="3dip"
android:background="#666666"</strong>
android:textColor="#ffffff"
android:text="@string/tv_title_info" />
</TableRow>
横向滚动
有时,当表格一行内容太多时,可能我们希望表格横向滚动,只需要用HorizontalScrollView包装TableLayout
<HorizontalScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TableLayout
android:id="@+id/tl_forcast_result"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="10dp">
</TableLayout>
</HorizontalScrollView>
但此时又出现了另一个问题,虽然已经设置TableLayout的宽度是fill_parent,但当内容较少时,TableLayout还是根据内容自适应宽度,不能满屏。要解决这个问题,只需设置HorizontalScrollView的android:fillViewport="true",也就是设置是否将HorizontalScrollView的内容宽度拉伸以适应视口。
10. 获取屏幕尺寸
参考资料:
Android获得手机屏幕尺寸的方法。
从Android 3.2(API Level 13)开始,
在Activity里使用下面的方法来获取屏幕尺寸(单位是像素):
Display display = getWindowManager().getDefaultDisplay(); //Activity#getWindowManager()
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
如果代码
不是写在Activity里,用下面的方法(通过WINDOW_SERVICE获取display对象):
WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
display.getSize(size);
int width = size.x;
int height = size.y;
其中,ctx是ContextWrapper的对象,博主常希望在程序入口Application类里获取屏幕尺寸,这时
ContextWrapper ctx=new ContextWrapper(this);
如果
Android版本小于3.2,那么因为Display对象还没有getSize()方法,应该用下面的方法获取屏幕尺寸:
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
最后,附
Android系统版本与API Level对照表
Platform Version | API Level | Version Code |
---|---|---|
Android 4.1, 4.1.1 | 16 | Jelly_Bean |
Android 4.0.3, 4.0.4 | 15 | Ice_Cream_Sandwich_MR1 |
Android 4.0, 4.0.1, 4.0.2 | 14 | Ice_Cream_Sandwich |
Android 3.2 | 13 | Honeycomb_MR2 |
Android 3.1.x | 12 | Honeycomb_MR1 |
Android 3.0.x | 11 | Honeycomb |
Android 2.3.3, 2.3.4 | 10 | Gingerbread_MR1 |
Android 2.3, 2.3.1, 2.3.2 | 9 | Gingerbread |
Android 2.2.x | 8 | Froyo |
Android 2.1.x | 7 | Eclair_MR1 |
Android 2.0.1 | 6 | Eclair_0_1 |
Android 2.0 | 5 | Eclair |
Android 1.6 | 4 | Donut |
Android 1.5 | 3 | Cupcake |
Android 1.1 | 2 | Base_1_1 |
Android 1.0 | 1 | Base |