标签:
本篇将开始Android 界面编程探险(二)的旅程。
MultiAutoCompleteTextView是AutoCompleteTextView派生的子类,MultiAutoCompleteTextView允许输入多个提示项,多个提示项以分隔符分隔。下面简单演示AutoCompleteTextView和MultiAutoCompleteTextView的用法:
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" > <!-- 定义一个自动完成文本框,指定输入一个字符后进行提示 --> <AutoCompleteTextView android:id="@+id/auto" android:layout_width="fill_parent" android:layout_height="wrap_content" android:completionHint="请选择:" android:dropDownHorizontalOffset="10dp" android:completionThreshold="1"/> <!-- 定义一个MultiAutoCompleteTextView组件 --> <MultiAutoCompleteTextView android:id="@+id/mauto" android:layout_width="fill_parent" android:layout_height="wrap_content" android:completionThreshold="1"/> </LinearLayout>AutoCompleteTextViewTest.java
public class AutoCompleteTextViewTest extends Activity {
AutoCompleteTextView auto;
MultiAutoCompleteTextView mauto;
String[] str = new String[]{
"aa",
"ab",
"ac",
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 创建ArrayAdapter对象
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, str);
auto = (AutoCompleteTextView)findViewById(R.id.auto);
auto.setAdapter(adapter);
mauto = (MultiAutoCompleteTextView)findViewById(R.id.mauto);
mauto.setAdapter(adapter);
// 为MultiAutoCompleteTextView设置分隔符
mauto.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
}
}
运行如上代码的效果如下图:
GridView与ListView的唯一区别就是ListView只显示一列,GridView可显示多列。GridView常用的XML属性如下:
android:columnWidth="" 设置列的宽度 android:numColumns="" 设置列数 android:gravity="" 设置对齐方式 android:verticalSpacing="" 设置各元素之间的垂直距离 android:horizontalSpacing="" 设置各元素之间的水平距离 android:stretchMode="" 设置拉伸模式GridView的Adapter写法参考ListView。
本部分组件只给出演示效果,具体使用方法可以查阅官方文档。
可展开的列表组件(ExpandableListView)
弹出菜单供用户选择(Spinner)
画廊视图(Gallery)
使用AdapterViewFlipper实现自动播放图片
StackView实现以“堆叠”方式来显示多个列表项
ProgressBar代表了进度条组件,通常用于显示某个耗时操作完成百分比,ProgressBar及其子类类图如下:
ProgressBar的风格可以通过style属性设置,该属性有如下几个属性值:
<!-- 定义一个大环形进度条 --> <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" style="@android:style/Widget.ProgressBar.Large" /> <!-- 定义一个中等大小的环形进度条 --> <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" /> style="@android:style/Widget.ProgressBar.Small" 定义一个小环形进度条 style="@android:style/Widget.ProgressBar.Horizontal" 定义一个水平进度条 style="@android:style/Widget.ProgressBar.Horizontal" 定义一个水平进度条,并改变轨道外观ProgressBar常用的XML属性如下:
android:max="100" 设置进度条的最大值 android:progress="" 设置进度条已完成进度值 android:progressDrawable="@drawable/.." 设置进度条的轨道对应的Drawable对象 android:indeterminate="" true表示设置进度条不精确显示进度 android:indeterminateDrawable="" 设置绘制不显示进度的进度条的Drawable对象 android:indeterminateDuration="" 设置不精确显示进度的持续时间
SeekBar的应用比较少(典型应用有拖动调节音量等),SeekBar的用法请查阅官方文档。
RatingBar和SeekBar十分相似,它们最大区别在于RatingBar通过星星来表示进度,RatingBar的用法请查阅官方文档。
ViewSwitcher:视图切换组件,可实现分屏、左右滚动的效果。
ImageSwitcher:图像切换器,可在切换View组件时使用动画效果。
TextSwitcher:文本切换器,可在切换View组件时使用动画效果,与ImageSwitcher不同的是TextSwitcher所需的ViewFactory的makeView()方法必须返回一个TextView组件;TextSwitcher和TextView功能相似,都可以显示文本内容,区别在于TextSwitcher可指定文本切换时的动画效果。
Android提供了4种常用的对话框:
AlertDialog:功能最丰富、实际应用最广泛的对话框
ProgressDialog:进度对话框
DatePickerDialog:日期选择对话框
TimePickerDialog:时间选择对话框
AlertDialog提供了如下6种方法来指定对话框的内容:
setMessage() 设置对话框内容为简单文本内容 setItems() 设置对话框内容为简单列表项 setSingleChoiceItems() 设置对话框内容为单选列表项 setMultiChoiceItems() 设置对话框内容为多选列表项 setAdapter() 设置对话框内容为自定义列表项 setView() 设置对话框内容为自定义View下面来看看AlertDialog的具体用法:
/**
* 简单对话框点击事件
* @param view
*/
public void simpleDialog(View view) {
new AlertDialog.Builder(this)
.setTitle("简单对话框") // 设置对话框标题
.setIcon(R.drawable.tools) // 设置图标
.setCancelable(false) // 设置点击Dialog以外的界面不消失,按返回键也不起作用
// .setCanceledOnTouchOutside(false); // 设置点击Dialog以外的界面不消失,按返回键还起作用
.setMessage("确定退出吗?")
.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(), "单击了确定按钮!", 0).show();
}
})
.setNegativeButton("取消", null)
.create()
.show();
}效果图:
public void showSpinner(View view) {
// 调用静态方法显示环形进度条
ProgressDialog.show(this, "任务执行中", "任务执行中,请等待", false, true);
}效果图:public class ProgressDialogTest extends Activity {
final static int MAX_PROGRESS = 100;
private int[] data = new int[50]; // 该程序模拟填充长度为100的数组
int progressStatus = 0; // 记录进度对话框的完成百分比
int hasData = 0;
ProgressDialog pd;
/**
* 定义一个负责更新的进度的Handler
*/
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// 表明消息是由该程序发送的
if (msg.what == 0) {
pd.setProgress(progressStatus);
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
/**
* 显示进度的进度条的点击事件
* @param source
*/
public void showProgress(View source) {
progressStatus = 0; // 将进度条的完成进度重设为0
hasData = 0; // 重新开始填充数组
pd = new ProgressDialog(ProgressDialogTest.this);
pd.setMax(MAX_PROGRESS);
pd.setTitle("任务完成百分比"); // 设置对话框的标题
pd.setMessage("耗时任务的完成百分比"); // 设置对话框 显示的内容
pd.setCancelable(false); // 设置对话框不能用“取消”按钮关闭
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); // 设置对话框的进度条风格
pd.setIndeterminate(false); // 设置对话框的进度条是否显示进度
pd.show();
new Thread() {
public void run() {
while (progressStatus < MAX_PROGRESS) {
progressStatus = MAX_PROGRESS * doWork() / data.length; // 获取耗时操作的完成百分比
handler.sendEmptyMessage(0); // 发送空消息到Handler
}
// 如果任务已经完成
if (progressStatus >= MAX_PROGRESS) {
// 关闭对话框
pd.dismiss();
}
}
}.start();
}
/**
* 模拟一个耗时的操作
* @return
*/
public int doWork() {
data[hasData++] = (int) (Math.random() * 100); // 为数组元素赋值
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return hasData;
}
}效果图:
Android系统的菜单支持类图如下:
ContextMenu:上下文菜单
SubMenu:子菜单
MenuItem:菜单项
PopupMenuTest.java
public class PopupMenuTest extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
PopupMenu popup = null;
/**
* 弹出式菜单的点击事件
* @param button
*/
public void onPopupButtonClick(View button) {
popup = new PopupMenu(this, button); // 创建PopupMenu对象
// 将R.menu.popup_menu菜单资源加载到popup菜单中
getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());
// 为popup菜单的菜单项单击事件绑定事件监听器
popup.setOnMenuItemClickListener(
new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.item1:
// 隐藏该对话框
popup.dismiss();
break;
default:
// 使用Toast显示用户点击的菜单项
Toast.makeText(PopupMenuTest.this, "您单击了" + item.getTitle() + "菜单项", 0).show();
}
return true;
}
});
popup.show();
}
}其中res/menu/popup_menu.xml为<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/item1"
android:icon="@android:drawable/ic_menu_search"
android:textSize="16sp"
android:title="发起群聊"/>
<item
android:id="@+id/item2"
android:icon="@android:drawable/ic_menu_add"
android:textSize="16sp"
android:title="添加朋友"/>
<item
android:id="@+id/item3"
android:textSize="16sp"
android:title="扫一扫"/>
<item
android:id="@+id/item4"
android:textSize="16sp"
android:title="收付款"/>
</menu>
styles.xml如下
<resources>
<!-- Application theme. -->
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"></style>
</resources>
运行后效果图如下:
标签:
原文地址:http://blog.csdn.net/smartbetter/article/details/51425204