Android 中常用的计量单位
Android有时候需要一些计量单位,比如在布局Layout文件中可能需要指定具体单位等。
常用的计量单位有:px、dip(dp)、sp,以及一些不常用的pt、in、mm。下面详细介绍下这些计量单位之间的区别和联系。
in:英寸(长度单位);
mm:毫米(长度单位);
pt:磅/点,1/72英寸(一个标准的长度单位);
sp:全名 scaled pixels-best for text size,放大像素,与刻度无关,可以根据用户的字体大小就行缩放,主要用来处理字体的大小;
px:屏幕中的像素;
dip(dp):设备独立像素,一种基于屏幕密度的抽象单位;因为不通设备中有不同的显示效果,所以为了解决在不通分辨率手机上运行不至于相差太大的问题,引入了dip计量单位,这种计量单位与移动设备硬件无关。

说道密度,这里简单介绍下。手机密度值(Density)表示每英寸有多少个显示点,与手机的分辨率是两个概念,但是分辨率与密度之间又互相关联,两者转换公式为:
密度值是120,屏幕实际分辨率为:240px×400px(两个点对应一个分辨率);
密度值是160,屏幕实际分辨率为:320px×533px(3个点对应两个分辨率);
密度值是240,屏幕实际分辨率为:480px×800px(一个点对应一个分辨率)。

比如,QVGA与WQVGA屏的密度值是120,HVGA屏密度值是160,WVGA屏密度值是240.

res资源目录,因为运行的设备的不同,对应的资源文件目录也不同。其真正的原因是,资源目录是根据密度的不同来进行划分的:
密度值是120,对应的资源目录是drawable-ldpi;
密度值是160,对应的资源目录是drawable-mdpi;
密度值是240,对应的资源目录是drawable-hdpi。

根据以上介绍,在布局中应该尽量使用dip(dp)作为单位;而定义作为文字大小的单位则推荐使用sp。

Context
Context 类是一个抽象类,它的子类很多,比如 Activity 、 TabActivity 、Service 等。很多方法中需要传入 Context 参数才可实例对象,例如 Toast 实例对象时,第一个对象需传入 Context 对象。其实 Context 从字面上可以理解为类似于句柄,联系上下文的意思。因为 Activity 是 Context 的子类,所以一般在 Activity 中使用 Context 的时候,可以用 this 来代替,但是如果在内部类中(如利用内部类使用监听组件),就不能使用 this 来代替 Context ,而是使用 "ActName.this" ,这里的 ActName 指的是 Activity 类的类名。

在Android中的 Context 可以有很多操作,但是最主要的功能是加载和访问资源,具体可以看下官方文档:http://developer.android.com/reference/android/content/Context.html

Resources与getResources
在 Android 资源(Resource)都会自动由 R.java 资源文件生成对应的静态 ID ,通过 R 资源文件对资源生成的 ID 来引用。这样在资源需要修改的时候,就不用去程序源代码中修改,直接修改对应res下的资源文件即可。
在源代码中,如果需要对资源目录下的 string.xml 中定义的字符串变量进行访问,只需要通过 getResources 的方式引用即可。
例如,需要引用 string.xml 中的一个字符串,其变量为 "hello_world",获取方式如下:

getResources().getString(R.string.hello_world);

再如需要引用 drawable 目录下的一张名为"goodby_times.png"的图片,获取方式如下:

getResources().getDrawable(R.drawable.goodby_times);

当然一些函数不仅支持传入 String 类型,也支持传入引用 ID 。例如 TextView 中的setText() 函数,这个方法不仅支持传入 String 类型,还支持 R 文件引用 ID 的参数。"R.string.strName"中的 strName 表示在 string.xml 中定义的字符串在 R 资源文件中生成的对应 ID 索引。

findViewById与LayoutInflater
LayoutInflater 的作用类似于 findViewById(),两者不同之处在于 LayoutInflater 是用来实例化 xml 布局文件中的布局:而 findViewById,顾名思义,是通过 ID 来找到 xml 布局文件中定义的组件,比如 EditText、TextView、Button 等等。
关于用 LayoutInflater 来实例布局的方式有两种:
1.通过传入 Context 参数来获得 LayoutInflater 实例,然后调用 LayoutInflater 类中的 inflate 函数来得到布局实例。

LayoutInflater inflater = LayoutInflater.from(Context context) ;View view = inflater.inflate(R.layout.activity_main, null);

2.通过系统服务来获取到 LayoutInflater 实例,然后调用 LayoutInflater 类中的 inflate 函数来得到布局实例。

LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);View view = inflater.inflate(R.layout.activity_main, null);

尽管实例布局的形式不同,但是这两种布局方式的性质没有区别。

多个Activity之间跳转/退出/传递数据操作

主要代码:

package yc.example.activityex;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity implements OnClickListener {    private Button btnOpen, btnHide, btnExit;// 声明按钮    private static String[] arrStr = new String[] { "有自己的目标,那就去实现它,语言总苍白无力。",            "他的速度快逾闪电,连残影都模糊不清,如同一团风。", "他脑海中,只有一个念头:快!再快一点!再快一点!" };    private static int ARR_INT = 0;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 实例化按钮        btnOpen = (Button) this.findViewById(R.id.btnOpen);        btnHide = (Button) this.findViewById(R.id.btnHide);        btnExit = (Button) this.findViewById(R.id.btnExit);        // 给每个按钮添加监听器        btnOpen.setOnClickListener(this);        btnHide.setOnClickListener(this);        btnExit.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()) {        case R.id.btnOpen:            // 创建一个意图,并设置需打开的Activity            Intent intent = new Intent(MainActivity.this, OtherActivity.class);            if(ARR_INT>=arrStr.length) ARR_INT =0;            // 发送数据            intent.putExtra("info", arrStr[ARR_INT++]);            // 启动另外一个Activity            this.startActivity(intent);            break;        case R.id.btnHide:            /*             * finish()函数表示退出当前 Activity 。             * 执行此函数会调用生命周期中的onStop()与onDestory()函数,但是这仅仅是将当前的 Activity 推到后台,             * 程序中的资源仍然存在,如果 Android 运行内存不是很紧张的情况下,程序是不会真正退出的。             */            this.finish();            break;        case R.id.btnExit:            /*             * System.exit(0) 函数表示退出当前的程序。 当 Android             * 执行到此函数的时候,本应用程序的资源将被回收,并退出此程序。             */            System.exit(0); // 退出程序            break;        }    }}
MainActivity.class
package yc.example.activityex;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.widget.TextView;public class OtherActivity extends Activity {    private TextView tv;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        tv = new TextView(this);        setContentView(tv);        //得到当前 Activity 的意图        Intent intent = this.getIntent();        //获取数据        String info = intent.getStringExtra("info");        //将获取到的数据设置成 TextView 文本        tv.setText(info);    }}
OtherActivity.class

PS:记得在 AndroidManifest.xml 文件中声明新建的Activity,不然应用会由于找不到活动而报异常。

<!-- 下面是注册新建的Activity(OtherActivity) -->        <activity android:name="yc.example.activityex.OtherActivity"></activity>

横竖屏切换处理的三种方式
Android 手机中运行应用的时候,一般用户都是竖屏,但是如果突然将手机横屏,那么很可能就会造成程序出现异常,因为在 Android 中每次屏幕切换都会重启当前的 Activity 。这种情况下,异常的解决方式有一下三种。

1.锁定横竖屏切换
此方式只需要在 AndroidManifest.xml 文件中,对 Activity 定义屏幕方向属性只能为横屏或者竖屏即可
将屏幕固定为竖屏显示

<activity android:screenOrientation="portrait">

将屏幕固定为横屏显示

<activity android:screenOrientation="landscape">

其他参数:
"unspecified":默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向.
"landscape":横屏显示(宽比高要长)
"portrait":竖屏显示(高比宽要长)
"user":用户当前首选的方向
"behind":和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
"sensor":有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。
"nosensor":忽略物理感应器,这样就不会随着用户旋转设备而更改了("unspecified"设置除外)。

因为一个 Android 应用程序中可能会有多个 Activity ,那么可以根据需要去配置每一个 Activity 的显示方式,如果不设置,默认可以横竖屏切换。

或者在源码中设置横竖屏:
设置竖屏

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

设置横屏

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

2.源代码中处理横竖屏切换事件
首先在AndroidManifest.xml中为Activity设置configChanges属性

android:configChanges="orientation|screenSize"

然后在对应的 Activity 源代码中重写 onConfigurationChanged() 函数即可。这样处理后,当横竖屏切换的时候,就会响应其 Activity 中的 onConfigurationChanged() 函数,然后对横竖屏做出判断处理。

package yc.example.helloworld;import android.app.Activity;import android.content.res.Configuration;import android.os.Bundle;import android.util.Log;import android.widget.TextView;public class MainActivity extends Activity {     private TextView textView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);           Log.i("--Main--", "onCreate");             textView=(TextView)findViewById(R.id.tv);      }    @Override    public void onConfigurationChanged(Configuration newConfig) {        super.onConfigurationChanged(newConfig);        Log.i("--Main--", "onConfigurationChanged");          if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {             textView.setText("当前屏幕为竖屏");          } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {             textView.setText("当前屏幕为横屏");          }    }}

此方式就不会在切换横竖屏的时候,Activity 默认重启了。

3.重写 onRestoreInstanceState() 与 onSaveInstanceState() 函数代码:

@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);Log.i("YInfo", "onRestoreInstanceState()");}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);Log.i("YInfo", "onSaveInstanceState()");}

在屏幕切换横竖屏的时候,会响应 onSaveInstanceState() 函数,然后重启载入当前的 Activity ,最后响应 onRestoreInstanceState() 函数,所以可以通过重写这两个函数,进行屏幕横竖屏切换时的处理。

以上3种处理横竖屏切换方式,根据当前应用来进行选择。

更多相关文章

  1. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  2. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  3. [置顶] android图形系统详解二:Drawables
  4. Android学习笔记1 ——资源 (一)
  5. Android运行时异常“Binary XML file line # : Error inflating
  6. Android沙盒开发之系统libc库定制修改
  7. android 程序框架--资源和资产
  8. Android开发必备的21个免费资源和工具
  9. Android(安卓)Launcher全面剖析

随机推荐

  1. Android(安卓)4.0 Launcher2源码分析——
  2. android常用adb命令
  3. Android(安卓)中文 API(123) —— AbsListV
  4. Android横竖屏加载不同布局的适配方案
  5. Android中shape的使用
  6. Android(安卓)统一View样式,textview样式
  7. android 环境配置
  8. MULTIPLE TARGETS FROM ONE ANDROID SOUR
  9. Handling Android(安卓)2.3 WebView's br
  10. Android设备如何保证数据同步写入磁盘