Android开发06—菜单与对话框(下)
1. 进度对话框
ProgressDialog可以显示进度轮和进度条,由于ProgressDialog继承自AlertDialog,所以在进度对话框中也可以添加按钮。
实例说明进度对话框的用法:
2. 消息提示
1) Toast的使用
Toast向用户提供比较快速的即时消息,当Toast被显示时,虽然其悬浮于应用程序的最上方,但是Toast从不获得焦点。因为涉及Toast时就是为了让其在提示有用信息时尽量不显眼。Toast用于用户某项设置成功等。
Toast对象的创建通过Toast类的静态方法makeText来实现,该方法有两个重载实现,主要的不同时一个接受字符串,而另一个接收字符串的资源标识符作为参数。Toast对象创建好之后通过show方法即可将消息提示显示到屏幕上。
实例:
Notification是另一种消息提示的方式。Notification位于手机的状态栏,在Android手机中用手指按下状态栏并往下拉可以打开状态栏查看系统的提示信息。
实例:
main.xml:
notified.xml
1. Activity
注意最后在AndroidManifest.xml中添加新的Acitivity,否则无法显示。
1. 进度对话框
ProgressDialog可以显示进度轮和进度条,由于ProgressDialog继承自AlertDialog,所以在进度对话框中也可以添加按钮。
实例说明进度对话框的用法:
- package qijia.si;
- import android.app.Activity;
- import android.app.Dialog;
- import android.app.ProgressDialog;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- public class ContextMenuDemo extends Activity {
- //声明进度对话框id
- final int PROGRESS_DIALOG = 0;
- //Handler消息类型
- final int INCREASE = 0;
- //进度对话框对象引用
- ProgressDialog pd;
- //Handler对象引用
- Handler myHandler;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //获得Button对象
- Button bt = (Button)this.findViewById(R.id.button1);
- //设置onClickListener监听器
- bt.setOnClickListener(new OnClickListener(){
- public void onClick(View v) {
- // TODO Auto-generated method stub
- showDialog(PROGRESS_DIALOG);
- }
- });
- //创建handler对象
- myHandler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- switch(msg.what){
- case INCREASE:
- pd.incrementProgressBy(1);
- //如果进度走完就关闭
- if(pd.getProgress()>=100){
- pd.dismiss();
- }
- break;
- }
- super.handleMessage(msg);
- }
- };
- }
- //重写onCreateDialog方法
- public Dialog onCreateDialog(int id){
- switch(id){
- //创建进度对话框
- case PROGRESS_DIALOG:
- pd = new ProgressDialog(this);
- //设置进度对话框
- pd.setMax(100);
- pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
- pd.setTitle(R.string.title);
- pd.setCancelable(false);
- new Thread(){
- public void run(){
- while(true){
- //发送Handler消息
- myHandler.sendEmptyMessage(INCREASE);
- if(pd.getProgress()>=100){
- break;
- }
- try{
- Thread.sleep(100);
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
- }.start();
- break;
- }
- return pd;
- }
- //每次弹出对话框时被动态回调以动态更新对话框
- public void onPrePareDialog(int id,Dialog dialog){
- super.onPrepareDialog(id, dialog);
- switch(id){
- case PROGRESS_DIALOG:
- //对话框进度清零
- pd.incrementProgressBy(-pd.getProgress());
- //匿名对象
- new Thread()
- {
- public void run(){
- while(true){
- //发送Handler消息
- myHandler.sendEmptyMessage(INCREASE);
- if(pd.getProgress()>=100){
- break;
- }
- try{
- Thread.sleep(100);
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
- }.start();
- break;
- }
- }
- }
package qijia.si;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class ContextMenuDemo extends Activity {
//声明进度对话框id
final int PROGRESS_DIALOG = 0;
//Handler消息类型
final int INCREASE = 0;
//进度对话框对象引用
ProgressDialog pd;
//Handler对象引用
Handler myHandler;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获得Button对象
Button bt = (Button)this.findViewById(R.id.button1);
//设置onClickListener监听器
bt.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
showDialog(PROGRESS_DIALOG);
}
});
//创建handler对象
myHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
switch(msg.what){
case INCREASE:
pd.incrementProgressBy(1);
//如果进度走完就关闭
if(pd.getProgress()>=100){
pd.dismiss();
}
break;
}
super.handleMessage(msg);
}
};
}
//重写onCreateDialog方法
public Dialog onCreateDialog(int id){
switch(id){
//创建进度对话框
case PROGRESS_DIALOG:
pd = new ProgressDialog(this);
//设置进度对话框
pd.setMax(100);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setTitle(R.string.title);
pd.setCancelable(false);
new Thread(){
public void run(){
while(true){
//发送Handler消息
myHandler.sendEmptyMessage(INCREASE);
if(pd.getProgress()>=100){
break;
}
try{
Thread.sleep(100);
}catch(Exception e){
e.printStackTrace();
}
}
}
}.start();
break;
}
return pd;
}
//每次弹出对话框时被动态回调以动态更新对话框
public void onPrePareDialog(int id,Dialog dialog){
super.onPrepareDialog(id, dialog);
switch(id){
case PROGRESS_DIALOG:
//对话框进度清零
pd.incrementProgressBy(-pd.getProgress());
//匿名对象
new Thread()
{
public void run(){
while(true){
//发送Handler消息
myHandler.sendEmptyMessage(INCREASE);
if(pd.getProgress()>=100){
break;
}
try{
Thread.sleep(100);
}catch(Exception e){
e.printStackTrace();
}
}
}
}.start();
break;
}
}
}
2. 消息提示
1) Toast的使用
Toast向用户提供比较快速的即时消息,当Toast被显示时,虽然其悬浮于应用程序的最上方,但是Toast从不获得焦点。因为涉及Toast时就是为了让其在提示有用信息时尽量不显眼。Toast用于用户某项设置成功等。
Toast对象的创建通过Toast类的静态方法makeText来实现,该方法有两个重载实现,主要的不同时一个接受字符串,而另一个接收字符串的资源标识符作为参数。Toast对象创建好之后通过show方法即可将消息提示显示到屏幕上。
实例:
- package qijia.si;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.Gravity;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.ImageView;
- import android.widget.LinearLayout;
- import android.widget.Toast;
- public class ContextMenuDemo extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button btn = (Button) this.findViewById(R.id.button1);
- btn.setOnClickListener(new OnClickListener(){
- public void onClick(View v) {
- // TODO Auto-generated method stub
- //创建ImageView
- ImageView iv = new ImageView(ContextMenuDemo.this);
- iv.setImageResource(R.drawable.header);
- //创建一个线性布局
- LinearLayout ll = new LinearLayout(ContextMenuDemo.this);
- Toast toast = Toast.makeText(ContextMenuDemo.this, "Hello World", Toast.LENGTH_LONG);
- toast.setGravity(Gravity.CENTER, 0, 0);
- View toastView = toast.getView();
- ll.setOrientation(LinearLayout.HORIZONTAL);
- //将ImageView添加到线性布局
- ll.addView(iv);
- //将Toast的View添加到线性布局
- ll.addView(toastView);
- toast.setView(ll);
- //显示toast
- toast.show();
- }
- });
- }
- }
package qijia.si;
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
public class ContextMenuDemo extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button) this.findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
//创建ImageView
ImageView iv = new ImageView(ContextMenuDemo.this);
iv.setImageResource(R.drawable.header);
//创建一个线性布局
LinearLayout ll = new LinearLayout(ContextMenuDemo.this);
Toast toast = Toast.makeText(ContextMenuDemo.this, "Hello World", Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
View toastView = toast.getView();
ll.setOrientation(LinearLayout.HORIZONTAL);
//将ImageView添加到线性布局
ll.addView(iv);
//将Toast的View添加到线性布局
ll.addView(toastView);
toast.setView(ll);
//显示toast
toast.show();
}
});
}
}
2) Notification
Notification是另一种消息提示的方式。Notification位于手机的状态栏,在Android手机中用手指按下状态栏并往下拉可以打开状态栏查看系统的提示信息。
实例:
main.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:orientation="vertical">
- <Button android:layout_height="wrap_content" android:id="@+id/button1" android:text="@string/btn" android:layout_width="fill_parent"></Button>
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:orientation="vertical"> <Button android:layout_height="wrap_content" android:id="@+id/button1" android:text="@string/btn" android:layout_width="fill_parent"></Button> </LinearLayout>
notified.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android">
- <EditText android:layout_height="wrap_content" android:id="@+id/editText1" android:text="@string/tv" android:layout_width="fill_parent" android:editable="false" android:layout_gravity="center_horizontal"></EditText>
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"> <EditText android:layout_height="wrap_content" android:id="@+id/editText1" android:text="@string/tv" android:layout_width="fill_parent" android:editable="false" android:layout_gravity="center_horizontal"></EditText> </LinearLayout>
1. Activity
- package qijia.si;
- import android.app.Activity;
- import android.app.Notification;
- import android.app.NotificationManager;
- import android.app.PendingIntent;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- public class ContextMenuDemo extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button btn = (Button)findViewById(R.id.button1);
- //添加监听
- btn.setOnClickListener(new OnClickListener(){
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Intent i = new Intent(ContextMenuDemo.this,NotifiedActivity.class);
- //建立一个新的Activity
- PendingIntent pi = PendingIntent.getActivity(ContextMenuDemo.this, 0, i, 0);
- //创建一个Notification对象
- Notification myNotification = new Notification();
- myNotification.icon = R.drawable.header;
- //设置文字和声音
- myNotification.tickerText = getResources().getString(R.string.Notification);
- myNotification.defaults = Notification.DEFAULT_SOUND;
- myNotification.setLatestEventInfo(ContextMenuDemo.this, "Example", "Hello World", pi);
- //建立NotificationManger并发送消息
- NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
- notificationManager.notify(0,myNotification);
- }
- });
- }
- }
package qijia.si;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class ContextMenuDemo extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button)findViewById(R.id.button1);
//添加监听
btn.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent(ContextMenuDemo.this,NotifiedActivity.class);
//建立一个新的Activity
PendingIntent pi = PendingIntent.getActivity(ContextMenuDemo.this, 0, i, 0);
//创建一个Notification对象
Notification myNotification = new Notification();
myNotification.icon = R.drawable.header;
//设置文字和声音
myNotification.tickerText = getResources().getString(R.string.Notification);
myNotification.defaults = Notification.DEFAULT_SOUND;
myNotification.setLatestEventInfo(ContextMenuDemo.this, "Example", "Hello World", pi);
//建立NotificationManger并发送消息
NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(0,myNotification);
}
});
}
}
2. Activity
- package qijia.si;
- import android.app.Activity;
- import android.os.Bundle;
- //当用户在状态栏点击Notification时会启动该Activity
- public class NotifiedActivity extends Activity{
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.notified);
- }
- }
package qijia.si;
import android.app.Activity;
import android.os.Bundle;
//当用户在状态栏点击Notification时会启动该Activity
public class NotifiedActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.notified);
}
}
注意最后在AndroidManifest.xml中添加新的Acitivity,否则无法显示。
Android开发06—菜单与对话框(上)
1. 菜单
1) 选项菜单和子菜单
当Activity在前台工作的时候,按下menu将会弹出相应的选项菜单。这个功能是需要开发人员编成实现的,如果在程序中没有此功能,那么程序运行时按下手机的menu键将不会有反映。
对于有图标的选项菜单,每次最多能显示6个,当多于6个时,将只显示前5个和一个拓展菜单选项。
在Android中通过回调方法来创建菜单并处理菜单按下的事件。
开发选项菜单主要用到Menu,MenuItem及SubMenu
实例:接受用户在菜单中的选项并输出到文本框控件中
main.xml:
ContextMenu继承自Menu。上下文菜单不同于选项菜单,选项菜单服务于Activity,而上下文菜单是注册到某个View对象上的。如果一个View对象注册了上下文菜单,用户可以通过长按该View对象以呼叫上下文菜单。
上下文菜单不支持快捷键,也不能附带图标,但是可以为上下文菜单的标题指定图标。
用法实例:
main.xml:
Acticity:
对话框是Activity运行时显示的小窗口,当显示对话框时,当前Activity失去焦点而由对话框负责所有的人机交互。一般来说,对话框用于提示消息或弹出一个与程序主进程直接相关的小程序。
Android平台下主要有以下几种对话框:
1) 提示对话框 AlertDialog
AlertDialog对话框可以包含若干按钮和一些可选的单选按钮或复选框。
2) 进度对话框
ProgressDialog可以显示进度轮或进度条,由于ProgressDialog继承自AlertDialog,所以其也可以添加按钮。
3) 日期选择对话框DatePickerDialog
4) 时间选择对话框TimePickerDialog
对话框是作为Activity的一部分被创建和显示的,在程序中通过开发回调方法onCreateDialog来完成对话框的创建,该方法需要传入代表对话框id参数。如果需要显示对话框,则调用showDialog方法传入对话框id来显示指定的对话框。
当对话框第一次被显示时,Android会调用onCreateDialog方法来创建对话框实例,之后将不再重复创建该实例。同时,每次对话框再被显示之前都会调用onPrepareDialog方法,如果补充些该方法,那么每次显示的对话框将是最初创建的那个。
关闭对话框可以调用Dialog类的dismiss方法来实现,但是要注意这种方法不会让对话框彻底消失,如果要对话框被关闭后彻底消失,要调用removeDialog方法并传入Dialog的id。
下面通过普通对话框的例子来说明如何使用:
main.xml:
Activity:
1. 菜单
1) 选项菜单和子菜单
当Activity在前台工作的时候,按下menu将会弹出相应的选项菜单。这个功能是需要开发人员编成实现的,如果在程序中没有此功能,那么程序运行时按下手机的menu键将不会有反映。
对于有图标的选项菜单,每次最多能显示6个,当多于6个时,将只显示前5个和一个拓展菜单选项。
在Android中通过回调方法来创建菜单并处理菜单按下的事件。
开发选项菜单主要用到Menu,MenuItem及SubMenu
实例:接受用户在菜单中的选项并输出到文本框控件中
main.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/linearLayout1">
- <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/scrollView1">
- <EditText android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/editText1" android:editable="false" android:cursorVisible="false" android:text="@string/label"></EditText>
- </ScrollView>
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/linearLayout1"> <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/scrollView1"> <EditText android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/editText1" android:editable="false" android:cursorVisible="false" android:text="@string/label"></EditText> </ScrollView> </LinearLayout>Activity:
- package qijia.si;
- import android.app.Activity;
- import android.app.TabActivity;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.MenuItem.OnMenuItemClickListener;
- import android.view.SubMenu;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.AdapterView;
- import android.widget.AdapterView.OnItemClickListener;
- import android.widget.BaseAdapter;
- import android.widget.EditText;
- import android.widget.Gallery;
- import android.widget.ImageView;
- import android.widget.ProgressBar;
- import android.widget.RatingBar;
- import android.widget.TabHost;
- public class JavaTest extends Activity {
- /** Called when the activity is first created. */
- final int MENU_GENDER_MALE = 0;
- final int MENU_GENDER_FEMALE = 1;
- final int MENU_HOBBY1=2;
- final int MENU_HOBBY2=3;
- final int MENU_HOBBY3=4;
- final int MENU_OK=5;
- final int MENU_GENDER=6;
- final int MENU_HOBBY=7;
- final int GENDER_GROUP=0;
- final int HOBBY_GROUP=1;
- final int MAIN_GROUP=2;
- MenuItem[] miaHobby = new MenuItem[3];
- MenuItem male = null;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- }
- public boolean onCreateOptionsMenu(Menu menu){
- //初始化菜单通过此函数实现
- SubMenu subMenuGender = menu.addSubMenu(MAIN_GROUP,MENU_GENDER,0,R.string.gender);
- subMenuGender.setIcon(R.drawable.gender);
- subMenuGender.setHeaderIcon(R.drawable.gender);
- male = subMenuGender.add(GENDER_GROUP,MENU_GENDER_MALE,0,R.string.male);
- male.setChecked(true);
- subMenuGender.add(GENDER_GROUP,MENU_GENDER_FEMALE,0,R.string.female);
- subMenuGender.setGroupCheckable(GENDER_GROUP, true, true);
- SubMenu subMenuHobby = menu.addSubMenu(MAIN_GROUP,MENU_HOBBY,0,R.string.hobby);
- subMenuHobby.setIcon(R.drawable.hobby);
- miaHobby[0] = subMenuHobby.add(HOBBY_GROUP,MENU_HOBBY1,0,R.string.hobby1);
- miaHobby[1] = subMenuHobby.add(HOBBY_GROUP,MENU_HOBBY2,0,R.string.hobby2);
- miaHobby[2] = subMenuHobby.add(HOBBY_GROUP,MENU_HOBBY3,0,R.string.hobby3);
- miaHobby[0].setCheckable(true);
- miaHobby[1].setCheckable(true);
- miaHobby[2].setCheckable(true);
- MenuItem ok = menu.add(GENDER_GROUP+2,MENU_OK,0,R.string.ok);
- OnMenuItemClickListener lsn = new OnMenuItemClickListener(){
- public boolean onMenuItemClick(MenuItem item) {
- // TODO Auto-generated method stub
- appendStateStr();
- return true;
- }
- };
- ok.setOnMenuItemClickListener(lsn);
- ok.setAlphabeticShortcut('o');
- return true;
- }
- public boolean onOptionsItemSelected(MenuItem mi){
- switch(mi.getItemId()){
- case MENU_GENDER_MALE:
- case MENU_GENDER_FEMALE:
- mi.setChecked(true);
- appendStateStr();
- break;
- case MENU_HOBBY1:
- case MENU_HOBBY2:
- case MENU_HOBBY3:
- mi.setChecked(!mi.isChecked());
- appendStateStr();
- break;
- }
- return true;
- }
- public void appendStateStr(){
- String result = "您选择的性别为:";
- if(male.isChecked()){
- result = result +"男";
- }else{
- result+="女";
- }
- String hobbyStr="";
- for(MenuItem mi:miaHobby){
- if(mi.isChecked()){
- hobbyStr = hobbyStr+mi.getTitle()+",";
- }
- }
- if(hobbyStr.length()>0){
- result=result+",您的爱好为:"+hobbyStr.substring(0,hobbyStr.length()-1)+"。\n";
- }
- else{
- result = result+"。\n";
- }
- EditText et = (EditText) JavaTest.this.findViewById(R.id.editText1);
- et.append(result);
- }
- }
package qijia.si;
import android.app.Activity;
import android.app.TabActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.SubMenu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RatingBar;
import android.widget.TabHost;
public class JavaTest extends Activity {
/** Called when the activity is first created. */
final int MENU_GENDER_MALE = 0;
final int MENU_GENDER_FEMALE = 1;
final int MENU_HOBBY1=2;
final int MENU_HOBBY2=3;
final int MENU_HOBBY3=4;
final int MENU_OK=5;
final int MENU_GENDER=6;
final int MENU_HOBBY=7;
final int GENDER_GROUP=0;
final int HOBBY_GROUP=1;
final int MAIN_GROUP=2;
MenuItem[] miaHobby = new MenuItem[3];
MenuItem male = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public boolean onCreateOptionsMenu(Menu menu){
//初始化菜单通过此函数实现
SubMenu subMenuGender = menu.addSubMenu(MAIN_GROUP,MENU_GENDER,0,R.string.gender);
subMenuGender.setIcon(R.drawable.gender);
subMenuGender.setHeaderIcon(R.drawable.gender);
male = subMenuGender.add(GENDER_GROUP,MENU_GENDER_MALE,0,R.string.male);
male.setChecked(true);
subMenuGender.add(GENDER_GROUP,MENU_GENDER_FEMALE,0,R.string.female);
subMenuGender.setGroupCheckable(GENDER_GROUP, true, true);
SubMenu subMenuHobby = menu.addSubMenu(MAIN_GROUP,MENU_HOBBY,0,R.string.hobby);
subMenuHobby.setIcon(R.drawable.hobby);
miaHobby[0] = subMenuHobby.add(HOBBY_GROUP,MENU_HOBBY1,0,R.string.hobby1);
miaHobby[1] = subMenuHobby.add(HOBBY_GROUP,MENU_HOBBY2,0,R.string.hobby2);
miaHobby[2] = subMenuHobby.add(HOBBY_GROUP,MENU_HOBBY3,0,R.string.hobby3);
miaHobby[0].setCheckable(true);
miaHobby[1].setCheckable(true);
miaHobby[2].setCheckable(true);
MenuItem ok = menu.add(GENDER_GROUP+2,MENU_OK,0,R.string.ok);
OnMenuItemClickListener lsn = new OnMenuItemClickListener(){
public boolean onMenuItemClick(MenuItem item) {
// TODO Auto-generated method stub
appendStateStr();
return true;
}
};
ok.setOnMenuItemClickListener(lsn);
ok.setAlphabeticShortcut('o');
return true;
}
public boolean onOptionsItemSelected(MenuItem mi){
switch(mi.getItemId()){
case MENU_GENDER_MALE:
case MENU_GENDER_FEMALE:
mi.setChecked(true);
appendStateStr();
break;
case MENU_HOBBY1:
case MENU_HOBBY2:
case MENU_HOBBY3:
mi.setChecked(!mi.isChecked());
appendStateStr();
break;
}
return true;
}
public void appendStateStr(){
String result = "您选择的性别为:";
if(male.isChecked()){
result = result +"男";
}else{
result+="女";
}
String hobbyStr="";
for(MenuItem mi:miaHobby){
if(mi.isChecked()){
hobbyStr = hobbyStr+mi.getTitle()+",";
}
}
if(hobbyStr.length()>0){
result=result+",您的爱好为:"+hobbyStr.substring(0,hobbyStr.length()-1)+"。\n";
}
else{
result = result+"。\n";
}
EditText et = (EditText) JavaTest.this.findViewById(R.id.editText1);
et.append(result);
}
}
2. 上下文菜单
ContextMenu继承自Menu。上下文菜单不同于选项菜单,选项菜单服务于Activity,而上下文菜单是注册到某个View对象上的。如果一个View对象注册了上下文菜单,用户可以通过长按该View对象以呼叫上下文菜单。
上下文菜单不支持快捷键,也不能附带图标,但是可以为上下文菜单的标题指定图标。
用法实例:
main.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:orientation="vertical" android:layout_width="fill_parent" android:id="@+id/linearLayout1">
- <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/editText1" android:text="@string/et1"></EditText>
- <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/editText2" android:text="@string/et2"></EditText>
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:orientation="vertical" android:layout_width="fill_parent" android:id="@+id/linearLayout1"> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/editText1" android:text="@string/et1"></EditText> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/editText2" android:text="@string/et2"></EditText> </LinearLayout>
Acticity:
- package qijia.si;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.ContextMenu;
- import android.view.MenuItem;
- import android.view.View;
- import android.widget.EditText;
- public class ContextMenuDemo extends Activity {
- //定义菜单编号
- final int MENU1 = 1;
- final int MENU2 = 2;
- final int MENU3 = 3;
- final int MENU4 = 4;
- final int MENU5 = 5;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //注册上下文菜单
- this.registerForContextMenu(findViewById(R.id.editText1));
- this.registerForContextMenu(findViewById(R.id.editText2));
- }
- //此方法在每次调用上下文菜单时都会被调用一次
- public void onCreateContextMenu (ContextMenu menu,View v,
- ContextMenu.ContextMenuInfo menuInfo){
- //为上下文设置标题图标
- menu.setHeaderIcon(R.drawable.header);
- //若是第一文本框
- if(v == findViewById(R.id.editText1)){
- //为上下文菜单添加菜单选项
- menu.add(0,MENU1,0,R.string.mi1);
- menu.add(0,MENU2,0,R.string.mi2);
- menu.add(0,MENU3,0,R.string.mi3);
- }else if(v == findViewById(R.id.editText2)){
- menu.add(0,MENU4,0,R.string.mi4);
- menu.add(0,MENU5,0,R.string.mi5);
- }
- }
- //菜单选项选中状态变化后的回调方法
- public boolean onContextItemSelected(MenuItem mi){
- //判断被选中的MenuItem
- switch(mi.getItemId()){
- case MENU1:
- case MENU2:
- case MENU3:
- EditText et1 = (EditText)this.findViewById(R.id.editText1);
- et1.append("\n"+mi.getTitle()+" 被按下");
- break;
- case MENU4:
- case MENU5:
- EditText et2 = (EditText)this.findViewById(R.id.editText2);
- et2.append("\n"+mi.getTitle()+" 被按下");
- break;
- }
- return true;
- }
- }
package qijia.si;
import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
public class ContextMenuDemo extends Activity {
//定义菜单编号
final int MENU1 = 1;
final int MENU2 = 2;
final int MENU3 = 3;
final int MENU4 = 4;
final int MENU5 = 5;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//注册上下文菜单
this.registerForContextMenu(findViewById(R.id.editText1));
this.registerForContextMenu(findViewById(R.id.editText2));
}
//此方法在每次调用上下文菜单时都会被调用一次
public void onCreateContextMenu (ContextMenu menu,View v,
ContextMenu.ContextMenuInfo menuInfo){
//为上下文设置标题图标
menu.setHeaderIcon(R.drawable.header);
//若是第一文本框
if(v == findViewById(R.id.editText1)){
//为上下文菜单添加菜单选项
menu.add(0,MENU1,0,R.string.mi1);
menu.add(0,MENU2,0,R.string.mi2);
menu.add(0,MENU3,0,R.string.mi3);
}else if(v == findViewById(R.id.editText2)){
menu.add(0,MENU4,0,R.string.mi4);
menu.add(0,MENU5,0,R.string.mi5);
}
}
//菜单选项选中状态变化后的回调方法
public boolean onContextItemSelected(MenuItem mi){
//判断被选中的MenuItem
switch(mi.getItemId()){
case MENU1:
case MENU2:
case MENU3:
EditText et1 = (EditText)this.findViewById(R.id.editText1);
et1.append("\n"+mi.getTitle()+" 被按下");
break;
case MENU4:
case MENU5:
EditText et2 = (EditText)this.findViewById(R.id.editText2);
et2.append("\n"+mi.getTitle()+" 被按下");
break;
}
return true;
}
}
3. 对话框
对话框是Activity运行时显示的小窗口,当显示对话框时,当前Activity失去焦点而由对话框负责所有的人机交互。一般来说,对话框用于提示消息或弹出一个与程序主进程直接相关的小程序。
Android平台下主要有以下几种对话框:
1) 提示对话框 AlertDialog
AlertDialog对话框可以包含若干按钮和一些可选的单选按钮或复选框。
2) 进度对话框
ProgressDialog可以显示进度轮或进度条,由于ProgressDialog继承自AlertDialog,所以其也可以添加按钮。
3) 日期选择对话框DatePickerDialog
4) 时间选择对话框TimePickerDialog
对话框是作为Activity的一部分被创建和显示的,在程序中通过开发回调方法onCreateDialog来完成对话框的创建,该方法需要传入代表对话框id参数。如果需要显示对话框,则调用showDialog方法传入对话框id来显示指定的对话框。
当对话框第一次被显示时,Android会调用onCreateDialog方法来创建对话框实例,之后将不再重复创建该实例。同时,每次对话框再被显示之前都会调用onPrepareDialog方法,如果补充些该方法,那么每次显示的对话框将是最初创建的那个。
关闭对话框可以调用Dialog类的dismiss方法来实现,但是要注意这种方法不会让对话框彻底消失,如果要对话框被关闭后彻底消失,要调用removeDialog方法并传入Dialog的id。
下面通过普通对话框的例子来说明如何使用:
main.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linearLayout1" android:layout_height="fill_parent" android:orientation="vertical" android:layout_width="fill_parent">
- <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/editText1" android:text="@string/blank" android:editable="false" android:cursorVisible="false"></EditText>
- <Button android:id="@+id/button1" android:layout_height="wrap_content" android:text="@string/btn" android:layout_width="fill_parent"></Button>
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linearLayout1" android:layout_height="fill_parent" android:orientation="vertical" android:layout_width="fill_parent"> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/editText1" android:text="@string/blank" android:editable="false" android:cursorVisible="false"></EditText> <Button android:id="@+id/button1" android:layout_height="wrap_content" android:text="@string/btn" android:layout_width="fill_parent"></Button> </LinearLayout>
Activity:
- package qijia.si;
- import android.app.Activity;
- import android.app.AlertDialog;
- import android.app.AlertDialog.Builder;
- import android.app.Dialog;
- import android.content.DialogInterface;
- import android.content.DialogInterface.OnClickListener;
- import android.os.Bundle;
- import android.view.ContextMenu;
- import android.view.MenuItem;
- import android.view.View;
- import android.widget.Button;
- import android.widget.EditText;
- public class ContextMenuDemo extends Activity {
- //普通对话框id
- final int COMMON_DIALOG = 1;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //获取Button对象
- Button btn = (Button)findViewById(R.id.button1);
- //为Button设置监听器
- btn.setOnClickListener(new View.OnClickListener() {
- public void onClick(View v) {
- // TODO Auto-generated method stub
- showDialog(COMMON_DIALOG);
- }
- });
- }
- //重写onCreateDialog方法
- public Dialog onCreateDialog(int id){
- //声明一个dialog对象用于返回
- Dialog dialog = null;
- switch(id){
- case COMMON_DIALOG:
- Builder b = new AlertDialog.Builder(this);
- //设置对话框图标
- b.setIcon(R.drawable.header);
- b.setTitle(R.string.btn);
- b.setMessage(R.string.dialog_msg);
- //添加按钮
- b.setPositiveButton(R.string.ok,
- new OnClickListener(){
- public void onClick(DialogInterface dialog, int which) {
- // TODO Auto-generated method stub
- EditText et = (EditText)findViewById(R.id.editText1);
- et.setText(R.string.dialog_msg);
- }
- });
- dialog = b.create();
- break;
- default:
- break;
- }
- return dialog;
- }
- }
package qijia.si;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class ContextMenuDemo extends Activity {
//普通对话框id
final int COMMON_DIALOG = 1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获取Button对象
Button btn = (Button)findViewById(R.id.button1);
//为Button设置监听器
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
showDialog(COMMON_DIALOG);
}
});
}
//重写onCreateDialog方法
public Dialog onCreateDialog(int id){
//声明一个dialog对象用于返回
Dialog dialog = null;
switch(id){
case COMMON_DIALOG:
Builder b = new AlertDialog.Builder(this);
//设置对话框图标
b.setIcon(R.drawable.header);
b.setTitle(R.string.btn);
b.setMessage(R.string.dialog_msg);
//添加按钮
b.setPositiveButton(R.string.ok,
new OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
EditText et = (EditText)findViewById(R.id.editText1);
et.setText(R.string.dialog_msg);
}
});
dialog = b.create();
break;
default:
break;
}
return dialog;
}
}
Android开发05—Android常用高级控件(下)
1. 滑块与进度条
1) ProgressBar类
ProgressBar类同样位于android.widget包下,但其继承自View,主要用于显示一些操作的进度。应用程序可以修改其长度表示当前后台操作的完成情况。因为进度条会移动,所以长时间加载某些资源或者执行某些耗时的操作时,不会使用户界面失去响应。
2) SeekBar类
SeekBar类继承自ProgressBar,是用来接收用户输入的控件。SeekBar类似于拖拉条,可以直观地显示用户需要的数据,常用于音量调节等场合。
3) 实例:
main.xml
Activity:
TabHost类位于android.widget包下,是选项卡的封装类,用于创建创建选项卡的窗口。TabHost继承自FrameLayout是帧布局的一种。
实例:
main.xml:
Activity:
Gallery是一种水平滚动的列表,一般情况下用来显示图片等资源,可以使图片在屏幕上滑来滑去。Gallery所显示的图片资源同样来自适配器。
Gallery是View的子类,Gallery控件可以在XML中配置,也可以再代码中操作。
实例:将需要显示的控件存放在BaseAdapter中,然后在适当的时间将此BaseAdapter设置Gallery控件使之显示。
main.xml
Activity:
1. 滑块与进度条
1) ProgressBar类
ProgressBar类同样位于android.widget包下,但其继承自View,主要用于显示一些操作的进度。应用程序可以修改其长度表示当前后台操作的完成情况。因为进度条会移动,所以长时间加载某些资源或者执行某些耗时的操作时,不会使用户界面失去响应。
2) SeekBar类
SeekBar类继承自ProgressBar,是用来接收用户输入的控件。SeekBar类似于拖拉条,可以直观地显示用户需要的数据,常用于音量调节等场合。
3) 实例:
main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/linearLayout1">
- <ProgressBar android:id="@+id/progressBar1" android:layout_height="wrap_content" android:layout_width="fill_parent" android:max="100" android:progress="20" style="@android:style/Widget.ProgressBar.Horizontal"></ProgressBar>
- <RatingBar android:layout_height="wrap_content" android:layout_width="wrap_content" android:max="5" android:rating="1" android:id="@+id/ratingBar1"></RatingBar>
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/linearLayout1"> <ProgressBar android:id="@+id/progressBar1" android:layout_height="wrap_content" android:layout_width="fill_parent" android:max="100" android:progress="20" style="@android:style/Widget.ProgressBar.Horizontal"></ProgressBar> <RatingBar android:layout_height="wrap_content" android:layout_width="wrap_content" android:max="5" android:rating="1" android:id="@+id/ratingBar1"></RatingBar> </LinearLayout>
Activity:
- package qijia.si;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.ProgressBar;
- import android.widget.RatingBar;
- public class JavaTest extends Activity {
- /** Called when the activity is first created. */
- final static double MAX = 100;
- final static double MAX_STAR = 5;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- RatingBar rb = (RatingBar) findViewById(R.id.ratingBar1);
- rb.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
- public void onRatingChanged(RatingBar ratingBar, float rating,
- boolean fromUser) {
- // TODO Auto-generated method stub
- ProgressBar pb = (ProgressBar) findViewById(R.id.progressBar1);
- RatingBar rb = (RatingBar) findViewById(R.id.ratingBar1);
- float rate = rb.getRating();
- pb.setProgress((int)(rate/MAX_STAR*MAX));
- }
- });
- }
- }
package qijia.si;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ProgressBar;
import android.widget.RatingBar;
public class JavaTest extends Activity {
/** Called when the activity is first created. */
final static double MAX = 100;
final static double MAX_STAR = 5;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
RatingBar rb = (RatingBar) findViewById(R.id.ratingBar1);
rb.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
public void onRatingChanged(RatingBar ratingBar, float rating,
boolean fromUser) {
// TODO Auto-generated method stub
ProgressBar pb = (ProgressBar) findViewById(R.id.progressBar1);
RatingBar rb = (RatingBar) findViewById(R.id.ratingBar1);
float rate = rb.getRating();
pb.setProgress((int)(rate/MAX_STAR*MAX));
}
});
}
}
2. 选项卡
TabHost类位于android.widget包下,是选项卡的封装类,用于创建创建选项卡的窗口。TabHost继承自FrameLayout是帧布局的一种。
实例:
main.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <FrameLayout android:id="@+id/frameLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android">
- <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal" android:orientation="vertical">
- <ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/imageView1" android:scaleType="fitXY" android:layout_gravity="center" android:src="@drawable/andy"></ImageView>
- <TextView android:layout_height="wrap_content" android:id="@+id/textView1" android:layout_width="wrap_content" android:text="@string/andy" android:textSize="24dip"></TextView>
- </LinearLayout>
- <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal" android:orientation="vertical" android:id="@+id/linearLayout2">
- <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView2" android:scaleType="fitXY" android:layout_gravity="center" android:src="@drawable/bill"></ImageView>
- <TextView android:layout_height="wrap_content" android:text="@string/bill" android:layout_width="wrap_content" android:id="@+id/textView2" android:textSize="24dip"></TextView>
- </LinearLayout>
- <LinearLayout android:layout_width="fill_parent" android:orientation="vertical" android:gravity="center_horizontal" android:layout_height="fill_parent" android:id="@+id/linearLayout3">
- <ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/imageView3" android:scaleType="fitXY" android:layout_gravity="center" android:src="@drawable/torvalds"></ImageView>
- <TextView android:layout_height="wrap_content" android:text="@string/linus" android:layout_width="wrap_content" android:id="@+id/textView3" android:textSize="24dip"></TextView>
- </LinearLayout>
- </FrameLayout>
<?xml version="1.0" encoding="utf-8"?> <FrameLayout android:id="@+id/frameLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal" android:orientation="vertical"> <ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/imageView1" android:scaleType="fitXY" android:layout_gravity="center" android:src="@drawable/andy"></ImageView> <TextView android:layout_height="wrap_content" android:id="@+id/textView1" android:layout_width="wrap_content" android:text="@string/andy" android:textSize="24dip"></TextView> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal" android:orientation="vertical" android:id="@+id/linearLayout2"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView2" android:scaleType="fitXY" android:layout_gravity="center" android:src="@drawable/bill"></ImageView> <TextView android:layout_height="wrap_content" android:text="@string/bill" android:layout_width="wrap_content" android:id="@+id/textView2" android:textSize="24dip"></TextView> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:orientation="vertical" android:gravity="center_horizontal" android:layout_height="fill_parent" android:id="@+id/linearLayout3"> <ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/imageView3" android:scaleType="fitXY" android:layout_gravity="center" android:src="@drawable/torvalds"></ImageView> <TextView android:layout_height="wrap_content" android:text="@string/linus" android:layout_width="wrap_content" android:id="@+id/textView3" android:textSize="24dip"></TextView> </LinearLayout> </FrameLayout>
Activity:
- package qijia.si;
- import android.app.Activity;
- import android.app.TabActivity;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.widget.ProgressBar;
- import android.widget.RatingBar;
- import android.widget.TabHost;
- public class JavaTest extends TabActivity {
- /** Called when the activity is first created. */
- private TabHost myTabhost;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- myTabhost = this.getTabHost();
- LayoutInflater.from(this).inflate(R.layout.main, myTabhost.getTabContentView(),true);
- myTabhost.addTab(myTabhost.newTabSpec("选项卡1").setIndicator("选项卡1",getResources().getDrawable(R.drawable.png1)).setContent(R.id.linearLayout1));
- myTabhost.addTab(myTabhost.newTabSpec("选项卡2").setIndicator("选项卡2",getResources().getDrawable(R.drawable.png2)).setContent(R.id.linearLayout2));
- myTabhost.addTab(myTabhost.newTabSpec("选项卡3").setIndicator("选项卡3",getResources().getDrawable(R.drawable.png3)).setContent(R.id.linearLayout3));
- }
- }
package qijia.si;
import android.app.Activity;
import android.app.TabActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.ProgressBar;
import android.widget.RatingBar;
import android.widget.TabHost;
public class JavaTest extends TabActivity {
/** Called when the activity is first created. */
private TabHost myTabhost;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myTabhost = this.getTabHost();
LayoutInflater.from(this).inflate(R.layout.main, myTabhost.getTabContentView(),true);
myTabhost.addTab(myTabhost.newTabSpec("选项卡1").setIndicator("选项卡1",getResources().getDrawable(R.drawable.png1)).setContent(R.id.linearLayout1));
myTabhost.addTab(myTabhost.newTabSpec("选项卡2").setIndicator("选项卡2",getResources().getDrawable(R.drawable.png2)).setContent(R.id.linearLayout2));
myTabhost.addTab(myTabhost.newTabSpec("选项卡3").setIndicator("选项卡3",getResources().getDrawable(R.drawable.png3)).setContent(R.id.linearLayout3));
}
}
3. 画廊控件
Gallery是一种水平滚动的列表,一般情况下用来显示图片等资源,可以使图片在屏幕上滑来滑去。Gallery所显示的图片资源同样来自适配器。
Gallery是View的子类,Gallery控件可以在XML中配置,也可以再代码中操作。
实例:将需要显示的控件存放在BaseAdapter中,然后在适当的时间将此BaseAdapter设置Gallery控件使之显示。
main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/linearLayout1" android:gravity="center_vertical">
- <Gallery android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/gallery1" android:spacing="10dip" android:unselectedAlpha="1"></Gallery>
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/linearLayout1" android:gravity="center_vertical"> <Gallery android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/gallery1" android:spacing="10dip" android:unselectedAlpha="1"></Gallery> </LinearLayout>
Activity:
- package qijia.si;
- import android.app.Activity;
- import android.app.TabActivity;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.AdapterView;
- import android.widget.AdapterView.OnItemClickListener;
- import android.widget.BaseAdapter;
- import android.widget.Gallery;
- import android.widget.ImageView;
- import android.widget.ProgressBar;
- import android.widget.RatingBar;
- import android.widget.TabHost;
- public class JavaTest extends Activity {
- /** Called when the activity is first created. */
- int[] imageIds={
- R.drawable.bbta,R.drawable.bbtb,R.drawable.bbtc,
- R.drawable.bbtd,R.drawable.bbte,R.drawable.bbtf,
- R.drawable.bbtg
- };
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Gallery g1 = (Gallery)this.findViewById(R.id.gallery1);
- BaseAdapter ba = new BaseAdapter(){
- public int getCount() {
- // TODO Auto-generated method stub
- return imageIds.length;
- }
- public Object getItem(int position) {
- // TODO Auto-generated method stub
- return null;
- }
- public long getItemId(int position) {
- // TODO Auto-generated method stub
- return 0;
- }
- public View getView(int position, View convertView, ViewGroup parent) {
- // TODO Auto-generated method stub
- ImageView iv = new ImageView(JavaTest.this);
- iv.setImageResource(imageIds[position]);
- iv.setScaleType(ImageView.ScaleType.FIT_XY);
- iv.setLayoutParams(new Gallery.LayoutParams(188,250));
- return iv;
- }
- };
- g1.setAdapter(ba);
- g1.setOnItemClickListener(
- new OnItemClickListener(){
- public void onItemClick(AdapterView<?> arg0, View arg1,
- int arg2, long arg3) {
- // TODO Auto-generated method stub
- Gallery g1 = (Gallery)findViewById(R.id.gallery1);
- g1.setSelection(arg2);
- }
- });
- }
- }
package qijia.si;
import android.app.Activity;
import android.app.TabActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RatingBar;
import android.widget.TabHost;
public class JavaTest extends Activity {
/** Called when the activity is first created. */
int[] imageIds={
R.drawable.bbta,R.drawable.bbtb,R.drawable.bbtc,
R.drawable.bbtd,R.drawable.bbte,R.drawable.bbtf,
R.drawable.bbtg
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Gallery g1 = (Gallery)this.findViewById(R.id.gallery1);
BaseAdapter ba = new BaseAdapter(){
public int getCount() {
// TODO Auto-generated method stub
return imageIds.length;
}
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ImageView iv = new ImageView(JavaTest.this);
iv.setImageResource(imageIds[position]);
iv.setScaleType(ImageView.ScaleType.FIT_XY);
iv.setLayoutParams(new Gallery.LayoutParams(188,250));
return iv;
}
};
g1.setAdapter(ba);
g1.setOnItemClickListener(
new OnItemClickListener(){
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
Gallery g1 = (Gallery)findViewById(R.id.gallery1);
g1.setSelection(arg2);
}
});
}
}
Android开发04—Android常用高级控件(上)
1. 自动完成文本框
AutoCompleteTextView类继承自EditText类。自动完成文本框的外观与文本框没什么区别,只是当用户输入某些文字时,会自动出现下拉菜单显示与输入文字相关的信息。
自动完成文本框可以在XML文件中使用属性进行设置,也可以在Java代码中通过方法进行设置。
实例:
main.xml:
Activity:
2. 滚动视图
ScrollView类继承自FrameLayout类。ScrollView其实是一个帧布局,一般情况下,其中的控件是按照线性进行布局的,用户可以对其进行滚动。
ScrollView既可以在XML中配置也可在Java代码中进行配置。
ScrollView的使用方法比较简单,只需要将需要滚动的控件添加到ScrollView中即可。ScrollView同一时刻只能包含一个View。
具体方法:
3. 列表视图
ListView类是一种列表视图,将ListAdapter所提供的各个控件显示在一个垂直且可以滚动的列表中。
该类使用方法简单,只需要先初始化所需要得数据,然后创建适配器并将其设置给ListView,ListView便将信息以列表的形式显示到页面中。
使用案例:
string.xml
colors.xml
Activity:
GridView类同样位于android.widget包下。该视图将其空间以二维格式显示到表格中,而这些控件全部来自于ListAdapter适配器。
strings.xml
colors.xml
1. 自动完成文本框
AutoCompleteTextView类继承自EditText类。自动完成文本框的外观与文本框没什么区别,只是当用户输入某些文字时,会自动出现下拉菜单显示与输入文字相关的信息。
自动完成文本框可以在XML文件中使用属性进行设置,也可以在Java代码中通过方法进行设置。
实例:
main.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/linearLayout1">
- <AutoCompleteTextView android:text="AutoCompleteTextView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/autoCompleteTextView1"></AutoCompleteTextView>
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/linearLayout1"> <AutoCompleteTextView android:text="AutoCompleteTextView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/autoCompleteTextView1"></AutoCompleteTextView> </LinearLayout>
Activity:
- package qijia.si;
- import android.app.Activity;
- import android.graphics.drawable.AnimationDrawable;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.ArrayAdapter;
- import android.widget.AutoCompleteTextView;
- import android.widget.Button;
- import android.widget.ImageView;
- public class MyAndroidProject extends Activity {
- private static final String[] myStr = new String[]{
- "aaa","bbb","ccc","aab","aac","aad"
- }; //常量数组用于提示
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- ArrayAdapter<String> aa = new ArrayAdapter<String>(
- this,
- android.R.layout.simple_dropdown_item_1line,
- myStr
- );//使用适配器
- AutoCompleteTextView myAuto = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1);
- myAuto.setAdapter(aa);
- myAuto.setThreshold(1);
- }
- }
package qijia.si;
import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.ImageView;
public class MyAndroidProject extends Activity {
private static final String[] myStr = new String[]{
"aaa","bbb","ccc","aab","aac","aad"
}; //常量数组用于提示
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ArrayAdapter<String> aa = new ArrayAdapter<String>(
this,
android.R.layout.simple_dropdown_item_1line,
myStr
);//使用适配器
AutoCompleteTextView myAuto = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1);
myAuto.setAdapter(aa);
myAuto.setThreshold(1);
}
}
2. 滚动视图
ScrollView类继承自FrameLayout类。ScrollView其实是一个帧布局,一般情况下,其中的控件是按照线性进行布局的,用户可以对其进行滚动。
ScrollView既可以在XML中配置也可在Java代码中进行配置。
ScrollView的使用方法比较简单,只需要将需要滚动的控件添加到ScrollView中即可。ScrollView同一时刻只能包含一个View。
具体方法:
- package qijia.si;
- import android.app.Activity;
- import android.graphics.drawable.AnimationDrawable;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.ArrayAdapter;
- import android.widget.AutoCompleteTextView;
- import android.widget.Button;
- import android.widget.ImageView;
- import android.widget.ScrollView;
- import android.widget.TextView;
- public class MyAndroidProject extends Activity {
- ScrollView scrollView;
- String msg = "我是字符串,我很长很长!我是字符串,我很长很长!";
- String str = "";
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- scrollView = new ScrollView(this);
- TextView tv = new TextView(this);
- tv.setTextSize(23);
- for(int i = 0;i<10;i++){
- str = str + msg;
- }
- tv.setText(str);
- scrollView.addView(tv);
- setContentView(scrollView);
- }
- }
package qijia.si;
import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ScrollView;
import android.widget.TextView;
public class MyAndroidProject extends Activity {
ScrollView scrollView;
String msg = "我是字符串,我很长很长!我是字符串,我很长很长!";
String str = "";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
scrollView = new ScrollView(this);
TextView tv = new TextView(this);
tv.setTextSize(23);
for(int i = 0;i<10;i++){
str = str + msg;
}
tv.setText(str);
scrollView.addView(tv);
setContentView(scrollView);
}
}
3. 列表视图
ListView类是一种列表视图,将ListAdapter所提供的各个控件显示在一个垂直且可以滚动的列表中。
该类使用方法简单,只需要先初始化所需要得数据,然后创建适配器并将其设置给ListView,ListView便将信息以列表的形式显示到页面中。
使用案例:
string.xml
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="app_name">AbsoluteExample</string>
- <string name="hello">您选择了</string>
- <string name="andy">Andy Rubin \nAndroid的创造者之一</string>
- <string name="Bill">Bill Joy \nJava创造者之一</string>
- <string name="edgar">Edgar F. Codd \n关系数据库之父</string>
- <string name="torvalds">Linus Torvalds \nLinux之父</string>
- <string name="turing">Turing Alan \nIT的祖师爷</string>
- <string name="ys">您选择了</string>
- </resources>
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">AbsoluteExample</string> <string name="hello">您选择了</string> <string name="andy">Andy Rubin \nAndroid的创造者之一</string> <string name="Bill">Bill Joy \nJava创造者之一</string> <string name="edgar">Edgar F. Codd \n关系数据库之父</string> <string name="torvalds">Linus Torvalds \nLinux之父</string> <string name="turing">Turing Alan \nIT的祖师爷</string> <string name="ys">您选择了</string> </resources>
colors.xml
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <color name="white">#ffffff</color>
- <color name="red">#ff0000</color>
- <color name="black">#000000</color>
- <color name="green">#00ff00</color>
- <color name="gray">#050505</color>
- <color name="blue">#0000ff</color>
- </resources>
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="white">#ffffff</color> <color name="red">#ff0000</color> <color name="black">#000000</color> <color name="green">#00ff00</color> <color name="gray">#050505</color> <color name="blue">#0000ff</color> </resources>main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent">
- <TextView android:layout_height="wrap_content" android:id="@+id/textView1" android:layout_width="fill_parent" android:textSize="24dip" android:textColor="@color/white" android:text="@string/hello"></TextView>
- <ListView android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/listView1" android:choiceMode="singleChoice"></ListView>
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_height="wrap_content" android:id="@+id/textView1" android:layout_width="fill_parent" android:textSize="24dip" android:textColor="@color/white" android:text="@string/hello"></TextView> <ListView android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/listView1" android:choiceMode="singleChoice"></ListView> </LinearLayout>
Activity:
- package qijia.si;
- import android.app.Activity;
- import android.graphics.drawable.AnimationDrawable;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.ViewGroup;
- import android.widget.AdapterView;
- import android.widget.AdapterView.OnItemClickListener;
- import android.widget.AdapterView.OnItemSelectedListener;
- import android.widget.ArrayAdapter;
- import android.widget.AutoCompleteTextView;
- import android.widget.BaseAdapter;
- import android.widget.Button;
- import android.widget.Gallery;
- import android.widget.ImageView;
- import android.widget.LinearLayout;
- import android.widget.ListView;
- import android.widget.ScrollView;
- import android.widget.TextView;
- public class MyAndroidProject extends Activity {
- int[] drawableIds = {R.drawable.andy,R.drawable.bill,R.drawable.edgar,R.drawable.torvalds,
- R.drawable.turing};
- int[] msgIds = {R.string.andy,R.string.Bill,R.string.edgar,R.string.torvalds,R.string.turing};
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- ListView lv = (ListView) findViewById(R.id.listView1);
- BaseAdapter ba = new BaseAdapter(){
- public int getCount() {return 5;}
- public Object getItem(int arg0){return null;}
- public long getItemId(int arg0){return 0;}
- public View getView(int arg0,View arg1, ViewGroup arg2){
- //动态生成每一个下拉项对应的View,每个下拉项View由LinearLayout
- //中包含一个ImageView及一个TextView,由代码动态生成
- LinearLayout ll = new LinearLayout(MyAndroidProject.this);
- ll.setOrientation(LinearLayout.HORIZONTAL);
- ll.setPadding(5, 5, 5, 5);
- ImageView ii = new ImageView(MyAndroidProject.this);
- ii.setImageDrawable(getResources().getDrawable(drawableIds[arg0]));
- ii.setScaleType(ImageView.ScaleType.FIT_XY);
- ii.setLayoutParams(new Gallery.LayoutParams(100,98));
- ll.addView(ii);
- TextView tv = new TextView(MyAndroidProject.this);
- tv.setText(getResources().getText(msgIds[arg0]));
- tv.setTextSize(24);
- tv.setTextColor(MyAndroidProject.this.getResources().getColor(R.color.white));
- tv.setPadding(5, 5, 5, 5);
- ll.addView(tv);
- return ll;
- }
- };
- lv.setAdapter(ba);
- lv.setOnItemSelectedListener(new OnItemSelectedListener(){
- public void onItemSelected(AdapterView<?> arg0,View arg1, int arg2,long arg3){
- TextView tv = (TextView) findViewById(R.id.textView1);
- LinearLayout ll = (LinearLayout)arg1;
- TextView tvn = (TextView)ll.getChildAt(1);
- StringBuilder sb = new StringBuilder();
- sb.append(getResources().getText(R.string.ys));
- sb.append(":");
- sb.append(tvn.getText());
- String stemp = sb.toString();
- tv.setText(stemp.split("\\n")[0]);
- }
- public void onNothingSelected(AdapterView<?> arg0){}
- });
- lv.setOnItemClickListener(new OnItemClickListener(){
- public void onItemClick(AdapterView<?> arg0,View arg1,int arg2,long arg3){
- TextView tv = (TextView) findViewById(R.id.textView1);
- LinearLayout ll =(LinearLayout) arg1;
- TextView tvn = (TextView)ll.getChildAt(1);
- StringBuilder sb = new StringBuilder();
- sb.append(getResources().getText(R.string.ys));
- sb.append(":");
- sb.append(tvn.getText());
- String stemp = sb.toString();
- tv.setText(stemp.split("\\n")[0]);
- }
- });
- }
- }
package qijia.si;
import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ScrollView;
import android.widget.TextView;
public class MyAndroidProject extends Activity {
int[] drawableIds = {R.drawable.andy,R.drawable.bill,R.drawable.edgar,R.drawable.torvalds,
R.drawable.turing};
int[] msgIds = {R.string.andy,R.string.Bill,R.string.edgar,R.string.torvalds,R.string.turing};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView lv = (ListView) findViewById(R.id.listView1);
BaseAdapter ba = new BaseAdapter(){
public int getCount() {return 5;}
public Object getItem(int arg0){return null;}
public long getItemId(int arg0){return 0;}
public View getView(int arg0,View arg1, ViewGroup arg2){
//动态生成每一个下拉项对应的View,每个下拉项View由LinearLayout
//中包含一个ImageView及一个TextView,由代码动态生成
LinearLayout ll = new LinearLayout(MyAndroidProject.this);
ll.setOrientation(LinearLayout.HORIZONTAL);
ll.setPadding(5, 5, 5, 5);
ImageView ii = new ImageView(MyAndroidProject.this);
ii.setImageDrawable(getResources().getDrawable(drawableIds[arg0]));
ii.setScaleType(ImageView.ScaleType.FIT_XY);
ii.setLayoutParams(new Gallery.LayoutParams(100,98));
ll.addView(ii);
TextView tv = new TextView(MyAndroidProject.this);
tv.setText(getResources().getText(msgIds[arg0]));
tv.setTextSize(24);
tv.setTextColor(MyAndroidProject.this.getResources().getColor(R.color.white));
tv.setPadding(5, 5, 5, 5);
ll.addView(tv);
return ll;
}
};
lv.setAdapter(ba);
lv.setOnItemSelectedListener(new OnItemSelectedListener(){
public void onItemSelected(AdapterView<?> arg0,View arg1, int arg2,long arg3){
TextView tv = (TextView) findViewById(R.id.textView1);
LinearLayout ll = (LinearLayout)arg1;
TextView tvn = (TextView)ll.getChildAt(1);
StringBuilder sb = new StringBuilder();
sb.append(getResources().getText(R.string.ys));
sb.append(":");
sb.append(tvn.getText());
String stemp = sb.toString();
tv.setText(stemp.split("\\n")[0]);
}
public void onNothingSelected(AdapterView<?> arg0){}
});
lv.setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> arg0,View arg1,int arg2,long arg3){
TextView tv = (TextView) findViewById(R.id.textView1);
LinearLayout ll =(LinearLayout) arg1;
TextView tvn = (TextView)ll.getChildAt(1);
StringBuilder sb = new StringBuilder();
sb.append(getResources().getText(R.string.ys));
sb.append(":");
sb.append(tvn.getText());
String stemp = sb.toString();
tv.setText(stemp.split("\\n")[0]);
}
});
}
}
4. 网络视图
GridView类同样位于android.widget包下。该视图将其空间以二维格式显示到表格中,而这些控件全部来自于ListAdapter适配器。
strings.xml
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="hello">当前无选中选项</string>
- <string name="app_name">Sample_5_3</string>
- <string name="andy">Andy Rubin</string>
- <string name="bill">Bill Joy</string>
- <string name="edgar">Edgar F. Codd</string>
- <string name="torvalds">Linus Torvalds</string>
- <string name="turing">Turing Alan</string>
- <string name="andydis">Android的创造者</string>
- <string name="billdis">Java创造者之一</string>
- <string name="edgardis">关系数据库之父</string>
- <string name="torvaldsdis">Linux之父</string>
- <string name="turingdis">IT的祖师爷</string>
- </resources>
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">当前无选中选项</string> <string name="app_name">Sample_5_3</string> <string name="andy">Andy Rubin</string> <string name="bill">Bill Joy</string> <string name="edgar">Edgar F. Codd</string> <string name="torvalds">Linus Torvalds</string> <string name="turing">Turing Alan</string> <string name="andydis">Android的创造者</string> <string name="billdis">Java创造者之一</string> <string name="edgardis">关系数据库之父</string> <string name="torvaldsdis">Linux之父</string> <string name="turingdis">IT的祖师爷</string> </resources>
colors.xml
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <color name="red">#fd8d8d</color>
- <color name="green">#9cfda3</color>
- <color name="blue">#8d9dfd</color>
- <color name="white">#FFFFFF</color>
- <color name="black">#000000</color>
- <color name="gray">#050505</color>
- </resources>
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="red">#fd8d8d</color> <color name="green">#9cfda3</color> <color name="blue">#8d9dfd</color> <color name="white">#FFFFFF</color> <color name="black">#000000</color> <color name="gray">#050505</color> </resources>main.xml
- <?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"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/hello"
- android:textColor="@color/white"
- android:textSize="24dip"/>
- <GridView
- android:id="@+id/GridView01"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:verticalSpacing="5dip"
- android:horizontalSpacing="5dip"
- android:stretchMode="columnWidth"/>
- </LinearLayout>
<?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" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" android:textColor="@color/white" android:textSize="24dip"/> <GridView android:id="@+id/GridView01" android:layout_width="fill_parent" android:layout_height="fill_parent" android:verticalSpacing="5dip" android:horizontalSpacing="5dip" android:stretchMode="columnWidth"/> </LinearLayout>grid_row.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout
- android:id="@+id/LinearLayout01"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- xmlns:android="http://schemas.android.com/apk/res/android">
- <ImageView
- android:id="@+id/ImageView01"
- android:scaleType="fitXY"
- android:layout_width="100dip"
- android:layout_height="98dip"/>
- <TextView
- android:id="@+id/TextView02"
- android:layout_width="100dip"
- android:layout_height="wrap_content"
- android:textColor="@color/white"
- android:textSize="24dip"
- android:paddingLeft="5dip"/>
- <TextView
- android:id="@+id/TextView03"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="@color/white"
- android:textSize="24dip"
- android:paddingLeft="5dip"/>
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id="@+id/LinearLayout01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" xmlns:android="http://schemas.android.com/apk/res/android"> <ImageView android:id="@+id/ImageView01" android:scaleType="fitXY" android:layout_width="100dip" android:layout_height="98dip"/> <TextView android:id="@+id/TextView02" android:layout_width="100dip" android:layout_height="wrap_content" android:textColor="@color/white" android:textSize="24dip" android:paddingLeft="5dip"/> <TextView android:id="@+id/TextView03" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/white" android:textSize="24dip" android:paddingLeft="5dip"/> </LinearLayout>Activity:
- package qijia.si;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.AdapterView;
- import android.widget.GridView;
- import android.widget.LinearLayout;
- import android.widget.SimpleAdapter;
- import android.widget.TextView;
- import android.widget.AdapterView.OnItemClickListener;
- import android.widget.AdapterView.OnItemSelectedListener;
- public class GridDemo extends Activity {
- //所有资源图片(andy、bill、edgar、torvalds、turing)id的数组
- int[] drawableIds=
- {R.drawable.andy,R.drawable.bill,R.drawable.edgar,R.drawable.torvalds,R.drawable.turing};
- //所有资源字符串(andy、bill、edgar、torvalds、turing)id的数组
- int[] nameIds=
- {R.string.andy,R.string.bill,R.string.edgar,R.string.torvalds,R.string.turing};
- int[] msgIds=
- {R.string.andydis,R.string.billdis,R.string.edgardis,
- R.string.torvaldsdis,R.string.turingdis};
- public List<? extends Map<String, ?>> generateDataList(){
- ArrayList<Map<String,Object>> list=new ArrayList<Map<String,Object>>();;
- int rowCounter=drawableIds.length;//得到表格的行数
- for(int i=0;i<rowCounter;i++){//循环生成每行的包含对应各个列数据的Map;col1、col2、col3为列名
- HashMap<String,Object> hmap=new HashMap<String,Object>();
- hmap.put("col1", drawableIds[i]); //第一列为图片
- hmap.put("col2", this.getResources().getString(nameIds[i]));//第二例为姓名
- hmap.put("col3", this.getResources().getString(msgIds[i]));//第三列为描述
- list.add(hmap);
- }
- return list;
- }
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- GridView gv=(GridView)this.findViewById(R.id.GridView01);
- SimpleAdapter sca=new SimpleAdapter(
- this,
- generateDataList(), //数据List
- R.layout.grid_row, //行对应layout id
- new String[]{"col1","col2","col3"}, //列名列表
- new int[]{R.id.ImageView01,R.id.TextView02,R.id.TextView03}//列对应控件id列表
- );
- gv.setAdapter(sca);//为GridView设置数据适配器
- gv.setOnItemSelectedListener(//设置选项选中的监听器
- new OnItemSelectedListener(){
- public void onItemSelected(AdapterView<?> arg0, View arg1,
- int arg2, long arg3) {//重写选项被选中事件的处理方法
- TextView tv=(TextView)findViewById(R.id.TextView01);//获取主界面TextView
- LinearLayout ll=(LinearLayout)arg1;//获取当前选中选项对应的LinearLayout
- TextView tvn=(TextView)ll.getChildAt(1);//获取其中的TextView
- TextView tvnL=(TextView)ll.getChildAt(2);//获取其中的TextView
- StringBuilder sb=new StringBuilder();
- sb.append(tvn.getText());//获取姓名信息
- sb.append(" ");
- sb.append(tvnL.getText());//获取描述信息
- tv.setText(sb.toString());//信息设置进主界面TextView
- }
- public void onNothingSelected(AdapterView<?> arg0){}
- }
- );
- gv.setOnItemClickListener( //设置选项被单击的监听器
- new OnItemClickListener(){
- public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
- long arg3) {//重写选项被单击事件的处理方法
- TextView tv=(TextView)findViewById(R.id.TextView01);//获取主界面TextView
- LinearLayout ll=(LinearLayout)arg1;//获取当前选中选项对应的LinearLayout
- TextView tvn=(TextView)ll.getChildAt(1);//获取其中的TextView
- TextView tvnL=(TextView)ll.getChildAt(2);//获取其中的TextView
- StringBuilder sb=new StringBuilder();
- sb.append(tvn.getText());//获取姓名信息
- sb.append(" ");
- sb.append(tvnL.getText());//获取描述信息
- tv.setText(sb.toString());//信息设置进主界面TextView
- }
- }
- );
- }
- }
package qijia.si;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.LinearLayout;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
public class GridDemo extends Activity {
//所有资源图片(andy、bill、edgar、torvalds、turing)id的数组
int[] drawableIds=
{R.drawable.andy,R.drawable.bill,R.drawable.edgar,R.drawable.torvalds,R.drawable.turing};
//所有资源字符串(andy、bill、edgar、torvalds、turing)id的数组
int[] nameIds=
{R.string.andy,R.string.bill,R.string.edgar,R.string.torvalds,R.string.turing};
int[] msgIds=
{R.string.andydis,R.string.billdis,R.string.edgardis,
R.string.torvaldsdis,R.string.turingdis};
public List<? extends Map<String, ?>> generateDataList(){
ArrayList<Map<String,Object>> list=new ArrayList<Map<String,Object>>();;
int rowCounter=drawableIds.length;//得到表格的行数
for(int i=0;i<rowCounter;i++){//循环生成每行的包含对应各个列数据的Map;col1、col2、col3为列名
HashMap<String,Object> hmap=new HashMap<String,Object>();
hmap.put("col1", drawableIds[i]); //第一列为图片
hmap.put("col2", this.getResources().getString(nameIds[i]));//第二例为姓名
hmap.put("col3", this.getResources().getString(msgIds[i]));//第三列为描述
list.add(hmap);
}
return list;
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GridView gv=(GridView)this.findViewById(R.id.GridView01);
SimpleAdapter sca=new SimpleAdapter(
this,
generateDataList(), //数据List
R.layout.grid_row, //行对应layout id
new String[]{"col1","col2","col3"}, //列名列表
new int[]{R.id.ImageView01,R.id.TextView02,R.id.TextView03}//列对应控件id列表
);
gv.setAdapter(sca);//为GridView设置数据适配器
gv.setOnItemSelectedListener(//设置选项选中的监听器
new OnItemSelectedListener(){
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {//重写选项被选中事件的处理方法
TextView tv=(TextView)findViewById(R.id.TextView01);//获取主界面TextView
LinearLayout ll=(LinearLayout)arg1;//获取当前选中选项对应的LinearLayout
TextView tvn=(TextView)ll.getChildAt(1);//获取其中的TextView
TextView tvnL=(TextView)ll.getChildAt(2);//获取其中的TextView
StringBuilder sb=new StringBuilder();
sb.append(tvn.getText());//获取姓名信息
sb.append(" ");
sb.append(tvnL.getText());//获取描述信息
tv.setText(sb.toString());//信息设置进主界面TextView
}
public void onNothingSelected(AdapterView<?> arg0){}
}
);
gv.setOnItemClickListener( //设置选项被单击的监听器
new OnItemClickListener(){
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {//重写选项被单击事件的处理方法
TextView tv=(TextView)findViewById(R.id.TextView01);//获取主界面TextView
LinearLayout ll=(LinearLayout)arg1;//获取当前选中选项对应的LinearLayout
TextView tvn=(TextView)ll.getChildAt(1);//获取其中的TextView
TextView tvnL=(TextView)ll.getChildAt(2);//获取其中的TextView
StringBuilder sb=new StringBuilder();
sb.append(tvn.getText());//获取姓名信息
sb.append(" ");
sb.append(tvnL.getText());//获取描述信息
tv.setText(sb.toString());//信息设置进主界面TextView
}
}
);
}
}
Android的adapter总结和深入研究
Adapter是把数据和用户界面视图绑定的桥梁类。Adapter负责创建用来表示父视图中的每一个条目的子视图,并且提供对底层数据的访问。
支持Adapter绑定的用户界面必须对AdapterView抽象类进行拓展。也可以创建新的由AdapterView派生的控件,创建新的Adapter类绑定他们。
两个最通用的本地Adapter
ArrayAdapter ArrayAdapter使用泛型来把Adapter视图(View)绑定到一个指定类的对象的数组。默认情况下,ArrayAdapter使用数组中每个对象的toString值来创建和填充文本视图。
SimpleCursorAdapter SimpleCursorAdapter可以把一个布局中指定的视图和内容提供器查询返回的游标列绑定在一起。
定制ArrayAdapter
默认情况下,ArrayAdapter将使用它绑定到的对象数组的toString值来填充指定布局中可用的TextView
最常见的例子便是ListView
我们在定义一个ListView组件后,在向ListView组件装载数据之前需要创建一个Adapter对象,
ArrayAdapter<String> AdapterName = new ArrayAdapter<String>(
this,
android.R.layout.simple_list_itme_1,
data);
以上代码中创建了一个android.wedget.ArrayAdapter 对象。ArrayAdapter类的构造方法需要一个android.content.Context对象,因此传入当前Activity的对象实例(this)作为ArrayAdapter类的构造方法的第一个参数值。除此之外,ArrayAdapter还需要完成:
指定列表项模板(第二个参数)
指定列表项中的数据。(第三个参数)
在创建玩Adapter对象后,调用setAdapter方法,ListView组件的每一个列表都会使用simple_list_item_1.xml文件定义的模板来显示,并将data数组中的每一个元素复制给每一个列表项
下面我们来讨论下定制ArrayAdapter
在大多数情况下,我们都要定制用于表示每个视图的布局。所以,需要使用特定类型的变体Adapter来扩展ArrayAdapter,并重写getView方法来向布局视图分配对象属性。
getView方法用于构造,扩充和填充将在父AdapterView类(如ListView)中显示的视图,该父AdapterView类使用这个Adapter绑定到底层的数组。
getView方法接收描述要显示的条目的位置,要更新的视图(或null),以及将包含这个视图的视图组作为参数。调用getItem将返回存储在底层数组的指定索引位置的值。
例如对与ListView来说:
自定义的Adapter类一般需要从android.widget.BaseAdapter类继承。在BaseAdapter类中有两个重要方法:getView和getCount。其中ListView在显示某一列表项是会调用getView方法返回要显示的列表项的View对象,这一点我们上面已经提到了。getCount方法返回当前ListView组件中列表项的总数。
注意:列表项的View对象一定要在getView方法中创建。不能事先创建好View对象,然后再getView方法中返回这些View对象。如果这样做,系统可能会出现一些异常现象
Adapter是把数据和用户界面视图绑定的桥梁类。Adapter负责创建用来表示父视图中的每一个条目的子视图,并且提供对底层数据的访问。
支持Adapter绑定的用户界面必须对AdapterView抽象类进行拓展。也可以创建新的由AdapterView派生的控件,创建新的Adapter类绑定他们。
两个最通用的本地Adapter
ArrayAdapter ArrayAdapter使用泛型来把Adapter视图(View)绑定到一个指定类的对象的数组。默认情况下,ArrayAdapter使用数组中每个对象的toString值来创建和填充文本视图。
SimpleCursorAdapter SimpleCursorAdapter可以把一个布局中指定的视图和内容提供器查询返回的游标列绑定在一起。
定制ArrayAdapter
默认情况下,ArrayAdapter将使用它绑定到的对象数组的toString值来填充指定布局中可用的TextView
最常见的例子便是ListView
我们在定义一个ListView组件后,在向ListView组件装载数据之前需要创建一个Adapter对象,
ArrayAdapter<String> AdapterName = new ArrayAdapter<String>(
this,
android.R.layout.simple_list_itme_1,
data);
以上代码中创建了一个android.wedget.ArrayAdapter 对象。ArrayAdapter类的构造方法需要一个android.content.Context对象,因此传入当前Activity的对象实例(this)作为ArrayAdapter类的构造方法的第一个参数值。除此之外,ArrayAdapter还需要完成:
指定列表项模板(第二个参数)
指定列表项中的数据。(第三个参数)
在创建玩Adapter对象后,调用setAdapter方法,ListView组件的每一个列表都会使用simple_list_item_1.xml文件定义的模板来显示,并将data数组中的每一个元素复制给每一个列表项
下面我们来讨论下定制ArrayAdapter
在大多数情况下,我们都要定制用于表示每个视图的布局。所以,需要使用特定类型的变体Adapter来扩展ArrayAdapter,并重写getView方法来向布局视图分配对象属性。
getView方法用于构造,扩充和填充将在父AdapterView类(如ListView)中显示的视图,该父AdapterView类使用这个Adapter绑定到底层的数组。
getView方法接收描述要显示的条目的位置,要更新的视图(或null),以及将包含这个视图的视图组作为参数。调用getItem将返回存储在底层数组的指定索引位置的值。
例如对与ListView来说:
自定义的Adapter类一般需要从android.widget.BaseAdapter类继承。在BaseAdapter类中有两个重要方法:getView和getCount。其中ListView在显示某一列表项是会调用getView方法返回要显示的列表项的View对象,这一点我们上面已经提到了。getCount方法返回当前ListView组件中列表项的总数。
注意:列表项的View对象一定要在getView方法中创建。不能事先创建好View对象,然后再getView方法中返回这些View对象。如果这样做,系统可能会出现一些异常现象
Android开发03—Android常用基本控件(下)
1. 单选按钮和复选按钮
CheckBox和RadioButton控件都只有选中和未选中两种状态,不同的是RadioButton是单选按钮,需要便知道RadioGroup中,同一时刻一个RadioGroup中只能有一个按钮处于选中状态。
使用举例:
ImageView控件负责显示图片,其图片的来源既可以是资源文件的id,也可以是Drawable对象或BitMap对象,还可以是ContentProvider的Uri。
实例:ImageView的用法
string.xml
Activity部分代码:
3. 时钟控件
AnalogClock和DigitalClock都负责显示时钟,所不同的是AnalogClock控件显示模拟时钟,且只显示时针和分针,而digital显示数字时钟,可精确到秒
直接在main.xml中定义时钟控件即可。
4. 日期与时间选择控件
DatePicker继承自FrameLayout类,主要功能是向用户提供包含年,月,日的日期数据,并允许用户进行选择。如果要捕获用户修改日期选择控件中数据的时间,需要为DatePicker添加onDateChangedListener监听器。
TimePicker同样继承自FrameLayout类。时间选择控件向用户显示一天中的时间,并允许用户进行选择,如果要捕获用户修改时间数据的时间,便需要为TimePicker添加OnTimeChangedListener监听器。
案例:
main.xml
Activity:
5. 动画播放技术
动画播放技术主要有两种:帧动画和补间动画。
1) 帧动画
帧动画主要用到的类是AnimationDrawable,每个帧动画都是一个AnimationDrawable对象
定义帧动画可以在代码中直接进行,也可以通过XML文件进行定义,定义帧动画的XML文件将存放在res/anim目录下。XML文件中指定了图片图片帧出现的顺序及每个帧的连续时间。
anim.xml
main.xml
Activity:
补间动画作用于View对象,主要包括View对象的位置,尺寸,旋转角度和透明度的变换。
补间动画可以通过XML声明也可以在代码中动态定义。推荐使用XML因为XML文件可读性及可用性高,方便替换。
1. 单选按钮和复选按钮
CheckBox和RadioButton控件都只有选中和未选中两种状态,不同的是RadioButton是单选按钮,需要便知道RadioGroup中,同一时刻一个RadioGroup中只能有一个按钮处于选中状态。
使用举例:
- public class SampleDemo extends Activity
- {
- public void onCreate(Bundle savedInstanceState){
- super.onCreate(savedInstatceState);
- setContentView(R.layout.main);
- CheckBox cb = (CheckBox) findViewById(R.id.CheckBox1);
- cb.setOnCheckedChangeListener(new OnCheckedChangeListener(){
- public void onCheckedChanged(CompoundButton buttonView,boolean isChecked){
- setBulbState(isChecked);
- }
- });
- RadioButton rb = (RadioButton) findViewById(R.id.off);
- rb.setOnCheckedChangeListener(new OnCheckedChangeListener(){
- public void onCheckedChanged(CompoundButton buttonView,boolean isChecked){
- setBulbState(isChecked);
- }
- });
- }
- public void setBulbState(boolean state){
- ImageView iv = (ImageView) findViewById(R.id.ImageView01);
- iv.setImageResource((state)?R.drawable.bulb_on:R.drawable.bulb_off);
- CheckBox cb = (CheckBox) this.findViewById(R.id.CheckBox1);
- cb.setText((state)?R.string.off:R.string.on);
- cb.setChecked(state);
- RadioButton rb = (RadioButton) this.findViewById(R.id.off);
- rb.setChecked(state);
- rb = (RadioButton) findViewById(R.id.on);
- rb.setChecked(state);
- }
- }
public class SampleDemo extends Activity
{
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstatceState);
setContentView(R.layout.main);
CheckBox cb = (CheckBox) findViewById(R.id.CheckBox1);
cb.setOnCheckedChangeListener(new OnCheckedChangeListener(){
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked){
setBulbState(isChecked);
}
});
RadioButton rb = (RadioButton) findViewById(R.id.off);
rb.setOnCheckedChangeListener(new OnCheckedChangeListener(){
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked){
setBulbState(isChecked);
}
});
}
public void setBulbState(boolean state){
ImageView iv = (ImageView) findViewById(R.id.ImageView01);
iv.setImageResource((state)?R.drawable.bulb_on:R.drawable.bulb_off);
CheckBox cb = (CheckBox) this.findViewById(R.id.CheckBox1);
cb.setText((state)?R.string.off:R.string.on);
cb.setChecked(state);
RadioButton rb = (RadioButton) this.findViewById(R.id.off);
rb.setChecked(state);
rb = (RadioButton) findViewById(R.id.on);
rb.setChecked(state);
}
}
2. 图片控件
ImageView控件负责显示图片,其图片的来源既可以是资源文件的id,也可以是Drawable对象或BitMap对象,还可以是ContentProvider的Uri。
实例:ImageView的用法
string.xml
- <?xml version="1.0" encoding="utf-8"?>
- lt;resources>
- <string name="app_name">AbsoluteExample</string>
- <string name="next">下一张</string>
- <string name="previous">上一张</string>
- <string name="alpha_plus">透明度增加</string>
- <string name="alpha_minus">透明度减少</string>
- lt;/resources>
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">AbsoluteExample</string> <string name="next">下一张</string> <string name="previous">上一张</string> <string name="alpha_plus">透明度增加</string> <string name="alpha_minus">透明度减少</string> </resources>main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical">
- <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/iv" android:layout_gravity="center_horizontal" android:src="@drawable/pic1" ></ImageView>
- <LinearLayout android:layout_height="wrap_content" android:id="@+id/linearLayout2" android:layout_gravity="center_horizontal" android:layout_width="fill_parent" android:orientation="horizontal">
- <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/previous" android:text="@string/previous" android:gravity="center_horizontal" android:layout_gravity="center_horizontal"></Button>
- <Button android:layout_height="wrap_content" android:id="@+id/alpha_plus" android:layout_width="wrap_content" android:text="@string/alpha_plus" android:gravity="center_horizontal" android:layout_gravity="center_horizontal"></Button>
- <Button android:layout_height="wrap_content" android:id="@+id/alpha_minus" android:layout_width="wrap_content" android:text="@string/alpha_minus" android:gravity="center_horizontal" android:layout_gravity="center_horizontal"></Button>
- <Button android:layout_height="wrap_content" android:id="@+id/next" android:layout_width="wrap_content" android:text="@string/next" android:gravity="center_horizontal" android:layout_gravity="center_horizontal"></Button>
- </LinearLayout>
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/iv" android:layout_gravity="center_horizontal" android:src="@drawable/pic1" ></ImageView> <LinearLayout android:layout_height="wrap_content" android:id="@+id/linearLayout2" android:layout_gravity="center_horizontal" android:layout_width="fill_parent" android:orientation="horizontal"> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/previous" android:text="@string/previous" android:gravity="center_horizontal" android:layout_gravity="center_horizontal"></Button> <Button android:layout_height="wrap_content" android:id="@+id/alpha_plus" android:layout_width="wrap_content" android:text="@string/alpha_plus" android:gravity="center_horizontal" android:layout_gravity="center_horizontal"></Button> <Button android:layout_height="wrap_content" android:id="@+id/alpha_minus" android:layout_width="wrap_content" android:text="@string/alpha_minus" android:gravity="center_horizontal" android:layout_gravity="center_horizontal"></Button> <Button android:layout_height="wrap_content" android:id="@+id/next" android:layout_width="wrap_content" android:text="@string/next" android:gravity="center_horizontal" android:layout_gravity="center_horizontal"></Button> </LinearLayout> </LinearLayout>
Activity部分代码:
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.ImageView;
- public class MyAndroidProject extends Activity {
- ImageView iv;
- Button btnNext;
- Button btnPrevious;
- Button btnAlphaPlus;
- Button btnAlphaMinus;
- int currImgId = 0;
- int alpha = 255;
- int[] imgId ={
- R.drawable.pic1,
- R.drawable.pic2,
- R.drawable.pic3
- };
- private View.OnClickListener myListener = new View.OnClickListener() {
- public void onClick(View v) {
- // TODO Auto-generated method stub
- if(v == btnNext){
- currImgId = (currImgId+1) %imgId.length;
- iv.setImageResource(imgId[currImgId]);
- }
- else if(v == btnPrevious){
- currImgId = (currImgId-1+imgId.length) %imgId.length;
- iv.setImageResource(imgId[currImgId]);
- }
- else if(v == btnAlphaPlus){
- alpha -= 25;
- if(alpha < 0){
- alpha = 0;
- }
- iv.setAlpha(alpha);
- }
- else if(v == btnAlphaMinus){
- alpha +=25;
- if(alpha >255){
- alpha = 255;
- }
- iv.setAlpha(alpha);
- }
- }
- };
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- iv = (ImageView) findViewById(R.id.iv);
- btnNext = (Button) findViewById(R.id.next);
- btnPrevious = (Button) findViewById(R.id.previous);
- btnAlphaPlus = (Button) findViewById(R.id.alpha_plus);
- btnAlphaMinus = (Button) findViewById(R.id.alpha_minus);
- btnNext.setOnClickListener(myListener);
- btnPrevious.setOnClickListener(myListener);
- btnAlphaPlus.setOnClickListener(myListener);
- btnAlphaMinus.setOnClickListener(myListener);
- }
- }
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
public class MyAndroidProject extends Activity {
ImageView iv;
Button btnNext;
Button btnPrevious;
Button btnAlphaPlus;
Button btnAlphaMinus;
int currImgId = 0;
int alpha = 255;
int[] imgId ={
R.drawable.pic1,
R.drawable.pic2,
R.drawable.pic3
};
private View.OnClickListener myListener = new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(v == btnNext){
currImgId = (currImgId+1) %imgId.length;
iv.setImageResource(imgId[currImgId]);
}
else if(v == btnPrevious){
currImgId = (currImgId-1+imgId.length) %imgId.length;
iv.setImageResource(imgId[currImgId]);
}
else if(v == btnAlphaPlus){
alpha -= 25;
if(alpha < 0){
alpha = 0;
}
iv.setAlpha(alpha);
}
else if(v == btnAlphaMinus){
alpha +=25;
if(alpha >255){
alpha = 255;
}
iv.setAlpha(alpha);
}
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
iv = (ImageView) findViewById(R.id.iv);
btnNext = (Button) findViewById(R.id.next);
btnPrevious = (Button) findViewById(R.id.previous);
btnAlphaPlus = (Button) findViewById(R.id.alpha_plus);
btnAlphaMinus = (Button) findViewById(R.id.alpha_minus);
btnNext.setOnClickListener(myListener);
btnPrevious.setOnClickListener(myListener);
btnAlphaPlus.setOnClickListener(myListener);
btnAlphaMinus.setOnClickListener(myListener);
}
}
3. 时钟控件
AnalogClock和DigitalClock都负责显示时钟,所不同的是AnalogClock控件显示模拟时钟,且只显示时针和分针,而digital显示数字时钟,可精确到秒
直接在main.xml中定义时钟控件即可。
4. 日期与时间选择控件
DatePicker继承自FrameLayout类,主要功能是向用户提供包含年,月,日的日期数据,并允许用户进行选择。如果要捕获用户修改日期选择控件中数据的时间,需要为DatePicker添加onDateChangedListener监听器。
TimePicker同样继承自FrameLayout类。时间选择控件向用户显示一天中的时间,并允许用户进行选择,如果要捕获用户修改时间数据的时间,便需要为TimePicker添加OnTimeChangedListener监听器。
案例:
main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linearLayout1" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
- <DatePicker android:layout_gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/datePicker1"></DatePicker>
- <EditText android:layout_height="wrap_content" android:text="EditText" android:layout_width="fill_parent" android:id="@+id/editText1" android:cursorVisible="false" android:editable="false"></EditText>
- <TimePicker android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/timePicker1" android:layout_gravity="center_horizontal"></TimePicker>
- <EditText android:layout_height="wrap_content" android:text="EditText" android:layout_width="fill_parent" android:id="@+id/editText2" android:cursorVisible="false" android:editable="false"></EditText>
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linearLayout1" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <DatePicker android:layout_gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/datePicker1"></DatePicker> <EditText android:layout_height="wrap_content" android:text="EditText" android:layout_width="fill_parent" android:id="@+id/editText1" android:cursorVisible="false" android:editable="false"></EditText> <TimePicker android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/timePicker1" android:layout_gravity="center_horizontal"></TimePicker> <EditText android:layout_height="wrap_content" android:text="EditText" android:layout_width="fill_parent" android:id="@+id/editText2" android:cursorVisible="false" android:editable="false"></EditText> </LinearLayout>
Activity:
- package qijia.si;
- import java.util.Calendar;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.DatePicker;
- import android.widget.EditText;
- import android.widget.DatePicker.OnDateChangedListener;
- import android.widget.TimePicker;
- import android.widget.TimePicker.OnTimeChangedListener;
- public class MyAndroidProject extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- DatePicker dp = (DatePicker) findViewById(R.id.datePicker1);
- TimePicker tp = (TimePicker) findViewById(R.id.timePicker1);
- Calendar c = Calendar.getInstance();
- int year = c.get(Calendar.YEAR);
- int monthOfYear = c.get(Calendar.MONTH);
- int dayOfMonth = c.get(Calendar.DAY_OF_MONTH);
- dp.init(year, monthOfYear, dayOfMonth, new OnDateChangedListener(){
- public void onDateChanged(DatePicker view,int year, int monthOfYear,int dayOfMonth){
- flushDate(year,monthOfYear,dayOfMonth);
- }
- });
- tp.setOnTimeChangedListener(new OnTimeChangedListener(){
- public void onTimeChanged(TimePicker view,int hourOfDay,int minute){
- flushTime(hourOfDay,minute);
- }
- });
- }
- public void flushDate(int year,int monthOfYear,int dayOfMonth){
- EditText et = (EditText) findViewById(R.id.editText1);
- et.setText("您选择的日期是: "+year+"年"+(monthOfYear+1)+"月"+dayOfMonth+"日");
- }
- public void flushTime(int hourOfDay,int minute){
- EditText et = (EditText) findViewById(R.id.editText2);
- et.setText("您选择的时间是: "+hourOfDay+"时"+minute+"分");
- }
- }
package qijia.si;
import java.util.Calendar;
import android.app.Activity;
import android.os.Bundle;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.DatePicker.OnDateChangedListener;
import android.widget.TimePicker;
import android.widget.TimePicker.OnTimeChangedListener;
public class MyAndroidProject extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DatePicker dp = (DatePicker) findViewById(R.id.datePicker1);
TimePicker tp = (TimePicker) findViewById(R.id.timePicker1);
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int monthOfYear = c.get(Calendar.MONTH);
int dayOfMonth = c.get(Calendar.DAY_OF_MONTH);
dp.init(year, monthOfYear, dayOfMonth, new OnDateChangedListener(){
public void onDateChanged(DatePicker view,int year, int monthOfYear,int dayOfMonth){
flushDate(year,monthOfYear,dayOfMonth);
}
});
tp.setOnTimeChangedListener(new OnTimeChangedListener(){
public void onTimeChanged(TimePicker view,int hourOfDay,int minute){
flushTime(hourOfDay,minute);
}
});
}
public void flushDate(int year,int monthOfYear,int dayOfMonth){
EditText et = (EditText) findViewById(R.id.editText1);
et.setText("您选择的日期是: "+year+"年"+(monthOfYear+1)+"月"+dayOfMonth+"日");
}
public void flushTime(int hourOfDay,int minute){
EditText et = (EditText) findViewById(R.id.editText2);
et.setText("您选择的时间是: "+hourOfDay+"时"+minute+"分");
}
}
5. 动画播放技术
动画播放技术主要有两种:帧动画和补间动画。
1) 帧动画
帧动画主要用到的类是AnimationDrawable,每个帧动画都是一个AnimationDrawable对象
定义帧动画可以在代码中直接进行,也可以通过XML文件进行定义,定义帧动画的XML文件将存放在res/anim目录下。XML文件中指定了图片图片帧出现的顺序及每个帧的连续时间。
anim.xml
- <?xml version="1.0" encoding="utf-8"?>
- <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot = "false">
- <item android:drawable = "@drawable/f1" android:duration="500" android:visible =
- "true"/>
- <item android:drawable = "@drawable/f2" android:duration="500" android:visible =
- "true"/>
- <item android:drawable = "@drawable/f3" android:duration="500" android:visible =
- "true"/>
- <item android:drawable = "@drawable/f4" android:duration="500" android:visible =
- "true"/>
- </animation-list>
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot = "false"> <item android:drawable = "@drawable/f1" android:duration="500" android:visible = "true"/> <item android:drawable = "@drawable/f2" android:duration="500" android:visible = "true"/> <item android:drawable = "@drawable/f3" android:duration="500" android:visible = "true"/> <item android:drawable = "@drawable/f4" android:duration="500" android:visible = "true"/> </animation-list>
main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/linearLayout1">
- <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView1" android:layout_gravity="center_horizontal" android:src="@anim/anim"></ImageView>
- <Button android:layout_height="wrap_content" android:id="@+id/button1" android:text="click" android:layout_width="fill_parent" android:layout_gravity="center_horizontal"></Button>
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/linearLayout1"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView1" android:layout_gravity="center_horizontal" android:src="@anim/anim"></ImageView> <Button android:layout_height="wrap_content" android:id="@+id/button1" android:text="click" android:layout_width="fill_parent" android:layout_gravity="center_horizontal"></Button> </LinearLayout>
Activity:
- package qijia.si;
- import android.app.Activity;
- import android.graphics.drawable.AnimationDrawable;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.ImageView;
- public class MyAndroidProject extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button btn = (Button) findViewById(R.id.button1);
- btn.setOnClickListener(new OnClickListener(){
- public void onClick(View v){
- ImageView iv = (ImageView) findViewById(R.id.imageView1);
- iv.setBackgroundResource(R.anim.anim);
- AnimationDrawable ad = (AnimationDrawable) iv.getBackground();
- ad.start();
- }
- });
- }
- }
package qijia.si;
import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class MyAndroidProject extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener(){
public void onClick(View v){
ImageView iv = (ImageView) findViewById(R.id.imageView1);
iv.setBackgroundResource(R.anim.anim);
AnimationDrawable ad = (AnimationDrawable) iv.getBackground();
ad.start();
}
});
}
}
2)补间动画
补间动画作用于View对象,主要包括View对象的位置,尺寸,旋转角度和透明度的变换。
补间动画可以通过XML声明也可以在代码中动态定义。推荐使用XML因为XML文件可读性及可用性高,方便替换。
Android开发03—Android常用基本控件(上)
1. 文本控件介绍
1) TextView类
TextView类继承自View类。TextView控件的功能是向用户显示文本内容,同时可选择性的让用户编辑文本。其自身被设置为不可编辑,其子类EditText被设置为可以编辑。
2) EditText类
EditText继承自TextView。EditText与TextView最大的不同就是用户可以对EditText控件进行编辑,同时还可以为EditText设置监听器,用来检测用户输入是否合法。
实例1:接收用户输入的电子邮箱地址和电话号码:
color.xml
string.xml
main.xml
MyAndroidTest.java
2. 按钮控件
1) Button类简介
Button继承自TextView类,用户可以对Button控件执行按下或单击操作。Button控件的用法简单,主要是为Button控件设置View.OnClickListener监听器并在监听器的实现代码中开发按钮按下的事件。
一般格式:
2) ImageButton类
ImageButton类继承自ImageView类,ImageButton控件与Button控件的主要区别在于,ImageButton类没有text属性,即按钮显示图片而不是文本。ImageButton控件设置按钮显示的图片通过android:src属性,也可以通过setImageResource(int)方法来实现。
默认情况下,ImageButton同Button一样具有背景色,当按钮处于不同状态喜爱时,背景色也会变化。当ImageButton所显示图片不能完全覆盖掉背景色时,这种显示效果会相当恶心,所以使用ImageButton一般要将背景色设置为其他图片或直接设置为透明。
注意:新建xml文件文件名不能是大写字母
实例2:为ImageButton按钮控件的不同状态设置不同的图片。
color.xml:
myselector.xml:
main.xml:
3. 状态开关
1) ToggleButton类
ToggleButton的状态只能是选中和未选中,并且需要为不同的状态设置不同的文本。
android:Off 未被选中时显示的文本
android:On 选中时显示的文本
实例3:ToggleButton的用法:
strings.xml:
main.xml
MyAnroidTest.java:
package qijia.si;
1. 文本控件介绍
1) TextView类
TextView类继承自View类。TextView控件的功能是向用户显示文本内容,同时可选择性的让用户编辑文本。其自身被设置为不可编辑,其子类EditText被设置为可以编辑。
2) EditText类
EditText继承自TextView。EditText与TextView最大的不同就是用户可以对EditText控件进行编辑,同时还可以为EditText设置监听器,用来检测用户输入是否合法。
实例1:接收用户输入的电子邮箱地址和电话号码:
color.xml
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <color name="shadow">#fd8d8d</color>
- </resources>
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="shadow">#fd8d8d</color> </resources>
string.xml
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="hello">Hello World, AndroidTest!</string>
- <string name="app_name">AndroidTest</string>
- <string name="tvEmail">邮箱地址</string>
- <string name="etEmail">请输入电子邮件地址</string>
- <string name="tvPhone">电话号码</string>
- <string name="etPhone">请输入电话号码</string>
- <string name="etInfo">此处显示登记信息</string>
- </resources>
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, AndroidTest!</string> <string name="app_name">AndroidTest</string> <string name="tvEmail">邮箱地址</string> <string name="etEmail">请输入电子邮件地址</string> <string name="tvPhone">电话号码</string> <string name="etPhone">请输入电话号码</string> <string name="etInfo">此处显示登记信息</string> </resources>
main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:shrinkColumns="0,2" android:layout_width="fill_parent" android:id="@+id/tableLayout1" android:layout_height="fill_parent">
- <TableRow android:id="@+id/tableRow1" android:layout_width="wrap_content" android:layout_height="wrap_content">
- <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/tvEmail" android:ellipsize="end" android:autoLink="email" android:id="@+id/tvEmail"></TextView>
- <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:selectAllOnFocus="true" android:hint="@string/etEmail" android:id="@+id/etEmail"></EditText>
- </TableRow>
- <TableRow android:id="@+id/tableRow2" android:layout_width="wrap_content" android:layout_height="wrap_content">
- <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/tvPhone" android:ellipsize="middle" android:autoLink="phone" android:id="@+id/tvPhone"></TextView>
- <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="@string/etPhone" android:selectAllOnFocus="true" android:maxWidth="160px" android:phoneNumber="true" android:singleLine="true" android:id="@+id/etPhone"></EditText>
- </TableRow>
- <EditText android:id="@+id/editText3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="EditText" android:editable="false" android:hint="@string/etInfo" android:cursorVisible="false" android:lines="5" android:shadowColor="@color/shadow" android:shadowDx="2.5" android:shadowDy="2.5" android:shadowRadius="5.0"></EditText>
- </TableLayout>
<?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:shrinkColumns="0,2" android:layout_width="fill_parent" android:id="@+id/tableLayout1" android:layout_height="fill_parent"> <TableRow android:id="@+id/tableRow1" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/tvEmail" android:ellipsize="end" android:autoLink="email" android:id="@+id/tvEmail"></TextView> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:selectAllOnFocus="true" android:hint="@string/etEmail" android:id="@+id/etEmail"></EditText> </TableRow> <TableRow android:id="@+id/tableRow2" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/tvPhone" android:ellipsize="middle" android:autoLink="phone" android:id="@+id/tvPhone"></TextView> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="@string/etPhone" android:selectAllOnFocus="true" android:maxWidth="160px" android:phoneNumber="true" android:singleLine="true" android:id="@+id/etPhone"></EditText> </TableRow> <EditText android:id="@+id/editText3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="EditText" android:editable="false" android:hint="@string/etInfo" android:cursorVisible="false" android:lines="5" android:shadowColor="@color/shadow" android:shadowDx="2.5" android:shadowDy="2.5" android:shadowRadius="5.0"></EditText> </TableLayout>
MyAndroidTest.java
- package qijia.si;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.KeyEvent;
- import android.view.View;
- import android.view.View.OnKeyListener;
- import android.widget.EditText;
- public class AndroidTest extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- EditText etEmail = (EditText) findViewById(R.id.etEmail);
- etEmail.setOnKeyListener(myOnKeyListener);
- }
- private OnKeyListener myOnKeyListener = new OnKeyListener(){
- public boolean onKey(View v,int keyCode, KeyEvent event){
- EditText etInfo = (EditText) findViewById(R.id.editText3);
- EditText etEmail = (EditText) findViewById(R.id.etEmail);
- etInfo.setText("您输入的邮箱地址是:"+etEmail.getText());
- return true;
- }
- };
- }
package qijia.si;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.widget.EditText;
public class AndroidTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
EditText etEmail = (EditText) findViewById(R.id.etEmail);
etEmail.setOnKeyListener(myOnKeyListener);
}
private OnKeyListener myOnKeyListener = new OnKeyListener(){
public boolean onKey(View v,int keyCode, KeyEvent event){
EditText etInfo = (EditText) findViewById(R.id.editText3);
EditText etEmail = (EditText) findViewById(R.id.etEmail);
etInfo.setText("您输入的邮箱地址是:"+etEmail.getText());
return true;
}
};
}
2. 按钮控件
1) Button类简介
Button继承自TextView类,用户可以对Button控件执行按下或单击操作。Button控件的用法简单,主要是为Button控件设置View.OnClickListener监听器并在监听器的实现代码中开发按钮按下的事件。
一般格式:
- public void onCreate(Bundle savedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button btn = (Button) findViewById(R.Id.ID);
- btn.setOnClickListener(new OnClickListener){
- public void onClick(View v){
- //处理的事件
- }
- };
- }
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button) findViewById(R.Id.ID);
btn.setOnClickListener(new OnClickListener){
public void onClick(View v){
//处理的事件
}
};
}
2) ImageButton类
ImageButton类继承自ImageView类,ImageButton控件与Button控件的主要区别在于,ImageButton类没有text属性,即按钮显示图片而不是文本。ImageButton控件设置按钮显示的图片通过android:src属性,也可以通过setImageResource(int)方法来实现。
默认情况下,ImageButton同Button一样具有背景色,当按钮处于不同状态喜爱时,背景色也会变化。当ImageButton所显示图片不能完全覆盖掉背景色时,这种显示效果会相当恶心,所以使用ImageButton一般要将背景色设置为其他图片或直接设置为透明。
注意:新建xml文件文件名不能是大写字母
实例2:为ImageButton按钮控件的不同状态设置不同的图片。
color.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <color name="back">#000000</color>
- </resources>
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="back">#000000</color> </resources>
myselector.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:state_pressed="false"
- android:drawable="@drawable/back"/>
- <item
- android:state_pressed="true"
- android:drawable="@drawable/backdown"/>
- </selector>
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="false" android:drawable="@drawable/back"/> <item android:state_pressed="true" android:drawable="@drawable/backdown"/> </selector>
main.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:id="@+id/linearLayout1" android:layout_height="fill_parent" android:layout_width="fill_parent">
- <ImageButton android:id="@+id/imageButton1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:background="@color/back" android:src="@drawable/myselector"></ImageButton>
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:id="@+id/linearLayout1" android:layout_height="fill_parent" android:layout_width="fill_parent"> <ImageButton android:id="@+id/imageButton1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:background="@color/back" android:src="@drawable/myselector"></ImageButton> </LinearLayout>
3. 状态开关
1) ToggleButton类
ToggleButton的状态只能是选中和未选中,并且需要为不同的状态设置不同的文本。
android:Off 未被选中时显示的文本
android:On 选中时显示的文本
实例3:ToggleButton的用法:
strings.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="hello">Hello World, AndroidTest!</string>
- <string name="app_name">AndroidTest</string>
- <string name="off">关灯</string>
- <string name="on">开灯</string>
- </resources>
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, AndroidTest!</string> <string name="app_name">AndroidTest</string> <string name="off">关灯</string> <string name="on">开灯</string> </resources>
main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical">
- <ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/bulb_off" android:id="@+id/ImageView01" android:layout_gravity="center_horizontal"></ImageView>
- <ToggleButton android:layout_gravity="center_horizontal" android:layout_height="wrap_content" android:layout_width="140dip" android:textOff="@string/on" android:textOn="@string/off" android:id="@+id/Tb"></ToggleButton>
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"> <ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/bulb_off" android:id="@+id/ImageView01" android:layout_gravity="center_horizontal"></ImageView> <ToggleButton android:layout_gravity="center_horizontal" android:layout_height="wrap_content" android:layout_width="140dip" android:textOff="@string/on" android:textOn="@string/off" android:id="@+id/Tb"></ToggleButton> </LinearLayout>
MyAnroidTest.java:
package qijia.si;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.KeyEvent;
- import android.view.View;
- import android.view.View.OnKeyListener;
- import android.widget.CompoundButton;
- import android.widget.CompoundButton.OnCheckedChangeListener;
- import android.widget.EditText;
- import android.widget.ImageView;
- import android.widget.ToggleButton;
- public class AndroidTest extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- ToggleButton tb =(ToggleButton) findViewById(R.id.Tb);
- tb.setOnCheckedChangeListener(new OnCheckedChangeListener(){
- //添加监听器
- public void onCheckedChanged(CompoundButton buttonView,
- boolean isChecked){
- setBulbState(isChecked);
- }
- });
- }
- public void setBulbState(boolean state){
- ImageView iv = (ImageView) findViewById(R.id.ImageView01);
- iv.setImageResource((state)?R.drawable.bulb_on:R.drawable.bulb_off);
- //设置图片资源
- ToggleButton tb = (ToggleButton) this.findViewById(R.id.Tb);
- tb.setChecked(state);
- //设置为选中状态
- }
- }
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ToggleButton;
public class AndroidTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ToggleButton tb =(ToggleButton) findViewById(R.id.Tb);
tb.setOnCheckedChangeListener(new OnCheckedChangeListener(){
//添加监听器
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked){
setBulbState(isChecked);
}
});
}
public void setBulbState(boolean state){
ImageView iv = (ImageView) findViewById(R.id.ImageView01);
iv.setImageResource((state)?R.drawable.bulb_on:R.drawable.bulb_off);
//设置图片资源
ToggleButton tb = (ToggleButton) this.findViewById(R.id.Tb);
tb.setChecked(state);
//设置为选中状态
}
}
Android系统开发02—Android布局管理器
1. View,ViewGroup
1) View类
View类为所有可视化控件的基类,主要提供了空间绘制和事件处理。
2)ViewGroup类
ViewGroup类也是View类的子类,但是可以充当其他控件的容器。
2. 线性布局
线性布局是最简单的布局,它提供了控件水平或者垂直排列的模型。使用此布局时可以通过设置控件的weight参数控制各个控件在容器中的相对大小。
线性布局实例:
string.xml:
main.xml:
MyAndroidProject.java:
TableLayout类以行和列的形式管理控件,每行为一个TableRow对象,也可以为一个View对象,当为View对象时,该View对象将跨越该行的所有列。在TableRow中可以添加子空间,每添加一个子空间为一列。
在TableLayout中,可以为列设置三种属性:
1) Shrinkable,该列宽度可以进行收缩,以使表格能够适应期父容器的大小
2) Stretchable,该列的宽度可以进行拉伸,以使填满表格中空闲的空间。
3) Collapsed,该列将被隐藏。
注意:一个列可以同时拥有1,2的属性。
案例:
color.xml
string.xml
main.xml
MyAndroidProject.java
4. 相对布局
在相对布局中,子控件的位置是相对兄弟控件或父容器而决定的。
需要注意的是,相对布局中要避免出现循环依赖。
5. 帧布局
FrameLayout帧布局在屏幕上开辟出了一块区域,在这块区域中可以添加多个子控件,但是所有的子空间都被对齐到屏幕的左上角。帧布局的大小由子控件中尺寸最大的那个控件决定。
6. 绝对布局
绝对布局是指屏幕中所有控件的摆放由开发人员通过设置控件的坐标来指定,控件容器不再负责管理其子控件的位置。
案例:
string.xml
color.xml
main.xml
MyAndroidProject.java
1. View,ViewGroup
1) View类
View类为所有可视化控件的基类,主要提供了空间绘制和事件处理。
2)ViewGroup类
ViewGroup类也是View类的子类,但是可以充当其他控件的容器。
2. 线性布局
线性布局是最简单的布局,它提供了控件水平或者垂直排列的模型。使用此布局时可以通过设置控件的weight参数控制各个控件在容器中的相对大小。
线性布局实例:
string.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="app_name">LinearExample</string>
- <string name="button">按钮</string>
- <string name="add">添加</string>
- </resources>
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">LinearExample</string> <string name="button">按钮</string> <string name="add">添加</string> </resources>
main.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/lla" android:orientation="vertical" android:gravity="right">
- <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/Button01" android:text="@string/add"></Button>
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/lla" android:orientation="vertical" android:gravity="right"> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/Button01" android:text="@string/add"></Button> </LinearLayout>
MyAndroidProject.java:
- package qijia.si;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.Button;
- import android.widget.LinearLayout;
- public class MyAndroidProject extends Activity {
- int count = 0;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button btn = (Button) findViewById(R.id.Button01);
- btn.setOnClickListener(
- new View.OnClickListener() {
- public void onClick(View v) {
- // TODO Auto-generated method stub
- LinearLayout ll = (LinearLayout) findViewById(R.id.lla);
- String msg = MyAndroidProject.this.getResources().getString(R.string.button);
- Button tempbutton = new Button(MyAndroidProject.this);
- tempbutton.setText(msg+(++count));
- tempbutton.setWidth(80);
- ll.addView(tempbutton);
- }
- }
- );
- }
- }
package qijia.si;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
public class MyAndroidProject extends Activity {
int count = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button) findViewById(R.id.Button01);
btn.setOnClickListener(
new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
LinearLayout ll = (LinearLayout) findViewById(R.id.lla);
String msg = MyAndroidProject.this.getResources().getString(R.string.button);
Button tempbutton = new Button(MyAndroidProject.this);
tempbutton.setText(msg+(++count));
tempbutton.setWidth(80);
ll.addView(tempbutton);
}
}
);
}
}
3. 表格布局
TableLayout类以行和列的形式管理控件,每行为一个TableRow对象,也可以为一个View对象,当为View对象时,该View对象将跨越该行的所有列。在TableRow中可以添加子空间,每添加一个子空间为一列。
在TableLayout中,可以为列设置三种属性:
1) Shrinkable,该列宽度可以进行收缩,以使表格能够适应期父容器的大小
2) Stretchable,该列的宽度可以进行拉伸,以使填满表格中空闲的空间。
3) Collapsed,该列将被隐藏。
注意:一个列可以同时拥有1,2的属性。
案例:
color.xml
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <color name="white">#ffffff</color>
- <color name="red">#ff0000</color>
- <color name="black">#000000</color>
- <color name="green">#00ff00</color>
- <color name="blue">#0000ff</color>
- </resources>
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="white">#ffffff</color> <color name="red">#ff0000</color> <color name="black">#000000</color> <color name="green">#00ff00</color> <color name="blue">#0000ff</color> </resources>
string.xml
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="app_name">TableExample</string>
- <string name="tv1">我自己是一行…………我自己是一行</string>
- <string name="tvShort">我的内容少</string>
- <string name="tvStrech">我是被拉伸的一行</string>
- <string name="tvShrink">我是被收缩的一行被收缩的一行</string>
- <string name="tvLong">我的内容很多很多很多很多很多很多</string>
- </resources>
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">TableExample</string> <string name="tv1">我自己是一行…………我自己是一行</string> <string name="tvShort">我的内容少</string> <string name="tvStrech">我是被拉伸的一行</string> <string name="tvShrink">我是被收缩的一行被收缩的一行</string> <string name="tvLong">我的内容很多很多很多很多很多很多</string> </resources>
main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/LinearLayout01" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:background="@drawable/pic" android:gravity="bottom">
- <TableLayout android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/TableLayout03" android:background="@color/white" android:stretchColumns="0" android:collapseColumns="1">
- </TableLayout>
- <TableLayout android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/TableLayout02" android:background="@color/white" android:stretchColumns="0">
- <TableRow android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/TableRow01">
- <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/TextView02" android:text="@string/tvStrech" android:layout_margin="4px" android:background="@color/green" android:textColor="@color/blue"></TextView>
- <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/TextView03" android:text="@string/tvShort" android:textColor="@color/black" android:background="@color/blue" android:layout_margin="4px"></TextView>
- </TableRow>
- </TableLayout>
- <TableLayout android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/TableLayout01" android:background="@color/white">
- <TextView android:textColor="@color/black" android:layout_margin="4px" android:text="@string/tv1" android:background="@color/red" android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/TextView01"></TextView>
- </TableLayout>
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/LinearLayout01" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:background="@drawable/pic" android:gravity="bottom"> <TableLayout android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/TableLayout03" android:background="@color/white" android:stretchColumns="0" android:collapseColumns="1"> </TableLayout> <TableLayout android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/TableLayout02" android:background="@color/white" android:stretchColumns="0"> <TableRow android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/TableRow01"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/TextView02" android:text="@string/tvStrech" android:layout_margin="4px" android:background="@color/green" android:textColor="@color/blue"></TextView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/TextView03" android:text="@string/tvShort" android:textColor="@color/black" android:background="@color/blue" android:layout_margin="4px"></TextView> </TableRow> </TableLayout> <TableLayout android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/TableLayout01" android:background="@color/white"> <TextView android:textColor="@color/black" android:layout_margin="4px" android:text="@string/tv1" android:background="@color/red" android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/TextView01"></TextView> </TableLayout> </LinearLayout>
MyAndroidProject.java
- package qijia.si;
- import android.app.Activity;
- import android.os.Bundle;
- public class MyAndroidProject extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- }
- }
package qijia.si;
import android.app.Activity;
import android.os.Bundle;
public class MyAndroidProject extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
4. 相对布局
在相对布局中,子控件的位置是相对兄弟控件或父容器而决定的。
需要注意的是,相对布局中要避免出现循环依赖。
5. 帧布局
FrameLayout帧布局在屏幕上开辟出了一块区域,在这块区域中可以添加多个子控件,但是所有的子空间都被对齐到屏幕的左上角。帧布局的大小由子控件中尺寸最大的那个控件决定。
6. 绝对布局
绝对布局是指屏幕中所有控件的摆放由开发人员通过设置控件的坐标来指定,控件容器不再负责管理其子控件的位置。
案例:
string.xml
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="app_name">AbsoluteExample</string>
- <string name="uid">用户名</string>
- <string name="pwd">密码</string>
- <string name="ok">确定</string>
- <string name="cancel">取消</string>
- </resources>
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">AbsoluteExample</string> <string name="uid">用户名</string> <string name="pwd">密码</string> <string name="ok">确定</string> <string name="cancel">取消</string> </resources>
color.xml
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <color name="white">#ffffff</color>
- <color name="red">#ff0000</color>
- <color name="black">#000000</color>
- <color name="green">#00ff00</color>
- <color name="blue">#0000ff</color>
- </resources>
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="white">#ffffff</color> <color name="red">#ff0000</color> <color name="black">#000000</color> <color name="green">#00ff00</color> <color name="blue">#0000ff</color> </resources>
main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:background="@color/white" android:id="@+id/absoluteLayout1" android:layout_height="fill_parent">
- <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_x="20dip" android:layout_y="20dip" android:id="@+id/TextView01" android:text="@string/uid"></TextView>
- <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/TextView02" android:text="@string/pwd" android:layout_x="20dip" android:layout_y="80dip"></TextView>
- <EditText android:text="EditText" android:layout_height="wrap_content" android:layout_y="20dip" android:id="@+id/EditText01" android:layout_x="80dip" android:layout_width="180dip"></EditText>
- <EditText android:text="EditText" android:layout_height="wrap_content" android:id="@+id/EditText02" android:password="true" android:layout_x="80dip" android:layout_y="80dip" android:layout_width="180dip"></EditText>
- <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/Button01" android:text="@string/ok" android:layout_x="155dip" android:layout_y="140dip"></Button>
- <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/Button02" android:text="@string/cancel" android:layout_x="210dip" android:layout_y="140dip"></Button>
- <ScrollView android:layout_x="10dip" android:layout_y="200dip" android:layout_height="150dip" android:layout_width="250dip" android:id="@+id/ScrollView01">
- <EditText android:text="EditText" android:layout_height="wrap_content" android:layout_width="fill_parent" android:singleLine="false" android:gravity="top" android:id="@+id/EditText03"></EditText>
- </ScrollView>
- </AbsoluteLayout>
<?xml version="1.0" encoding="utf-8"?> <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:background="@color/white" android:id="@+id/absoluteLayout1" android:layout_height="fill_parent"> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_x="20dip" android:layout_y="20dip" android:id="@+id/TextView01" android:text="@string/uid"></TextView> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/TextView02" android:text="@string/pwd" android:layout_x="20dip" android:layout_y="80dip"></TextView> <EditText android:text="EditText" android:layout_height="wrap_content" android:layout_y="20dip" android:id="@+id/EditText01" android:layout_x="80dip" android:layout_width="180dip"></EditText> <EditText android:text="EditText" android:layout_height="wrap_content" android:id="@+id/EditText02" android:password="true" android:layout_x="80dip" android:layout_y="80dip" android:layout_width="180dip"></EditText> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/Button01" android:text="@string/ok" android:layout_x="155dip" android:layout_y="140dip"></Button> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/Button02" android:text="@string/cancel" android:layout_x="210dip" android:layout_y="140dip"></Button> <ScrollView android:layout_x="10dip" android:layout_y="200dip" android:layout_height="150dip" android:layout_width="250dip" android:id="@+id/ScrollView01"> <EditText android:text="EditText" android:layout_height="wrap_content" android:layout_width="fill_parent" android:singleLine="false" android:gravity="top" android:id="@+id/EditText03"></EditText> </ScrollView> </AbsoluteLayout>
MyAndroidProject.java
- package qijia.si;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.Button;
- import android.widget.EditText;
- public class MyAndroidProject extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- final Button okButton = (Button) findViewById(R.id.Button01);
- final Button cancelButton = (Button) findViewById(R.id.Button02);
- final EditText uid = (EditText) findViewById(R.id.EditText01);
- final EditText pwd = (EditText) findViewById(R.id.EditText02);
- final EditText log = (EditText) findViewById(R.id.EditText03);
- okButton.setOnClickListener(
- new View.OnClickListener() {
- public void onClick(View v) {
- // TODO Auto-generated method stub
- String uidStr = uid.getText().toString();
- String pwdStr = pwd.getText().toString();
- log.append("用户名:"+uidStr+"密码:"+pwdStr+"\n");
- }
- }
- );
- cancelButton.setOnClickListener(
- new View.OnClickListener() {
- public void onClick(View v) {
- // TODO Auto-generated method stub
- uid.setText("");
- pwd.setText("");
- }
- }
- );
- }
- }
package qijia.si;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MyAndroidProject extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final Button okButton = (Button) findViewById(R.id.Button01);
final Button cancelButton = (Button) findViewById(R.id.Button02);
final EditText uid = (EditText) findViewById(R.id.EditText01);
final EditText pwd = (EditText) findViewById(R.id.EditText02);
final EditText log = (EditText) findViewById(R.id.EditText03);
okButton.setOnClickListener(
new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
String uidStr = uid.getText().toString();
String pwdStr = pwd.getText().toString();
log.append("用户名:"+uidStr+"密码:"+pwdStr+"\n");
}
}
);
cancelButton.setOnClickListener(
new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
uid.setText("");
pwd.setText("");
}
}
);
}
}
Android系统开发01—Android基本组件
1. 应用程序生命周期
应用程序进程从创建到结束的全过程便是应用程序的生命周期。与其他系统不同,Android应用程序的生命周期是不受进程自身控制的,而是由Android系统决定的。
Android系统将所有的进程分为5类进行管理:
1. 前台进程
2. 可见进程:还在屏幕中,但是用户并没有直接与之进行交互。
3. 服务进程
4. 后台进程
5. 空进程
从1到5,重要顺序递减。
注意:应用程序在运行时,其状态的切换可能是通过自身实现的,可也能是系统将其改变的。
2. Activity
Activity是Android中最常用的组件,是应用程序的表示层,Activity一般通过View来实现应用程序的用户界面,相当于一个屏幕,用户与程序的交互式通过该类实现的。
Activity的生命周期主要包含三个状态:运行态,暂停态,停止态。
Activity的显示内容跟是由View对象提供的,View对象继承自View类,其中每个View对象管理屏幕中的一个矩形区域。Android自带了许多View对象,而除了使用Android自带的View外,还可以自定义View。
例子:
Service是一个具有较长的生命周期但是并没有用户界面的程序。
Service一般由Activity启动,但不依赖于Activity,Service有两种启动方式:
1. startService
当Activity调用startService方法启动Service时,会依次调用onCreate和onStart方法来启动Service。当结束时,调用onDestroy方法结束Service。
2. bindService
BoardReceiver
BoardReceiver为用户接收广播通知的组件,当系统或某个应用程序发送广播时,可以使用BoardReceiver组件来接收广播信息并作出相应的处理。
使用过程:
1. 将需要广播的消息封装到Intent中。
2. Context.sendBroadcast(),sendOrderedBroadcast(),sendStickyBroadcast()中的一种将Intent发送
3. 通过IntentFilter对象过滤所发送的实体Intent
4. 重写onReceive方法的BoardReceiver。
4. ContentProvider
ContentProvider是用来实现应用程序之间数据共享的类。
5. Intent和IntentFilter
1) Intent类简介
Intent是一种运行时绑定机制,在应用程序运行时连接两个不同的组件。一般的应用是通过Intent向Android系统发出某种请求,然后Android系统会根据请求查询各个组件声明的IntentFilter,找到需要的组件并运行它。
前面所说的Activity,Service及BroadcastReceiver组件之间的通信全部使用的是Intent但是每个机制不同。
Activity组件:当需要激活一个Activity组件时,需要调用Context.startActivity或Context.startActivityForResult方法来传递Intent,此时的Intent参数成为Activity Action Intent
Service组件:一般通过Context.startService和Context.bindService
BroadcastReceiver组件:上面已经介绍
Intent是由组件名称,Action,Data,Category,Extra和Flag组成:
1. 组件名称:组件名称实际上就是一个ComponentName对象,用于标识唯一的应用程序组件。
2. Action:一个描述Intent所触发动作名称的字符串。如
ACTION_CALL,ACTION_EDIT,ACTION_VIEW,ACTION_MAIN等
3. Data:主要对Intent消息中数据的封装,主要描述Intent的动作所操作到的数据的URI及类型
4. Category:是对目标组件类型的描述
5. Extra:封装了一些额外的附加信息。
2) IntentFilter
IntentFilter实际上相当于Intent的过滤器。IntentFilter过滤Intent时,主要通过Action,Data及Category三方面进行监测:
1. 检查Action:一个Intent只能设置一种Action,但是一个IntentFilter却可以设置多个Action过滤。当IntentFilter设置了多个Action时,只需一个满足就可完成Action验证。
2. 检查Data:主要检查URI及数据类型
3. 检查Category:当Intent中的Category与IntentFilter中的一个Category完全匹配时,便会通过Category检查。
Intent案例:
判断输入的电话号码是否符合规范当符合规范时,调用系统自带的拨号程序进行拨号。
1. 应用程序生命周期
应用程序进程从创建到结束的全过程便是应用程序的生命周期。与其他系统不同,Android应用程序的生命周期是不受进程自身控制的,而是由Android系统决定的。
Android系统将所有的进程分为5类进行管理:
1. 前台进程
2. 可见进程:还在屏幕中,但是用户并没有直接与之进行交互。
3. 服务进程
4. 后台进程
5. 空进程
从1到5,重要顺序递减。
注意:应用程序在运行时,其状态的切换可能是通过自身实现的,可也能是系统将其改变的。
2. Activity
Activity是Android中最常用的组件,是应用程序的表示层,Activity一般通过View来实现应用程序的用户界面,相当于一个屏幕,用户与程序的交互式通过该类实现的。
Activity的生命周期主要包含三个状态:运行态,暂停态,停止态。
Activity的显示内容跟是由View对象提供的,View对象继承自View类,其中每个View对象管理屏幕中的一个矩形区域。Android自带了许多View对象,而除了使用Android自带的View外,还可以自定义View。
例子:
- MyView.java:
- package qijia.si;
- import android.content.Context;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Paint;
- import android.view.View;
- public class MyView extends View {
- Paint paint;
- public MyView(Context context){
- super(context);
- paint = new Paint();
- paint.setColor(Color.WHITE);
- paint.setTextSize(20);
- paint.setAntiAlias(true);
- }
- protected void onDraw(Canvas canvas){
- super.onDraw(canvas);
- canvas.drawColor(Color.GRAY);
- canvas.drawRect(10,10,110,110, paint);
- canvas.drawText("fuck you", 60, 170, paint);
- }
- }
- MyAndroidProject.java:
- package qijia.si;
- import android.app.Activity;
- import android.os.Bundle;
- public class MyAndroidProject extends Activity {
- /** Called when the activity is first created. */
- MyView myView;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- myView = new MyView(this);
- this.setContentView(myView);
- }
- }
MyView.java:
package qijia.si;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;
public class MyView extends View {
Paint paint;
public MyView(Context context){
super(context);
paint = new Paint();
paint.setColor(Color.WHITE);
paint.setTextSize(20);
paint.setAntiAlias(true);
}
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
canvas.drawColor(Color.GRAY);
canvas.drawRect(10,10,110,110, paint);
canvas.drawText("fuck you", 60, 170, paint);
}
}
MyAndroidProject.java:
package qijia.si;
import android.app.Activity;
import android.os.Bundle;
public class MyAndroidProject extends Activity {
/** Called when the activity is first created. */
MyView myView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myView = new MyView(this);
this.setContentView(myView);
}
}
3. Service
Service是一个具有较长的生命周期但是并没有用户界面的程序。
Service一般由Activity启动,但不依赖于Activity,Service有两种启动方式:
1. startService
当Activity调用startService方法启动Service时,会依次调用onCreate和onStart方法来启动Service。当结束时,调用onDestroy方法结束Service。
2. bindService
BoardReceiver
BoardReceiver为用户接收广播通知的组件,当系统或某个应用程序发送广播时,可以使用BoardReceiver组件来接收广播信息并作出相应的处理。
使用过程:
1. 将需要广播的消息封装到Intent中。
2. Context.sendBroadcast(),sendOrderedBroadcast(),sendStickyBroadcast()中的一种将Intent发送
3. 通过IntentFilter对象过滤所发送的实体Intent
4. 重写onReceive方法的BoardReceiver。
4. ContentProvider
ContentProvider是用来实现应用程序之间数据共享的类。
5. Intent和IntentFilter
1) Intent类简介
Intent是一种运行时绑定机制,在应用程序运行时连接两个不同的组件。一般的应用是通过Intent向Android系统发出某种请求,然后Android系统会根据请求查询各个组件声明的IntentFilter,找到需要的组件并运行它。
前面所说的Activity,Service及BroadcastReceiver组件之间的通信全部使用的是Intent但是每个机制不同。
Activity组件:当需要激活一个Activity组件时,需要调用Context.startActivity或Context.startActivityForResult方法来传递Intent,此时的Intent参数成为Activity Action Intent
Service组件:一般通过Context.startService和Context.bindService
BroadcastReceiver组件:上面已经介绍
Intent是由组件名称,Action,Data,Category,Extra和Flag组成:
1. 组件名称:组件名称实际上就是一个ComponentName对象,用于标识唯一的应用程序组件。
2. Action:一个描述Intent所触发动作名称的字符串。如
ACTION_CALL,ACTION_EDIT,ACTION_VIEW,ACTION_MAIN等
3. Data:主要对Intent消息中数据的封装,主要描述Intent的动作所操作到的数据的URI及类型
4. Category:是对目标组件类型的描述
5. Extra:封装了一些额外的附加信息。
2) IntentFilter
IntentFilter实际上相当于Intent的过滤器。IntentFilter过滤Intent时,主要通过Action,Data及Category三方面进行监测:
1. 检查Action:一个Intent只能设置一种Action,但是一个IntentFilter却可以设置多个Action过滤。当IntentFilter设置了多个Action时,只需一个满足就可完成Action验证。
2. 检查Data:主要检查URI及数据类型
3. 检查Category:当Intent中的Category与IntentFilter中的一个Category完全匹配时,便会通过Category检查。
Intent案例:
判断输入的电话号码是否符合规范当符合规范时,调用系统自带的拨号程序进行拨号。
- package qijia.si;
- import android.app.Activity;
- import android.content.Intent;
- import android.net.Uri;
- import android.os.Bundle;
- import android.telephony.PhoneNumberUtils;
- import android.view.View;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.Toast;
- public class MyAndroidProject extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button bCall = (Button)this.findViewById(R.id.Button01);
- bCall.setOnClickListener(
- new View.OnClickListener() {
- public void onClick(View v) {
- // TODO Auto-generated method stub
- EditText eTel = (EditText) findViewById(R.id.myEditText);
- String strTel = eTel.getText().toString();
- if(PhoneNumberUtils.isGlobalPhoneNumber(strTel)){
- Intent i = new Intent(Intent.ACTION_DIAL,Uri.parse("tel://"+strTel));
- MyAndroidProject.this.startActivity(i);
- }else{
- Toast.makeText(
- MyAndroidProject.this,
- "号码格式不正确",
- 5000
- ).show();
- }
- }
- }
- );
- }
- }