- 触摸监听和键盘监听
给Activity添加触摸监听和键盘监听
@Override
public boolean onTouchEvent(MotionEvent event) {
//触摸监听,输出触摸点的坐标
System.out.println(event.getX()+" "+event.getY());
return super.onTouchEvent(event);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
//键盘监听,输出点击了按键的keyCode
System.out.println(keyCode + " " + KeyEvent.keyCodeToString(keyCode));
return super.onKeyDown(keyCode, event);
}
运行后查看LogCat日志:
注意:键盘监听指的是物理键盘,对软件键盘无效,运行的时候只能捕捉到KEYCODE_MENU菜单键、KEYCODE_DEL删除键、KEYCODE_BACK返回键。
2. 自定义Toast通知
// 自定义Toast
// 把一个布局转化为View
View v = View.inflate(this, R.layout.toast, null);
Toast toast = new Toast(this);
toast.setView(v);
toast.setDuration(0);
toast.setGravity(Gravity.TOP | Gravity.RIGHT, 0, 50);
toast.show();
3.对话框Dialog
3.1 AlertDialog
(1)样式一:
// 构建者模式 :把内容和表现分开
AlertDialog.Builder builder = new AlertDialog.Builder(this);
// 方法链builder.setCancelable(true).setIcon(R.drawable.ic_launcher).setMessage("xxxx")
.setTitle("AlertDialog测试").setPositiveButton("yes", new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
MainActivity.this.finish();
}
}).setNegativeButton("cancle", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
// dialog.cancel();
}
}).setNeutralButton("no", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).create().show();
(2)样式二:
//选项列表样式对话框
//颜色选项字符串
final CharSequence[] items3 = { "Red", "Green", "Blue" };
//构建者
AlertDialog.Builder builder3 = new AlertDialog.Builder(this);
builder3.setTitle("Pick a color");
//设置选项,并添加监听
builder3.setItems(items3, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
// getApplicationContext()
// MainActivity.this
// 包含的信息多,但是注意引用不要传到其他activity,否则该activity无法释放
Toast.makeText(getApplicationContext(), items3[item], Toast.LENGTH_SHORT).show();
}
});
//创建出AlertDialog对话框并显示
AlertDialog alert = builder3.create();
alert.show();
(3)样式三:
//单选选项列表对话框
//颜色选项字符串
final CharSequence[] items4 = { "Red", "Green", "Blue" };
//构建者
final AlertDialog.Builder builder4 = new AlertDialog.Builder(this);
builder4.setTitle("选择一种颜色");
//设置单选选项,并添加监听
builder4.setSingleChoiceItems(items4, -1, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, items4[which], 0).show();
}
});
//点击ok按钮后对话框消失
builder4.setPositiveButton("ok", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
//创建出AlertDialog对话框并显示
AlertDialog alertDialog = builder4.create();
alertDialog.show();
**区别:**MainActivity.this包含的信息多,但是注意引用不要传到其他Activity,否则该activity无法释放;
getApplicationContext();有的情况下不能用。
3.2 进度对话框
(1)样式一:
//转圈进度条对话框
ProgressDialog d = ProgressDialog.show(this, "upload...", "xxxxxx");
//设置单击空白处可以取消对话框
d.setCancelable(true);
(2)样式二:
//创建进水平度条对话框
ProgressDialog pd = new ProgressDialog(this);
//设置对话框标题
pd.setTitle("正在下载文件xxx");
//设置对话框图标
pd.setIcon(R.drawable.ic_launcher);
//设置进度条类型为水平
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//设置对话框上显示内容
pd.setMessage("已经下载了10%..");
//设置单击空白处可以取消对话框
pd.setCancelable(true);
//设置最大进度为100
pd.setMax(100);
//设置当前进度为10
pd.setProgress(10);
//设置二级进度为20
pd.setSecondaryProgress(20);
//显示对话框
pd.show();
3.3 自定义Dialog
自定义对话框:
//自定义对话框
Dialog myDialog = new Dialog(this);
//设置对话框标题
myDialog.setTitle("自定义对话框测试");
//把一个布局转化为View
//View view = View.inflate(this, R.layout.mydialog, null);
//设置自定义对话框的布局
myDialog.setContentView(R.layout.mydialog);
//获得自定义对话框上的Button,并添加监听
final Button btn = (Button) myDialog.findViewById(R.id.button1);
btn.setText("xxx");
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "点击了"+btn.getText(), 0).show();
}
});
//显示对话框
myDialog.show();
3.4 日期对话框DatePickerDialog
布局文件:
<!--显示日期,初始值为当前日期-->
<TextView
android:id="@+id/tv_date"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lines="3"
android:gravity="center"
android:textColor="#0000FF"
android:textSize="32sp"/>
<!--单击按钮弹出日期对话框,并将改变后的日期显示在上面的TextView中-->
<Button
android:id="@+id/btn_change"
android:layout_below="@id/tv_date"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="改变日期"/>
java实现代码:
//实现OnClickListener接口
public class MainActivity extends Activity implements OnClickListener{
private TextView tv_date;
private Button btn_change;
private int year,month,day;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获得TextView,Button
tv_date = (TextView) this.findViewById(R.id.tv_date);
btn_change = (Button) this.findViewById(R.id.btn_change);
//获得当前日期
Calendar calendar = Calendar.getInstance();
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH);
day = calendar.get(Calendar.DAY_OF_MONTH);
//更新日期显示
updateDisplay(year,month,day);
//添加监听事件
btn_change.setOnClickListener(this);
}
//自定义更新日期显示方法
private void updateDisplay(int year, int month, int day) {
StringBuilder sb = new StringBuilder();
sb.append(year).append("-").append(month).append("-").append(day);
tv_date.setText(sb);
}
@Override
public void onClick(View v) {
//日期选择对话框
DatePickerDialog dpd = new DatePickerDialog(this, new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
//更新日期显示
updateDisplay(year, monthOfYear, dayOfMonth);
}
}, year, month, day);
dpd.show();//注意:一定记得show出来
}
}
运行:
点击“改变日期”按钮:
点击ok后日期改变。
区别: DatePickerDialog
DatePicker显示在界面中的
3.5 用线程模拟进度条
在布局文件中添加一个Button,当点击该按钮时,显示进度条对话框。
实现代码:
public class MainActivity extends Activity {
private final int PROGRESSDIALOG = 1;
private ProgressDialog progressDialog;
private ProgressThread thread;
//处理消息队列
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
//从Message中获得参数以及对象
int progess = msg.arg1;
progressDialog = (ProgressDialog) msg.obj;
//设置进度
progressDialog.setProgress(progess);
//当进度完成后,销毁进度对话框,并设置线程状态为PROGRESS_DONE停止子线程
if(progess==100){
progressDialog.dismiss();
thread.setProgressState(ProgressThread.PROGRESS_DONE);
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获得button对象,并添加监听
Button button = (Button) this.findViewById(R.id.btn_create);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//显示进度对话框
showDialog(PROGRESSDIALOG);
}
});
}
@Override
protected Dialog onCreateDialog(int id) {
// TODO Auto-generated method stub
//此方法先执行,且只执行一次
Toast.makeText(this, "onCreateDialog", 0).show();
switch (id) {
case PROGRESSDIALOG:
progressDialog = new ProgressDialog(this);
//设置样式为水平进度条样式
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//设置进度最大值为100
progressDialog.setMax(100);
//设置初始进度为 0
progressDialog.setProgress(0);
return progressDialog;
default:
return null;
}
}
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
// TODO Auto-generated method stub
//每次showDialog执行之前执行此方法,在onCreateDialog方法之后
Toast.makeText(this, "onPrepareDialog", 0).show();
progressDialog = (ProgressDialog) dialog;
progressDialog.setProgress(0);
//启动子线程
thread = new ProgressThread(progressDialog);
thread.start();
super.onPrepareDialog(id, dialog);
}
//定义子线程
class ProgressThread extends Thread{
//进度完成常量
public static final int PROGRESS_DONE = 0;
//进度运行常量
public static final int PROGRESS_RUNNING =1;
//进度状态变量
private int progressState;
//关联进度对话框
private ProgressDialog progressDialog;
public ProgressThread(ProgressDialog progressDialog) {
this.progressState = PROGRESS_RUNNING;
this.progressDialog = progressDialog;
}
//设置进程状态
public void setProgressState(int progressState) {
this.progressState = progressState;
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
int progress = 0;
while(progressState == PROGRESS_RUNNING){
SystemClock.sleep(100);
//获取当前进度并设置新的进度
progress ++;
//定义Message
Message msg = new Message();
//把当前进度变量保存到msg中
msg.arg1 = progress;
//把进度对话框保存到msg中,obj保存的是对象
msg.obj = progressDialog;
//将msg添加到消息队列
handler.sendMessage(msg);
}
}
}
}
运行:
点击按钮:
说明:
showDialog();显示Dialog
dismissDialog();//销毁Dialog
先执行onCreateDialog() :此方法只执行一次,以后再 showDialog的时候不再创建
再执行onPrepareDialog():每次show执行的时候先要执行此方法
注意:在UI线程或主线程中,不能使用长循环,或耗时操作,否则界面会卡死;
UI线程即主线程,事件处理在UI线程中,如果有耗时操作,应该写在子线程中;
界面本身是一个Activity对象,是非线程安全的,只能由主线程负责绘制,如果子线程也绘制,将会引起多线程安全,子线程负责长循环,如果数据发生改变,由主线程绘制。
消息队列
Handler handler = new Handler{
handlerMessage(…)
}
子线程:
SystemClock.sleep();//android中的,已经try catch处理了
Message msg = new Message();
msg.arg1 =i;
msg.obj = pd;//放对象
handler.sendMessage(msg);