一、自动完成文本框AutoCompleteTextView
<AutoCompleteTextView android:id="@+id/auto"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:completionHint="请选择您喜欢的图书"
android:dropDownHorizontalOffset="20dp"
android:completionThreshold="3"/>
<!--android:completionHint设置出现下拉菜单中的提示标题
android:completionThreshold="1"设置用户至少输入几个字符才会显示提示
android:dropDownHorizontalOffset="20dp"设置下拉菜单与文本框之间的水平偏移,
下拉菜单默认与文本框做对齐-->
//定义字符串数组,作为提示的文本
String[] books = new String[]{
"会有天使替我爱你",
"梦里花落知多少",
"幻城",
"猜火车",
"三重门",
"android疯狂讲义"
};
//创建一个ArrayAdapter,封装数组
ArrayAdapter<String> aa = new ArrayAdapter<String>(
this, android.R.layout.simple_dropdown_item_1line,books);
AutoCompleteTextView actv = (AutoCompleteTextView) findViewById(R.id.auto);
//设置Adapter
actv.setAdapter(aa);
二、Spinner列表选择框
1.Spinner组件与Swing编程中的Spinner不同,此处的Spinner其实就是一个列表选择框,不过Android
的列表选择框并不是需要显示下拉列表的,而是相当于弹出一个菜单供用户选择
<!-- 定义一个Spinner组件,指定显示该组件的数组 -->
<Spinner android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:entries="@array/books"/>
<!-- android:entries指定数组资源 -->
arrays.xml放在values目录下
<resources>
<string-array name="books">
<item>会有天使替我爱你</item>
<item>梦里花落知多少</item>
<item>三重门</item>
</string-array>
</resources>
2.不存储列表项的Spinner
对于Spinner而言,它也许需要显示一个用户选择的列表---至于这个列表
到底以数组的形式给出,还是以其它的什么形式给出,这不重要。
重要的是Spinner知道它的每项应该显示什么
<!-- 定义一个Spinner组件 -->
<Spinner android:id="@+id/test"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
BaseAdapter ba = new BaseAdapter() {
//重写该方法,该方法返回的View将作为列表框的每项
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView text = new TextView(SpinnerTest2Activity.this);
text.setText(position + "");
text.setTextSize(20);
text.setTextColor(R.color.red);
return text;
}
@Override
public int getCount() {
//指定一共包含10个选项
return 10;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public Object getItem(int position) {
return null;
}
};
Spinner spinner = (Spinner) findViewById(R.id.test);
spinner.setAdapter(ba);
colors.xml放在values目录下
<resources>
<color name="red">#ff0000</color>
</resources>
通过为Spinner提供Adapter可以非常灵活的定制Spinner,包括重绘Spinner对象的列表的外观。
只要喜欢,可以让重写getView方法返回任意的View对象,该对象将会作为Spinner的列表项
修改上面的getView方法:
//重写该方法,该方法返回的View将作为列表框的每项
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LinearLayout line = new LinearLayout(SpinnerTest2Activity.this);
line.setOrientation(0);
ImageView image = new ImageView(SpinnerTest2Activity.this);
image.setImageResource(R.drawable.ic_launcher);
TextView text = new TextView(SpinnerTest2Activity.this);
text.setText(position + "");
text.setTextSize(20);
text.setTextColor(R.color.red);
line.addView(image);
line.addView(text);
return line;
}
三、日期、时间选择器DatePicker和TimePicker
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="选择购买本书的具体时间" />
<!-- 定义一个DatePicker组件 -->
<DatePicker android:id="@+id/datePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"/>
<!-- 定义一个TimePicker组件 -->
<TimePicker android:id="@+id/timePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"/>
<!-- 显示用户输入日期、时间的控件 -->
<EditText android:id="@+id/show"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:editable="false"
android:cursorVisible="false"/>
DatePicker datePicker = (DatePicker) findViewById(R.id.datePicker);
TimePicker timePicker = (TimePicker) findViewById(R.id.timePicker);
//获取当前的年、月、日、小时、分钟
Calendar c = Calendar.getInstance();
year = c.get(Calendar.YEAR);
month = c.get(Calendar.MONTH);
day = c.get(Calendar.DAY_OF_MONTH);
hour = c.get(Calendar.HOUR);
minute = c.get(Calendar.MINUTE);
//初始化DatePicker组件,初始化时指定监听器
datePicker.init(year, month, day, new OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker view, int year, int month,
int day) {
ChooseDateActivity.this.year = year;
ChooseDateActivity.this.month = month;
ChooseDateActivity.this.day = day;
//显示当前日期、时间
showDate(year, month, day, hour, minute);
}
});
timePicker.setOnTimeChangedListener(new OnTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker view, int hour, int minute) {
ChooseDateActivity.this.hour = hour;
ChooseDateActivity.this.minute = minute;
showDate(year, month, day, hour, minute);
}
});
}
//定义在EditText中显示当前日期、时间的方法
private void showDate(int year,int month,int day,int hour,int minute)
{
EditText show = (EditText) findViewById(R.id.show);
show.setText("您的购买日期为:"+year + "年" +(month + 1) + "月"
+ day + "日" + hour + "时" + minute + "分");
}
四、进度条ProgressBar
1.<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="任务完成的进度" />
<!-- 定义一个水平进度条 -->
<ProgressBar android:id="@+id/bar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:max="100"
style="@android:style/Widget.ProgressBar.Horizontal"/>
<!-- 定义一个水平进度条,并改变轨道外观 -->
<ProgressBar android:id="@+id/bar2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:max="100"
android:progressDrawable="@drawable/my_bar"
style="@android:style/Widget.ProgressBar.Horizontal"/>
my_bar.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 定义轨道的背景 -->
<item android:id="@android:id/background"
android:drawable="@drawable/no"></item>
<!-- 定义轨道上已完成部分的样式 -->
<item android:id="@android:id/progress"
android:drawable="@drawable/ok"></item>
</layer-list>
//该程序模拟填充长度为100的数组
private int[] data = new int[100];
int hasData = 0;
//记录ProgressBar的完成进度
int statu = 0;
final ProgressBar bar = (ProgressBar) findViewById(R.id.bar);
final ProgressBar bar2 = (ProgressBar) findViewById(R.id.bar2);
//创建一个负责更新的进度的Handler
final Handler mHandler = new Handler()
{
@Override
public void handleMessage(Message msg) {
// 表明消息是由该程序发送的
if(msg.what==0x111)
{
bar.setProgress(statu);
bar2.setProgress(statu);
}
super.handleMessage(msg);
}
};
//启动线程来执行任务
new Thread()
{
public void run() {
while(statu < 100)
{
//获取耗时操作的完成百分比
statu = doWork();
//发送消息到Handler
Message m = new Message();
m.what = 0x111;
//发送消息
mHandler.sendMessage(m);
}
};
}.start();
}
//模拟一个耗时的操作
public int doWork()
{
//为数组元素赋值
data[hasData++] = (int) (Math.random()*100);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return hasData;
}
2.显示在标题上的进度条
super.onCreate(savedInstanceState);
//设置窗口特征:启用显示进度的进度条
requestWindowFeature(Window.FEATURE_PROGRESS);
//设置窗口特征:启用不显示进度的进度条
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.main);
Button bn1 = (Button) findViewById(R.id.bn01);
Button bn2 = (Button) findViewById(R.id.bn02);
bn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//显示不带进度的进度条
setProgressBarIndeterminateVisibility(true);
//显示带进度的进度条
setProgressBarVisibility(true);
//设置进度条的进度
setProgress(4500);
}
});
bn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//隐藏不带进度的进度条
setProgressBarIndeterminateVisibility(false);
//隐藏带进度的进度条
setProgressBarVisibility(false);
}
});
五、拖动条SeekBar
<ImageView
android:id="@+id/image"
android:layout_width="fill_parent"
android:layout_height="240px"
android:src="@drawable/lijiang"/>
<!-- 定义一个拖动条,并改变它的滑块外观 -->
<SeekBar android:id="@+id/seekbar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:max="255"
android:progress="255"
android:thumb="@drawable/icon"/>
final ImageView image = (ImageView) findViewById(R.id.image);
SeekBar seekBar = (SeekBar) findViewById(R.id.seekbar);
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
//当拖动条的滑块位置发生改变时触发该方法
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser)
{
image.setAlpha(progress);
}
});
六、星级评分条
<ImageView android:id="@+id/image"
android:layout_width="fill_parent"
android:layout_height="240px"
android:src="@drawable/lijiang"/>
<RatingBar
android:id="@+id/rating"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numStars="5"
android:max="255"
android:progress="255"
android:stepSize="0.5"/>
final ImageView image = (ImageView) findViewById(R.id.image);
RatingBar ratingBar = (RatingBar) findViewById(R.id.rating);
ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {
//当拖动条的滑块位置发生改变时触发该方法
@Override
public void onRatingChanged(RatingBar ratingBar, float rating,
boolean fromUser)
{
//动态改变图片的透明度,其中255是星级评分条的最大值
//5个星就代表最大值255
image.setAlpha((int) (rating*255/5));
}
});
七、选项卡TabHost
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<!-- 定义第一个标签页的内容 -->
<LinearLayout android:id="@+id/tab01"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="@+id/tw01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="xiaoming"/>
</LinearLayout>
<!-- 定义第二个标签页的内容 -->
<LinearLayout android:id="@+id/tab02"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="@+id/tw11"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="zhongming"/>
</LinearLayout>
<!-- 定义第三个标签页的内容 -->
<LinearLayout android:id="@+id/tab03"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textSize="11pt">
<TextView android:id="@+id/tw21"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="daming"/>
</LinearLayout>
</TabHost>
super.onCreate(savedInstanceState);
//setContentView(R.layout.main);
TabHost tabHost = getTabHost();
//设置使用TabHost布局
LayoutInflater.from(this).inflate(R.layout.main, tabHost.getTabContentView(),true);
//添加第一个标签页
tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("已接电话").setContent(R.id.tab01));
//添加第二个标签页
tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("呼出电话",getResources().getDrawable(R.drawable.ic_launcher)).setContent(R.id.tab02));
//添加第三个标签页
tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("未接电话").setContent(R.id.tab03));
八、滚动试图ScrollView
<!-- 定义ScrollView,为里面的组件添加垂直滚动条 -->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<!-- 定义HorizontalScrollView,为里面的组件添加水平滚动条 -->
<HorizontalScrollView android:layout_width="fill_parent"
android:layout_height="wrap_content">
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="gundongshitugundongshitu"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="gundongshitugundongshitu"/>
<!--省略n多个TextView组件 -->
</LinearLayout>
</HorizontalScrollView>
</ScrollView>
九、列表视图ListView
1.基于数组的ListView
arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="books">
<item>梦里花落知多少</item>
<item>夏末未至</item>
<item>爱与痛的边缘</item>
<item>幻城</item>
<item>猜火车</item>
<item>三重门</item>
<item>零下一度</item>
<item>一座城池</item>
<item>长安乱</item>
<item>他的国</item>
<item>会有天使替我爱你</item>
<item>冬日最灿烂的阳光</item>
<item>泡沫之夏</item>
<item>小魔女的必杀技</item>
<item>雨夜里的星星沙</item>
<item>无往而不胜的童话</item>
<item>午后熏衣茶</item>
</string-array>
</resources>
<!-- 直接使用数组资源给出列表项 -->
<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:entries="@array/books"
android:divider="@drawable/red"/>
2. 通过ArrayAdapter使用数组来提供列表项
<!-- 使用ArrayAdapter提供列表项的ListView -->
<ListView android:id="@+id/list2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:divider="@drawable/green">
ListView list2 = (ListView) findViewById(R.id.list2);
//定义一个数组
String[] arr = {"郭敬明","韩寒","明晓溪"};
//将数组包装ArrayAdapter
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, arr);
//为ListView设置Adapter
list2.setAdapter(arrayAdapter);
说明:
simple_list_item_1每个列表项都是一个普通的TextView
simple_list_item_2每个列表项都是一个普通的TextView(字体略大)
simple_list_item_checked每个列表项都是一个已勾选的列表项
simple_list_item_multiple_choice每个列表项都是带多选框的文本
simple_list_item_single_choice每个列表项都是带多单选按钮的文本
3.基于ListActivity实现列表
super.onCreate(savedInstanceState);
//定义一个数组
String[] arr = {"郭敬明","韩寒","明晓溪"};
//将数组包装ArrayAdapter
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_multiple_choice, arr);
//设置该窗口显示列表
setListAdapter(arrayAdapter);
4.使用SimpleAdapter创建ListView
<!-- 定义一个List -->
<ListView android:id="@+id/mylist"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<!-- 定义一个ImageView,用于作为列表项的一部分 -->
<ImageView android:id="@+id/header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="10dp"/>
<!-- 定义一个TextView,用于作为列表项的一部分 -->
<TextView android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16dp"
android:gravity="center_vertical"
android:paddingLeft="10dp"/>
private String[] names = new String[]{
"虎头","弄玉","李清照","李白"};
private int[] imageIds = new int[]{
R.drawable.tiger,
R.drawable.nongyu,
R.drawable.qingzhao,
R.drawable.libai
};
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//创建一个List集合,List集合的元素是Map
List<Map<String,Object>> listItems = new ArrayList<Map<String,Object>>();
for(int i = 0; i < names.length;i++)
{
Map<String,Object> listItem = new HashMap<String, Object>();
listItem.put("header", imageIds[i]);
listItem.put("personName", names[i]);
listItems.add(listItem);
}
//创建一个SimpleAdapter
SimpleAdapter simpleAdapter = new SimpleAdapter(this
,listItems
,R.layout.main
,new String[]{"personName","header"}
,new int[]{R.id.name,R.id.header});
ListView list = (ListView) findViewById(R.id.mylist);
//为ListView设置Adapter
list.setAdapter(simpleAdapter);