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之间跳转/退出/传递数据操作

【读书笔记《Android游戏编程之从零开始》】8.Android 游戏开发常用的系统控件(系统控件常见问题)

 

主要代码:

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

相关文章:

  • 2022-12-23
  • 2021-08-01
  • 2021-12-07
  • 2022-12-23
  • 2021-10-19
  • 2021-04-08
猜你喜欢
  • 2021-06-24
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-27
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案