1 通过 DisplayMetrics 类获取屏幕宽高
示例代码:
package zyp.Activity;
import android.app.Activity;
import android.os.Bundle;
import android.widget.*;
import android.util.*;
public class Test extends Activity {
//Called when the activity is first created.
private TextView textView;
//在代码中定义一个 DispayMetrics 类对像
//DispayMetrics 一个描述普通显示信息的结构,例如显示大小 密度 字体尺寸
DisplayMetrics displayMetrics = new DisplayMetrics();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//getManager()获取显示定制窗口的管理器。
//获取默认显示Display对象
//通过Display 对象的数据来初始化一个DisplayMetrics 对象
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
String text = "手机分辨率为:\n"+displayMetrics.widthPixels+"*"+displayMetrics.heightPixels;
textView = (TextView)findViewById(R.id.test_1);
setContentView(R.layout.main);
textView.setText(text);
}
}
关键点:
DisplayMetrics 类
Andorid.util 包下的DisplayMetrics 类提供了一种关于显示的通用信息,如显示大小,分辨率和字体。
为了获取DisplayMetrics 成员,首先初始化一个对象如下:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
注:构造函数DisplayMetrics 不需要传递任何参数;调用getWindowManager() 之后,会取得现有Activity 的Handle ,此时,getDefaultDisplay() 方法将取得的宽高维度存放于DisplayMetrics 对象中,而取得的宽高维度是以像素为单位(Pixel) ,“像素”所指的是“绝对像素”而非“相对像素”。
通过 DisplayMetrics的 toString()方法可以获取到 DisplayMetrics的大部分 fields信息,如下是在分辨率为480*320的情况下的一些输出信息:
其中,density为显示的逻辑分辨率(文档中说了很多,看的不是很明白);width及height就为屏幕的分辨率(为绝对宽度与高度),与fields中的widthPixels及heightPixels一致;scaleDensity与density一致;xdpi及ydpi为准确的物理像素。
WindowManager接口
- 该接口用于与窗口管理器(Window Manager Service)交互。通过 Context.getSystemService(Context.WINDOW_SERVICE)可以获取到WindowManager的实例。
- 这个接口可以添加view到屏幕,也可以从屏幕删除view。它面向的对象一端是屏幕,另一端就是View 。
WindowManager接口介绍 详见 :http://blog.sina.com.cn/s/blog_4b3c1f950100qd4d.html
2 标题、状态栏的隐藏
标题栏隐藏
在Activity.setCurrentView();之前调用此方法
private void HideTitle() {
// TODO Auto-generated method stub
requestWindowFeature(Window.FEATURE_NO_TITLE);
}
状态栏隐藏(全屏)
在Activity.setCurrentView();之前调用此方法
private void HideStatusBar() {
// TODO Auto-generated method stub
//隐藏标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
//定义全屏参数
int flag=WindowManager.LayoutParams.FLAG_FULLSCREEN;
//获得窗口对象
Window myWindow=this.getWindow();
//设置Flag标识
myWindow.setFlags(flag,flag);
}
关键点
requestWindowFeature 方法
它的功能是启用窗体的扩展特性。
Window类
window类:概括了Android窗口的基本属性和基本功能。
window类 介绍:http://blog.sina.com.cn/s/blog_4b3c1f950100qd39.html
WindowManager.LayoutParams 类
WindowManager 接口主要用于与WindowManager(窗口管理服务)进行交互。
LayoutParams 是WindowManager 接口里面的一个嵌套类,包含了一系列的布局属性。
WindowManager 接口 介绍:http://blog.sina.com.cn/s/blog_4b3c1f950100qd4d.html
WindowManager(窗口管理服务)介绍:http://blog.sina.com.cn/s/blog_4b3c1f950100qe9m.html
3. Style 样式的定义
定义
在 /res/value/styles.xml 中定义以下样式:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="myStyle_Text1">
<item name="android:textSize">25sp</item>
<item name="android:textColor">#80FF00</item>
</style>
<style name="myStyle_Text2">
<item name="android:textSize">18sp</item>
<item name="android:textColor">#0C688E</item>
<item name="android:fromAlpha">0.0</item>
<item name="android:toAlpha" >0.0</item>
</style>
</resources>
使用
首先,在布局文件 main.xml 中添加两个 TextView 使用以上样式:
<TextView
android:id="@+id/TextView01"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:gravity="center_vertical|center_horizontal"
android:text="@string/string_A"> <!--string_A需要在strings.xml中定义 -->
</TextView>
<TextView
android:id="@+id/TextView02"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:gravity="center_vertical|center_horizontal"
android:text="@string/string_B"> <!--string_B需要在strings.xml中定义 -->
</TextView>
然后,给新添加的TextView添加相应的样式:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/TextView01"
style="@style/myStyle_Text1"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:gravity="center_vertical|center_horizontal"
android:text="@string/string_A"> <!--string_A需要在strings.xml中定义 -->
</TextView>
<TextView
android:id="@+id/TextView02"
style="@style/myStyle_Text2"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:gravity="center_vertical|center_horizontal"
android:text="@string/string_B"> <!--string_B需要在strings.xml中定义 -->
</TextView>
</LinearLayout>
结果
运行,得到的界面如下:
关键点
1. style 样式的使用 参看:转 样式(style)的定义
3. Button 事件处理
示例代码
1. 在 mainActivity.java 中 findViewByID() 获取 Button 资源
press = (Button)findViewById(R.id.Click_Button);
2. 给Button 添加事件监听器Button.OnClickListener()
press.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//按键事件处理代码...
}
});
关键点
1. setOnClickListener
Button 类从其父类和接口中继承了非常多的方法,其中一个方法就是 setOnClickListener ,用于设置 button 的点击监听,它的函数原型如下:
public void setOnClickListener (View.OnClickListener l)
Register a callback to be invoked when this view is clicked. If this view is not clickable, it becomes clickable.
Parameters
l: | The callback that will run |
---|
2. View.OnClickListener
public static interface View.OnClickListener
类概括:Interface definition for a callback to be invoked when a view is clicked.
View.OnClickListener 是 android.view 包下的一个接口类,其关键方法就是 onClick 这个抽象方法(也就是只有声明(定义)而没有实现)。
public abstract void onClick (View v)
Called when a view has been clicked.
Parameters
v: | The view that was clicked. |
---|
4. 同一Activity中的页面切换 ---- setContentView
示例代码
//前提:两个布局文件:main.xml mylayout.xml ,每个布局中都有一个 button ,点击 button 进行跳转。
package zyf.Ex8_UI;
import android.app.Activity; // import 相关class
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class Ex8_UI extends Activity {
// Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 载入main.xml Layout
setContentView(R.layout.main); // 默认启动布局
// 以findViewById()取得Button 对象,并添加onClickListener
Button b1 = (Button) findViewById(R.id.button1);
b1.setOnClickListener ( new Button.OnClickListener() {
public void onClick(View v) {
jumpToLayout2(); // 调用跳转方法jumpToLayout2()
}
} ) ;
}
// method jumpToLayout2:将layout 由main.xml 切换成mylayout.xml
public void jumpToLayout2() {
// 将layout 改成mylayout.xml
setContentView(R.layout.mylayout);
// 以findViewById()取得Button 对象,并添加onClickListener
Button b2 = (Button) findViewById(R.id.button2);
b2.setOnClickListener ( new Button.OnClickListener() {
public void onClick(View v) {
jumpToLayout1(); // 调用跳转方法jumpToLayout1()
}
} );
}
// method jumpToLayout1:将layout 由mylayout.xml 切换成main.xml
public void jumpToLayout1() {
// 将layout 改成main.xml
setContentView(R.layout.main);
// 以findViewById()取得Button 对象,并添加onClickListener
Button b1 = (Button) findViewById(R.id.button1);
b1.setOnClickListener ( new Button.OnClickListener() {
public void onClick(View v) {
jumpToLayout2(); // 调用跳转方法jumpToLayout2()
}
} ) ;
}
}
结果
关键点
1. Activity.setContentView()
函数原型:
public void setContentView (int layoutResID)
Set the activity content from a layout resource. The resource will be inflated, adding all top-level views to the activity.
参数:
layoutResID: | Resource ID to be inflated. |
---|
其重载函数:
I. public void setContentView (View view)
Set the activity content to an explicit view. This view is placed directly into the activity‘s view hierarchy. It can itself be a complex view hierarhcy.
参数:
view : | The desired content to display. |
---|
代码样例:
- public class Main extends Activity {
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- View v = View.inflate(this,R.layout.main,null);
- setContentView(v);
- }
- }
II. public void setContentView (View view, ViewGroup.LayoutParams params)
Set the activity content to an explicit view. This view is placed directly into the activity‘s view hierarchy. It can itself be a complex view hierarhcy.
参数:
view : | The desired content to display. |
---|---|
params: | Layout parameters for the view |
5.不同 Activity 间的切换 ---- Intent 对象的使用
代码示例
//两个布局文件:main.xml 和 mylayout.xml,每个布局中都有一个 TextView 和 button ,点击 button 进行跳转。
//AndroidManifest.xml 文件
//在 AndroidManifest.xml 文件中新添加 Activity ,名为SecondActivity
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="zyf.Ex9_UI"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon"
android:label="@string/app_name" >
<activity android:name=".Ex9_UI"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="SecondActivity"></activity>
</application>
<uses-sdk android:minSdkVersion="2" />
</manifest>
Q:两个 android:name 后面跟着的属性值怎么一个有"." 一个没有呢 ??
A:
activity组件的android:name属性采用类名的简写方式,查看文档类名的简写格式为“.ClassName”,但为什么有的带".",有的不带呢?经过反复的测试,发现了一个规则:
如果manifest中指定了package属性,比如指定为"com.android.sample",如果activity的实现类也在这个package下,则android:name为实现的类名,这个类名前加不加点都没有关系,如果activity的实现类是在默认包的子包里面,则这个“.”是必须有的,比如activity的实现是com.android.sample.app.DialogActivity,则android:name必须写成.app.DialogActivity或者com.android.sample.app.DialogActivity。如果只写app.DialogActivity,则会报错。
//mainActivity.java 文件
//按键点击跳转到SecondActivity
package zyf.Ex9_UI;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class Ex9_UI extends Activity {
// Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 载入main.xml Layout
setContentView(R.layout.main);
// 以findViewById()取得Button 对象,并添加onClickListener
Button b1 = (Button) findViewById(R.id.button1);
b1.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
//new 一个Intent 对象,并指定要启动的class
Intent intent = new Intent();
intent.setClass(Ex9_UI.this, SecondActivity.class);
// 调用一个新的Activity
startActivity(intent);
// 关闭原本的Activity
Ex9_UI.this.finish();
}
});
}
}
//SecondActivity.java 文件
//按键点击跳转到Activity :Ex9_UI
package zyf.Ex9_UI;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class SecondActivity extends Activity {
// Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 载入mylayout.xml Layout
setContentView(R.layout.mylayout);
// 以findViewById()取得Button 对象,并添加onClickListener
Button b2 = (Button) findViewById(R.id.button2);
b2.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
// new 一个Intent 对象,并指定要启动的class
Intent intent = new Intent();
intent.setClass(SecondActivity.this, Ex9_UI.class);
// 调用一个新的Activity
startActivity(intent);
// 关闭原本的Activity
SecondActivity.this.finish();
}
});
}
}
结果
关键点
1. Intent.SetClass
函数原型:
public Intent setClass (Context packageContext, Class<?> cls)
Convenience for calling setComponent(ComponentName)
with the name returned by a Class
object.
参数:
packageContext :A Context of the application package implementing this class.
( Activity 继承自 Context )
cls :The class name to set, equivalent to setClassName(context, cls.getName())
.
返回值:
Returns the same Intent object, for chaining multiple calls into a single statement.
2. Activity.StartActivity
函数原型:
public void startActivity (Intent intent)
Launch a new activity. You will not receive any information about when the activity exits.
This method throws ActivityNotFoundException
if there was no Activity found to run the given Intent.
参数:
intent : | The intent to start |
---|
异常:
android.content.ActivityNotFoundException |
相关:
startActivityForResult(Intent, int)
3. Activity.this.finish
函数原型:
public void finish ()
Call this when your activity is done and should be closed. The ActivityResult is propagated back to whoever launched you via onActivityResult().
Q:为什么在使用的时候不直接用 this.finish() ?? 不能 还是 习惯不好 ?
A:貌似 直接用 this.finish(), 是可以的,编译没有报错.....继续待验证
6. Activity 之间的数据传输
利用Intent传递数据
传递数据的Activity中:
Intent intent = new Intent();
intent.putExtra("name","Jon"); //在Intent中加入键值对数据。键:name,值:Jon
intent.setClass(Activity01.this,Activity02.class);
Activity01.this.startActivity(intent);
在取出数据的Activity中:
Intent intent = getIntent(); //获得传过来的Intent。
String value = intent.getStringExtra("name"); //根据键name取出值。
利用Bundle传递数据
Bundle :其实就是 map ,映射。
传递数据的Activity:
Intent intent = new Intent();
Bundle myBundle = new Bundle();
myBundle.putString("Key_Name","Tom");
intent.putExtras(myBundle);
intent.setClass(Activity01.this,Activity02.class);
Activity01.this.startActivity(intent);
取出数据的Activity:
Bundle getBundle = getIntent().getExtras();
String value = getBundle.getString("Key_Name");
利用startActivityForResult传递数据
startActivityForResult可以把数据传过去,还可以把那边的数据传过来。
传递数据的Activity中:
1. 传递数据
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("data", "somedata");//把数据传过去
intent.putExtras(bundle);
intent.setClass(Activity01.this, Activity02.class);
startActivityForResult(intent, 10);//10是一个代码
2. 重载onActivityResult方法,用来接收传过来的数据:
protected void onActivityResult(int requestCode, int resultCode,Intent intent) {
switch (resultCode) {
case RESULT_OK:
Bundle b = intent.getExtras();
String str = b.getString("Result");
setTitle("Return data:" + str);
break;
default:
break;
}
}
接收数据的Activity:
Intent intent = getIntent();
Bundle getBundle = getIntent().getExtras();
String data = getBundle.getString("data");//读取传过来的数据
et.setText(data);
EditText edittext = (EditText) findViewById(R.id.text);
Intent intent = new Intent();//实例化一个Intent用来传过去,可以在Intent里存放数据。
Bundle bundle = new Bundle();
bundle.putString("Result",edittext.getText().toString());
intent.putExtras(bundle);
Activity02.this.setResult(RESULT_OK,intent);//把Intent(数据)传过去,RESULT_OK是请求码。
finish();//结束当前的Activity。