第0节 如何排查解决常见异常
运行程序时出现
基本常见异常的一般分析步骤:
1. 确定异常类型: 在logcat从下向上找, 最好能找到cause by(会显示那种异常)
2. 找到出现异常的类确定出异常的行号: 找到当前应用的代码行号, 双击定位
3. 分析, 打印Log, debug调试
常见的异常:
1. NullPointerException
原因: 调用值为null的对象的方法或属性
2. ClassCastException
原因: 执行强制转换, 但类型匹配
3. ActivityNotFoundException:
原因: Activity没有找到, 很可能没有注册或注册不正确
第一节 理论概述_UI理解
UI的定义
全称user interface, 意为: 用户界面
UI由View和ViewGroup组成
View类是所有视图(包括ViewGroup)的根基类
View在屏幕上占据一片矩形区域, 并会在上面进行内容绘制
ViewGroup包含一些View或ViewGroup,用于控制子View的布局
VIEW的API结构
标红色是最重要的,标蓝色的是次要的
UI的组成
界面的整体布局(layout)
组成可视界面的各个UI组件
第二节 理论概述_UI事件
当用户通过手指触摸UI时, 系统会自动创建对应的Event对象
Android中提供了多种方式拦截处理不同类型的事件
视图本身就可以处理发生在该视图上的事件
使用UI事件
• Android提供了很多不同类型的事件监听器接口
View.OnClickListener: onClick()
View.OnLongClickListener: onLongClick()
View.OnTouchListener: onTouch()
View.OnCreateContextMenuListener: onCreateContextMenu()
View.OnFocusChangeListener: onFocusChange()
View.OnKeyListener: onKey()
• 给视图添加事件监听的方式
view.seton…Listener(listener)
第三节 常用UI组件_测试准备
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btn_main_test1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="测试常用简单的Component" />
<Button
android:id="@+id/btn_main_test2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="测试菜单Component" />
<Button
android:id="@+id/btn_main_test3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="测试进度条Component" />
<Button
android:id="@+id/btn_main_test4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="测试对话框Component" />
</LinearLayout>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); findViewById(R.id.btn_main_test1).setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_main_test1://常用简单的Component
startActivity(new Intent(this, SimpleComponentActivity.class));
default:
break;
}
}
第四节 常用UI组件_TextView
TextView : 文本视图
<TextView
android:id=“@+id/tv_test1_message“ //指定id
android:layout_width=“match_parent“ //宽度
android:layout_height=“wrap_content“ //高度
android:text=“这是TextView的内容“ // 文本
android:textColor=“#ff0000“ // 文本颜色
android:textSize=“20sp” /> // 字体大小
第五节 常用UI组件_EditText
<EditText
android:id="@+id/et_test1_number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint=“请输入手机号“ //默认提示文本
android:inputType=“phone”> // 输入数据类型限定
</EditText>
第六节 常用UI组件_Button
<Button
android:id="@+id/btn_test1_submit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="提 交" />
第七节 常用UI组件_ImageView
<ImageView
android:id="@+id/iv_test1_play"
android:layout_width="70dp"
android:layout_height="70dp"
android:background=“@drawable/ic_launcher“ //背景图片
android:src=“@android:drawable/ic_media_play”/> //前景图片
//设置前景图片
public void setImageResource(int resId)
//设置背景图片
public void setBackgroundResource(int resid)
第八节 08_常用UI组件_CheckBox
<CheckBox
android:id="@+id/cb_test1_basket"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="篮球"
android:checked=“true”/> //标识默认是否勾选
//判断当前是否勾选
boolean isChecked()
//设置CheckBox是否勾选
void setChecked(boolean checked)
//设置选中状态改变的监听
void setOnCheckedChangeListener(OnCheckedChangeListener listener)
第九节 常用UI组件_RadioButton
给RadioGroup设置改变的监听同CheckBox
<RadioGroup
android:id="@+id/rg_test1_sex"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<RadioButton
android:id="@+id/rb_test1_male"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="男" />
<RadioButton
android:id="@+id/rb_test1_female"
android:layout_width="wrap_content"
android:layout_height="wrap_content“
android:checked="true"
android:text="女" />
</RadioGroup>
具体实例如下
package com.xp.l03_component;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
public class SimpleComponentActivity extends Activity {
private TextView tv_simple_message;
private EditText et_simple_number;
private Button btn_simple_submit;
private ImageView iv_simple_icon;
private CheckBox cb_simple_basket;
private CheckBox cb_simple_foot;
private CheckBox cb_simple_pingpang;
private RadioGroup rg_simple_sex;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_simple_component);
//1. TextView
tv_simple_message = (TextView) findViewById(R.id.tv_simple_message);
tv_simple_message.setText("尚硅谷0712NB");
//2. EditText
et_simple_number = (EditText) findViewById(R.id.et_simple_number);
//3. Button
btn_simple_submit = (Button) findViewById(R.id.btn_simple_submit);
btn_simple_submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//得到内容
String number = et_simple_number.getText().toString();
//提示
Toast.makeText(SimpleComponentActivity.this, number, 0).show();
}
});
//4. ImageView
iv_simple_icon = (ImageView) findViewById(R.id.iv_simple_icon);
iv_simple_icon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//设置背景图片
iv_simple_icon.setBackgroundResource(android.R.drawable.alert_light_frame);
//设置前景图片
iv_simple_icon.setImageResource(android.R.drawable.ic_media_pause);
}
});
//5. CheckBox
cb_simple_basket = (CheckBox) findViewById(R.id.cb_simple_basket);
cb_simple_foot = (CheckBox) findViewById(R.id.cb_simple_foot);
cb_simple_pingpang = (CheckBox) findViewById(R.id.cb_simple_pingpang);
//给cb_simple_foot设置选中状态改变的监听
cb_simple_foot.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked) {
Toast.makeText(SimpleComponentActivity.this, "选中了足球", 0).show();
} else {
Toast.makeText(SimpleComponentActivity.this, "未选中足球", 0).show();
}
}
});
//6. RadioGroup/RadioButton
rg_simple_sex = (RadioGroup) findViewById(R.id.rg_simple_sex);
rg_simple_sex.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {//checkedId 选中的radioButton的id
//找到选中的radioButton
RadioButton radioButton = (RadioButton) findViewById(checkedId);
//得到文本
String sex = radioButton.getText().toString();
//提示
Toast.makeText(SimpleComponentActivity.this, sex, 0).show();
}
});
}
public void confirm(View v) {
StringBuffer sb = new StringBuffer();
if(cb_simple_basket.isChecked()) {
sb.append(cb_simple_basket.getText().toString()).append(" ");
}
if(cb_simple_foot.isChecked()) {
sb.append(cb_simple_foot.getText().toString()).append(" ");
}
if(cb_simple_pingpang.isChecked()) {
sb.append(cb_simple_pingpang.getText().toString());
}
//提示
Toast.makeText(this, sb.toString(), 0).show();
}
}
菜单Component
关于menu的三个问题
如何触发Menu的显示?
如何向Menu中添加MenuItem?
选择某个MenuItem时如何响应?
第十节 10_常用UI组件_OptionMenu
• OptionMenu在点击手机的menu键触发
• Activity :onCreateOptionsMenu(Menu menu)
• 显示OptionMenu的回调方法, 在此方法中向Menu中添加MenuItem
• 添加menuItem的两种方式:
• 纯编码方式: menu.add(….)
• 加载menu文件的方式:
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.main_option, menu);
• Activity : onOptionsItemSelected(MenuItem item)
• 当选择某个菜单项的回调方法
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btn_test2_show_cm"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="显示ContextMenu" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="1. 点击menu显示选项菜单\n2. 长按按钮显示上下文菜单"
android:textSize="25dp" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/add"
android:title="添加2">
</item>
<item
android:id="@+id/delete"
android:title="删除2">
</item>
</menu>
第十一节 11_常用UI组件_ContextMenu
View : setOnCreateContextMenuListener(listener)
为某个视图添加创建ContextMenu的监听(需要长按触发)
Activity : onCreateContextMenu(menu, view, menuInfo)
显示菜单的回调方法
Activity : onContextItemSelected(MenuItem item)
当选择某个菜单项的回调方法
package com.xp.l03_component;
import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
/**
* 测试Menu
*/
/*
* OptionMenu 1. 如何触发Menu的显示? 点击menu键 2. 如何向Menu中添加MenuItem?
* 重写onCreateOptionMenu() menu.add()或者加载菜单文件 3. 选择某个MenuItem时如何响应?
* 重写onOptionsItemSelected(), 根据itemId做响应 ContextMenu 1. 如何触发Menu的显示? 长按某个视图
* view.setOnCreateContextMenuListener(this) 2. 如何向Menu中添加MenuItem?
* 重写onCreateContextMenu() menu.add() 3. 选择某个MenuItem时如何响应?
* 重写onContextItemSelected(), 根据itemId做响应
*/
public class MenuActivity extends Activity {
private Button btn_test2_show_cm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
btn_test2_show_cm = (Button) findViewById(R.id.btn_test2_show_cm);
// 设置创建上下文菜单的监听
btn_test2_show_cm.setOnCreateContextMenuListener(this);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
// 添加菜单项
menu.add(0, 1, 0, "添加");
menu.add(0, 4, 0, "删除");
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 1:
Toast.makeText(this, "添加", 0).show();
break;
case 4:
Toast.makeText(this, "删除", 0).show();
break;
default:
break;
}
return super.onContextItemSelected(item);
}
// 用来显示optionmenu的方法: 向menu中添加Item
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// 纯编码方式
menu.add(0, 2, 0, "添加");
menu.add(0, 3, 0, "删除");
return super.onCreateOptionsMenu(menu);
}
/*
* @Override public boolean onCreateOptionsMenu(Menu menu) {
*
* // 菜单文件方式 //1. 得到菜单加载器对象 MenuInflater menuInflater = getMenuInflater();
* //2. 加载菜单文件 menuInflater.inflate(R.menu.option_menu, menu); return
* super.onCreateOptionsMenu(menu); }
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// case R.id.add:
case 2:
Toast.makeText(this, "添加", 0).show();
break;
// case R.id.delete:
case 3:
Toast.makeText(this, "删除", 0).show();
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
}
第十二节 12_常用UI组件_进度条准备
进度条Component
<ProgressBar //默认为圆形进度条
android:id="@+id/pb_test3_loading1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ProgressBar
android:id="@+id/pb_test3_loading2"
style=“?android:attr/progressBarStyleHorizontal“ //水平进度条
android:layout_width="match_parent“
android:layout_height="wrap_content"
android:progress=“2“ //当前进度, 默认为0
android:max=“10”/> // 最大进度, 默认为100
• ProgressBar
void setProgress(int Progress) : 设置当前进度
int getProgress() : 得到当前进度
void setMax(int max) : 设置最大进度
int getMax() : 设置或得到最大进度
• View
void setVisibility(intvisibility) : 设置视图的可见性
View. VISIBLE : 标识可见
View. INVISIBLE : 标识不可见, 但占屏幕空间
View.GONE : 标识不可见, 也不占屏幕空间
13_常用UI组件_进度条
SeekBar : 可手动滑动的进度条
<SeekBar
android:id="@+id/sb_test3_prgress"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
SeekBar:
setOnSeekBarChangeListener(OnSeekBarChangeListener l) : 设置改变的监听
OnSeekBarChangeListener:
onProgressChanged(SeekBar seekBar, intprogress, boolean fromUser) : 进度改变
onStartTrackingTouch(SeekBar seekBar): 按下滑杆
onStopTrackingTouch(SeekBar seekBar) :从滑杆离开
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/ll_progress_loading"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center">
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="正在加载中..."/>
</LinearLayout>
<ProgressBar
android:id="@+id/pb_progress_loading"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:progress="30"/>
<SeekBar
android:id="@+id/sb_progress_loading"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="1.滑动下面的滑杆后,上面的进度条会同步\n2.滑动到最大值时, 最上面的进度条消失"/>
</LinearLayout>
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
/**
* 测试进度条
*/
public class ProgressActivity extends Activity {
private LinearLayout ll_progress_loading;
private ProgressBar pb_progress_loading;
private SeekBar sb_progress_loading;
private OnSeekBarChangeListener onSeekBarChangeListener = new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {//离开滑杆
Log.e("TAG", "离开滑杆");
//1. 得到seekBar的进度
int progress = sb_progress_loading.getProgress();
//2. 设置为ProgressBar的进度
pb_progress_loading.setProgress(progress);
//3. 判断是否达到最大值
if(progress==sb_progress_loading.getMax()) {
//如果达到了, 设置ll_progress_loading不可见
//ll_progress_loading.setVisibility(View.INVISIBLE); //不可见, 但占用空间
ll_progress_loading.setVisibility(View.GONE);////不可见, 且不占用空间
} else {
//如果没有达到 设置ll_progress_loading显示
ll_progress_loading.setVisibility(View.VISIBLE);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {//按下滑杆
Log.e("TAG", "按下滑杆");
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {//滑杆移动
Log.e("TAG", "滑杆移动");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_progress);
ll_progress_loading = (LinearLayout) findViewById(R.id.ll_progress_loading);
pb_progress_loading = (ProgressBar) findViewById(R.id.pb_progress_loading);
sb_progress_loading = (SeekBar) findViewById(R.id.sb_progress_loading);
//给seekbar设置监听
sb_progress_loading.setOnSeekBarChangeListener(onSeekBarChangeListener );
}
}
测试AlertDialog
测试ProgressDialog
测试DatePickDialog TimePickDialog
第十五节 15_常用UI组件_带单选列表的AlertDialog
AlertDialog :
show() : 显示警告框
没有公开的构造方法, 只能通过其内部类Builder来创建
AlertDialog.Builder :
create() : 创建AlertDialog对象
show() : 创建AlertDialog对象, 同时将其显示出来
setTitle(CharSequence title) : 设置标题
setMessage(CharSequence message) : 设置内容
setPositiveButton(String text, OnClickListener listener) : 设置正面按钮
setNegativeButton(String text, OnClickListener listener): 设置负面按钮
dismiss() : 移除dialog
setSingleChoiceItems(….)设置单选项列表
第十六节 16_常用UI组件_自定义布局的AlertDialog
DialogBuilder :
setView(View view) : 设置Dialog中的视图
View :
View inflate(Context context, int resource, ViewGroup root) : 动态加载布局得到View
第十七节 17_常用UI组件_圆形进度ProgressDialog
ProgressDialog :
static show(Context context, CharSequence title,CharSequencemessage) : 显示dialog
ProgressDialog(Context context) : 构造方法
setProgressStyle(int style) 设置样式
ProgressDialog.STYLE_HORIZONTAL :水平进度条样式
第十八节 18_常用UI组件_水平进度的ProgressDialog
ProgressDialog.STYLE_HORIZONTAL :水平进度条样式
启动分线程(复习)
方式一:
new Thread(){
public void run(){
//下面的代码在分线程执行
}
}.start();
方式二:
new Thread(new Runnable(){
public void run(){
//下面的代码在分线程执行
}
}).start();
第十九节 19_常用UI组件_日期时间Dialog
public DatePickerDialog(Contextcontext,
OnDateSetListener callBack, //点击确定的回调监听
int year, //显示年份
int monthOfYear, // 显示月分
int dayOfMonth) // 显示日
TimeDialog : 时间Dialog
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- AlertDialog -->
<Button
android:id="@+id/btn_test4_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="showAD"
android:text="显示一般AlertDialog" />
<Button
android:id="@+id/btn_test4_ld"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="showLD"
android:text="显示单选列表AlertDialog" />
<Button
android:id="@+id/btn_test4_custom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="showCD"
android:text="显示自定义AlertDialog" />
<!-- ProgressDialog -->
<Button
android:id="@+id/btn_test4_pd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="showPD"
android:text="显示圆形进度ProgressDialog"
android:layout_marginTop="20dp"/>
<Button
android:id="@+id/btn_test4_pd2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="showPD2"
android:text="显示水平进度ProgressDialog" />
<!-- DatePickerDialog与TimePickerDialog -->
<Button
android:id="@+id/btn_test4_dd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="showDateAD"
android:text="显示DatePickerDialog"
android:layout_marginTop="20dp"/>
<Button
android:id="@+id/btn_test4_td"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="showTimeAD"
android:text="显示TimePickerDialog" />
</LinearLayout>
public class DialogActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dialog);
}
/**
* 显示一般AlertDialog
* @param v
*/
public void showAD(View v) {
//new AlertDialog.Builder(this).create().show();
new AlertDialog.Builder(this)
.setTitle("删除数据")//设置标题
.setMessage("你确定删除数据吗")
.setPositiveButton("删除", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this, "删除数据", 0).show();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this, "取消删除数据", 0).show();
}
})
.show(); //方法链调用
}
/**
* 显示单选列表AlertDialog
* @param v
*/
public void showLD(View v) {
final String[] items = {"红", "蓝", "绿", "灰"}; //final的变量在方法执行完后还存在
new AlertDialog.Builder(this)
.setTitle("指定背景颜色")
.setSingleChoiceItems(items, 2, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {//which就是选中的position
//提示颜色
Toast.makeText(DialogActivity.this, items[which], 0).show();
//移除dilaog
dialog.dismiss();
}
})
.show();
}
/**
* 显示自定义AlertDialog
* @param v
*/
public void showCD(View v) {
//动态加载布局文件, 得到对应的View对象
View view = View.inflate(this, R.layout.dialog_view, null);
//问题1: view的真实类型?是布局文件根标签的类型, 包含了子View对象
//问题2: 如何得到一个独立View的子View? view.findViewById(id)
//findViewById(id)是在setContentView()中的View中找
final EditText nameET = (EditText) view.findViewById(R.id.et_dialog_name);
final EditText pwdET = (EditText) view.findViewById(R.id.et_dialog_pwd);
new AlertDialog.Builder(this)
.setView(view)
.setNegativeButton("取消", null)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//读取用户名和密码
String username = nameET.getText().toString();
String pwd = pwdET.getText().toString();
//提示
Toast.makeText(DialogActivity.this, username+" : "+pwd, 0).show();
}
})
.show();
}
/**
* 显示圆形进度ProgressDialog
* @param v
* @throws InterruptedException
*/
public void showPD(View v){//回调方法: 主线程执行
final ProgressDialog dialog = ProgressDialog.show(this, "数据加载", "数据加载中...");
//模拟做一个长时间的工作
//长时间的工作不能在主线程做, 得启动分线程完成
new Thread(){
public void run() {//分线程
for(int i=0;i<20;i++) {
//休息一会
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//移除dialog
dialog.dismiss();//方法在分线程执行, 但内部使用Handler实现主线程移除dialog
//不能在分线程直接更新UI
//显示toast
//Toast.makeText(DialogActivity.this, "加载完成了!!!", 0).show();
runOnUiThread(new Runnable() {
@Override
public void run() {//在主线程执行
Toast.makeText(DialogActivity.this, "加载完成了!!!", 0).show();
}
});
//runOnUiThread()在分线程执行
}
}.start();
}
/**
* 显示水平进度ProgressDialog
* @param v
*/
public void showPD2(View v) {
//1. 创建dialog对象
final ProgressDialog pd = new ProgressDialog(this);
//2. 设置样式
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//3. 显示
pd.show();
//4. 启动分线程, 加载数据, 并显示进度, 当加载完成移除dilaog
new Thread(new Runnable() {
@Override
public void run() {
int count = 20;
//设置最大进度
pd.setMax(count);
for(int i=0;i<count;i++) {
//休息一会
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
pd.setProgress(pd.getProgress()+1);
}
//移除dialog
pd.dismiss();
}
}).start();
}
public void showDateAD(View v) {
//创建日历对象
Calendar calendar = Calendar.getInstance();
//得到当前的年月日
int year = calendar.get(Calendar.YEAR);//得到年份
int monthOfYear = calendar.get(Calendar.MONTH);//月
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);//得到日
Log.e("TAG", year+"-"+monthOfYear+"-"+dayOfMonth);
new DatePickerDialog(this, new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
Log.e("TAG", year+"--"+(monthOfYear+1)+"--"+dayOfMonth);
}
}, year, monthOfYear, dayOfMonth).show();
}
public void showTimeAD(View v) {
Calendar c = Calendar.getInstance();
int hourOfDay = c.get(Calendar.HOUR_OF_DAY); //得到小时
int minute = c.get(Calendar.MINUTE); //得到分钟
Log.e("TAG", hourOfDay+":"+minute);
new TimePickerDialog(this, new OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
Log.e("TAG", hourOfDay+"::"+minute);
}
}, hourOfDay, minute, true).show();
}
}