·
·点此进入上篇:
·
·
·
·
·AnalogClock和DigitalClock
// 获得当前的时间,获得小时和分钟
Calendar calendar = Calendar.getInstance();
hourOfDay = calendar.get(Calendar.HOUR_OF_DAY);
minute = calendar.get(Calendar.MINUTE);// 获得当前的秒
year = calendar.get(Calendar.YEAR);
monthOfYear = calendar.get(Calendar.MONTH);
dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
TimePickerDialog timePickerDialog = new TimePickerDialog(Main.this,
new MyTimePickerDialog(), hourOfDay, minute, true);
timePickerDialog.show();// 显示对话框
break;
case R.id.button2:
DatePickerDialog datePickerDialog = new DatePickerDialog(Main.this,
new MyDatePickerDialog(), year, monthOfYear, dayOfMonth);
datePickerDialog.show();// 显示对话框
break;
}
}
public class MyDatePickerDialog implements
DatePickerDialog.OnDateSetListener {
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
Toast.makeText(Main.this, "year:" + year + "monthOfYear:" + monthOfYear + "dayOfMonth:" + dayOfMonth, 1).show();
}
}
public class MyTimePickerDialog implements
TimePickerDialog.OnTimeSetListener {
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
Toast.makeText(Main.this, "hourOfDay:" + hourOfDay + "minute:" + minute, 1).show();
}
}
·ProgressBar:
OnCreate下:
// 如何设置窗口有刻度的效果
requestWindowFeature(Window.FEATURE_PROGRESS);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.main);
progressBar = (ProgressBar) this.findViewById(R.id.progressbar);
setProgressBarVisibility(true);
setProgressBarIndeterminate(true);
setProgress(3500);
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.button1:
progressBar.setProgress((int) (progressBar.getProgress() * 1.2));
progressBar.setSecondaryProgress((int) (progressBar
.getSecondaryProgress() * 1.2));
break;
case R.id.button2:
progressBar.setProgress((int) (progressBar.getProgress() * 0.8));
progressBar.setSecondaryProgress((int) (progressBar
.getSecondaryProgress() * 0.8));
break;
}
}
·RatingBar 评分控件
OnCreate下
ratingBar.setMax(100);// 设置最大刻度
ratingBar.setProgress(20);// 设置当前的刻度
ratingBar.setOnRatingBarChangeListener(this);
@Override
public void onRatingChanged(RatingBar ratingBar, float rating,
boolean fromUser) {
// TODO Auto-generated method stub
int progress = ratingBar.getProgress();
Toast.makeText(Main.this, "progress:" + progress + "rating:" + rating,
1).show();
}
·ScrollView 垂直滚动控件
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="wrap_content">
<LinearLayout android:layout_width="fill_parent"
android:orientation="vertical" android:layout_height="fill_parent">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="滚动视图"
android:textSize="30dp"></TextView>
</LinearLayout>
</ScrollView>
·HorizontalScrollView 水平滚动控件
<?xml version="1.0" encoding="utf-8"?>
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="wrap_content">
<LinearLayout android:orientation="horizontal"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:src="@drawable/item1"></ImageView>
</LinearLayout>
</HorizontalScrollView>
·Gallery 画廊控件
·只能显示一行,而且支持水平滑动效果
package com.android.mygallery;
import android.app.Activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;
public class Main extends Activity {
/** Called when the activity is first created. */
private Gallery gallery;
private ImageAdapter imageAdapter;
// 声明图片的数组
private int[] resIds = { R.drawable.item1, R.drawable.item2,
R.drawable.item3, R.drawable.item4, R.drawable.item5,
R.drawable.item6, R.drawable.item7, R.drawable.item8,
R.drawable.item9, R.drawable.item10, R.drawable.item11,
R.drawable.item12, R.drawable.item13, R.drawable.item14,
R.drawable.item15 };
// android的适配器
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
gallery = (Gallery) this.findViewById(R.id.gallery);
imageAdapter = new ImageAdapter(this);
gallery.setAdapter(imageAdapter);
}
public class ImageAdapter extends BaseAdapter {
private Context context;
int mGralleyItemBackground;// 使用简单的计数器,填充背景图片
public ImageAdapter(Context context) {
this.context = context;
// 读取属性
TypedArray typedArray = obtainStyledAttributes(R.styleable.Gallery);
mGralleyItemBackground = typedArray.getResourceId(
R.styleable.Gallery_android_galleryItemBackground, 0);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return Integer.MAX_VALUE;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return resIds[position];
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
// 自定义的适配器,需要用自定义的布局来显示,通常android的通用布局是不能满足我们的需求
// 可以手工创建一个View视图,也可以inflate填充一个XML
// 从数据源中根据position 获得每一个Item的值,填充到指定的XML布局中
// View convertView 是一个旧的布局,如果没有新的布局填充的时候,将使用旧的布局
// 当前的布局,会被追加到父布局中
ImageView imageView = new ImageView(context);
imageView.setImageResource(resIds[position % resIds.length]);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setLayoutParams(new Gallery.LayoutParams(136, 88));
imageView.setBackgroundResource(mGralleyItemBackground);
return imageView;
}
}
}
·PopupWindow
·
Ø
PopupWindow 可以创建类似对话框风格的窗口,使用PopupWindow创建对话框风格的窗口只要实现两个步骤即可:
·
Ø
1、调用PopupWindow的构造器创建PopupWindow对象
·
Ø
2、调用PopupWindow的showAsDropDown(View view)方法将PopupWindow作为view的组件的下拉组件显示出来,或者调用PopupWindow的showAtLocation方法将PopupWindow在指定的位置显示出来。
·
·ImageSwitcher图片切换控件
·
Ø
ImageSwitcher控件可以用在不同的图像之间切换,其中切换的过程可以采用动画的方法,如淡入淡出的效果。
·
Ø
ImageSwitcher需要一个图像工厂(ViewFactory)来创建用于显示图像的ImageView对象,因此我们需要一个实现android.widget.ViewSwitcher.ViewFactory接口的类。
·
·GridView网格控件
·
Ø
GridView控件用于显示一个网格图像, GridView主要是用在一些相册的布局显示图片。
·
Ø
GridView采用的是二维表的方式显示单元格,就需要设置二维表的行和列。设置GridView的列可以使用<GridView>标签的columnWidth属性。也可以使用GridView类的setColumnWidth方法来设置列数,
·
Ø
GridView中的单元格会根据列数自动拆行显示,因此不需要设置GridView的行数,但是需要设置android:numColumns属性。否则GridView只会显示一行。
·
·Spinner下拉列表控件
·
Ø
Spinner控件用于显示一个下拉列表,该控件在装载数据的时候需要创建一个Adapter适配器对象。并在创建Adapter对象过程中指定要装载的数据是数组或者是List对象的数据
·1.MyAdapter.java
package com.android.adapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.android.myspinner.R;
public class MyAdapter {
public MyAdapter() {}
public static List<String> getData() {
List<String> list = new ArrayList<String>();
list.add("北京");
list.add("上海");
list.add("广州");
return list;
}
public static List<Map<String, Object>> getListMaps() {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("ivLogo", R.drawable.calendar);
map1.put("applicationName", "日历");
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("ivLogo", R.drawable.eoemarket);
map2.put("applicationName", "eoemarket客户端");
list.add(map1);
list.add(map2);
return list;
}
}
·2.OnCreate当中实现:
spinner = (Spinner) this.findViewById(R.id.spinner);
List<String> list = MyAdapter.getData();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(Main.this,
android.R.layout.simple_spinner_item, list);
spinner.setAdapter(adapter);
spinner2 = (Spinner) this.findViewById(R.id.spinner2);
// List<Map<String,Object>>
List<Map<String, Object>> listmaps = MyAdapter.getListMaps();
SimpleAdapter simpleAdapter = new SimpleAdapter(Main.this, listmaps,
R.layout.item, new String[] { "ivLogo", "applicationName" },
new int[] { R.id.imageview, R.id.textview });
spinner2.setAdapter(simpleAdapter);
spinner2.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
String appName = ((Map<String, Object>) spinner2
.getItemAtPosition(position)).get("applicationName")
.toString();
setTitle(appName);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
·TabHost标签控件
Ø
如果在屏幕上要放置很多的控件,可能一个屏放不下,除了使用滚动视图的方式外,还可以使用标签控件对屏幕进行分页显示,当单击标签控件的不同标签时,会显示当前标签的内容,
在android系统中一个标签可以是一个View或者是Activity
Ø
TabHost是标签控件的核心类,也是一个标签的集合,每一个标签是TabHost.TabSpec对象。通过TabHost类的addTab的方法添加多个TabHost.TabSpec对象。
·
·ViewStub惰性装载控件
Ø
之前我们介绍过<include>标签,该标签可以再布局文件中引用另外一个布局文件,这种方式是在布局文件中固定导入,使用起来不是很方便。
Ø
ViewtSub的功能和<include>的功能类似,也是实现引用另外一个布局。但是唯一不同的是ViewStub并不会马上装载引用布局文件,
只有在调用了ViewStub.inflate或ViewStub.setVisibility(View.VISIBILE)方法ViewStub才会装载引用的控件。
·
·ViewPager多页面滑动效果: 略
·
·ListView列表控件
ØAndroid中的列表控件飞创灵活,可以自定义每一个列表项,实际上每一个列表项就是一个View,
在Android定义了3个列表控件:ListView、ExpandableListView和Spinner,其中Spinner就是在Windows中常见的下拉列表框。
ØListView控件用于列表的形式显示数据, ListView控件采用MVC模式将前端显示和后端数据进行分离。
也就是说, ListView控件在装载数据时并不是直接使用ListView.add或者类似的方法添加数据,而是需要指定一个Adapter对象。
该对象相当于MVC模式中的C(控制器,Controller)。ListView相当于MVC模式中的V(视图,View),用于显示数据。为ListView提供数据的List或数组相当于MVC模式中的M(模型,Model)
Ø在ListView控件中通过Adapter对象获得需要显示的数据,在创建Adapter对象时需要指定要显示的数据(List或数组对象),
因此,要显示的数据与ListView之间通过Adapter对象进行连接,同时又互相独立,也就是说,ListView只知道显示的数据来自Adapter,并不知道这些数据来自List还是数组。
Ø对于数据本身来说,只是知道将这些数据添加到Adapter对象中,并不知道这些数据会被用于ListView控件或其他控。
ØMVC好处:MVC把应用程序的逻辑层与界面是完全分开的,最大的好处是:界面设计人员可以直接参与到界面开发,程序员就可以把精力放在逻辑层上。
而不是像以前那样,设计人员把所有的材料交给开发人员,由开发人员来实现界面。
在Eclipes工具中开发Android采用了更加简单的方法,设计人员在AnroidDraw中设计界面,以XML方式保存,在Eclipes中直接打开就可以看到设计人员设计的界面。
逻辑处理的代码则放在src文件夹下。让程序员更专注与业务。
Ø1) 视图层(View):一般采用XML文件进行界面的描述,使用的时候可以非常方便的引入。
Ø同时便于后期界面的修改。逻辑中与界面对应的id不变化则代码不用修改,大大增强了代码的可维护性。
Ø2) 控制层(Controller):Android的控制层的重任通常落在了众多的Acitvity的肩上,这句话也就暗含了不要在Acitivity中写代码,
要通过Activity交割Model业务逻辑层处理,这样做的另外一个原因是Android中的Acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。
Ø3) 模型层(Model):对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在的该层的。就是应用程序中二进制的数据。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:orientation="vertical">
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content" android:orientation="horizontal">
<TextView android:id="@+id/pname" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_marginLeft="3dp"
android:layout_weight="1" android:textSize="15sp" android:text="产品名称" />
<TextView android:id="@+id/price" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_marginLeft="3dp"
android:layout_weight="1" android:textSize="15sp" android:text="产品价格" />
<TextView android:id="@+id/address" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_marginLeft="3dp"
android:layout_weight="1" android:textSize="15sp" android:text="产品产地" />
</LinearLayout>
<ListView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/listview" />
</LinearLayout>
·MyDataSource.java
package com.android.android_listview;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MyDataSource {
public MyDataSource() {}
public static List<Map<String, String>> getMaps() {
List<Map<String, String>> listMaps = new ArrayList<Map<String,String>>();
Map<String, String> map1 = new HashMap<String, String>();
map1.put("pname", "西瓜");
map1.put("price", "$2.30");
map1.put("address", "广西");
Map<String, String> map2 = new HashMap<String, String>();
map2.put("pname", "香蕉");
map2.put("price", "$9.30");
map2.put("address", "浙江");
Map<String, String> map3 = new HashMap<String, String>();
map3.put("pname", "苹果");
map3.put("price", "$99.99");
map3.put("address", "USA");
listMaps.add(map1);
listMaps.add(map2);
listMaps.add(map3);
return listMaps;
}
}
·MainActivity.java
package com.android.android_listview;
import java.util.List;
import java.util.Map;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class MainActivity extends Activity {
private ListView listView;
private SimpleAdapter adapter;
private List<Map<String, String>> data = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) this.findViewById(R.id.listview);
data = MyDataSource.getMaps();
adapter = new SimpleAdapter(MainActivity.this, data,
R.layout.activity_main, new String[] { "pname", "price",
"address" }, new int[] { R.id.pname, R.id.price,
R.id.address });
listView.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
·
·
·
Over