【Android】开发小经验1

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

我们平常可以直接在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和dip的区别
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);


设置隐藏标题:在Activity的onCreate()中的setContentView()调用之前,添加如下代码

requestWindowFeature(Window.FEATURE_NO_TITLE);


设置横屏/竖屏:在Manifest.xml文件中对要设置横屏/竖屏Activity节点添加android:screenOrientation属性,横屏为landscape,竖屏为portrait

<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="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大小 惊讶
因为官网上 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和平时在网页上见到的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 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 VersionAPI LevelVersion Code
Android 4.1, 4.1.116Jelly_Bean
Android 4.0.3, 4.0.415Ice_Cream_Sandwich_MR1
Android 4.0, 4.0.1, 4.0.214Ice_Cream_Sandwich
Android 3.213Honeycomb_MR2
Android 3.1.x12Honeycomb_MR1
Android 3.0.x11Honeycomb
Android 2.3.3, 2.3.410Gingerbread_MR1
Android 2.3, 2.3.1, 2.3.29Gingerbread
Android 2.2.x8Froyo
Android 2.1.x7Eclair_MR1
Android 2.0.16Eclair_0_1
Android 2.05Eclair
Android 1.64Donut
Android 1.53Cupcake
Android 1.12Base_1_1
Android 1.01Base



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值