if(TextUtils.isEmpty(thirdNum.getText().toString())){ thirdNum.setError("此处不能为空"); return; }
达内安卓培训20天,详细总结。 |
安卓达内培训
day01
环境的搭建
AS安装
JDK安装
雷电模拟器安装
day02
拖拽登录界面
单位
dp
sp(主要用于字体)
线性布局
方向
垂直
水平
权重(宽度要设置为0dp)
相对布局
一定要起ID
默认左上角开始布局(0,0位置)
起名规范
tv_username
对齐
基线对齐
右对齐
吐司(要秀出来)
this
显示内容
时长
事件监听
1.布局文件中写onClick属性
2.直接给按钮添加监听器
声明控件对象
实现监听器接口View.onClickListener
给按钮设置监听对象
设置点击具体事件
3.匿名内部类(最常用)
注意this
项目
1.登录界面
2.线性布局
3.相对布局
4.事件监听机制
5.淘宝支付
6.三个数求最大值
非空验证
if(TextUtils.isEmpty(thirdNum.getText().toString())){ thirdNum.setError("此处不能为空"); return; }
7.手电筒
gravity与layout_grivaty的区别
1.gravity用来设置控件中的元素相对于控件的位置,如设置一个Button控件gravity属性,则是设置Button中文字相对于Button的位置
2.layout_grivaty是用来设置控件本身相对于其容器的位置
day03
项目
1.界面跳转
2.单选框,淘宝支付
radioGroup组件的使用
千千静听顶部按钮
微信等底部按钮
radioGroup监听器
@Override public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) { switch (checkedId){ case R.id.rb_wx: System.out.print("id为"+R.id.rb_wx); text=rbWX.getText().toString(); break; case R.id.rb_zfb: text=rbZFB.getText().toString(); break; case R.id.rb_xyk: text=rbXYK.getText().toString(); break; case R.id.rb_hdfk: text=rbHDFK.getText().toString(); break; default: } }
页面跳转传纸条
发送纸条:
intent.putExtra("payment",text);
接收纸条
Intent intent=getIntent(); String text=intent.getStringExtra("payment");
3.仿微信底部菜单(制作选择器)
制作选择器(drawable文件夹中)
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:color="#090"></item> <item android:state_checked="false" android:color="#fff"></item> </selector>
被选中时
未被选中时
4.四种动画(制作动画文件,在anim文件夹)
淡入淡出(alpha)
<alpha android:repeatCount="2" android:fromAlpha="0" android:toAlpha="1" android:duration="1000"> </alpha>
1.创建anim文件夹(名字不能写错)
2.编写动画属性
起始透明度
结束透明度
持续时间
动画播放次数
3.写代码,实现Animation类
4.给图片设置动画
旋转动画(rotate)
<rotate android:fromDegrees="0" android:toDegrees="3600" android:duration="3000" android:pivotX="50%" android:pivotY="50%" > </rotate>
动画属性
起始角度
最后角度
旋转次数
播放时间
中心X,Y轴
缩放动画(scale)
<scale android:fromXScale="0" android:toXScale="100%" android:fromYScale="0" android:toYScale="100%" android:duration="1000" android:pivotY="50%" android:pivotX="50%"> </scale>
平移动画(translate)
<translate android:fromXDelta="0" android:toXDelta="50%" android:fromYDelta="0" android:toYDelta="300%" android:duration="1000"> </translate>
集合动画
同步执行
不同步执行(设置延迟)
android:startOffset="1000"
动画监听
imgWelcome=(ImageView)findViewById(R.id.welcome1); Animation anim= AnimationUtils.loadAnimation(this,R.anim.first_page); anim.setAnimationListener(new Animation.AnimationListener() { @Overridepublic void onAnimationStart(Animation animation) { } @Overridepublic void onAnimationEnd(Animation animation) { startActivity(new Intent(WelcomeActivity.this,MainActivity.class)); } @Overridepublic void onAnimationRepeat(Animation animation) { } }); imgWelcome.startAnimation(anim);
考试(不容乐观)
1.adb的全称以及作用
Android Debug Bridge
起到调试桥的作用,在手机和PC端架起一个桥梁,可以在电脑上对手机操作
2.四大核心组件应用场景和启动方式
Activity
Service
BroadcastReciver
ContentProvider
3.目前市场上安卓APP有几种开发方式,以及每种方式开发的优缺点
nativeApp
webApp
hyBridApp混编
4.列举五种安卓文件存储方式
5.xml解析方式
DOM解析
解释:DOM解析是把文档所有内容都加载进内存,解析成DOM树,有根节点(Element)、子孙节点,文本节点(Text),属性节点(Attr)。
SAX解析
解释:SAX解析是从上往下读一行解析一行,不能往回读。
6.编程题,简单listview使用
作业:给动画设置监听事件
day04 项目课
listview案例
材料(适配器把两者联合)
数据源
item布局
Adapter
ArrayAdapter
自带饺子皮
SimpleAdapter
BaseAdapter
抽象类,需要实现四个方法(主要是写1和4两个方法)
步骤(包饺子)
1.定义Listview控件
2.准备item布局文件(饺子皮)
3.准备数据源(饺子馅)
4.创建适配器类(爸爸妈妈)
5.item设置到listview中(放到锅里)
listview的优化
不优化
//拿到饺子皮 View itemView=View.inflate(MainActivity.this,R.layout.item_layout,null);//视图扩充器 Log.i("TAG","ItemView"+itemView); //拿到item布局上的控件 *********加上itemView. 坑 空指针错误 ImageView img=(ImageView) itemView.findViewById(R.id.img_item); TextView tv=(TextView) itemView.findViewById(R.id.tv_item); //把数据源设置到相对应的控件上 img.setImageResource(imgs[i]); tv.setText(strs[i]); //返回包好的饺子 return itemView;
view(饺子皮)复用
//判断复用的item是否为空 if(convertView==null){ //创建复用item布局 convertView =View.inflate(MainActivity.this,R.layout.item_layout,null); } //如果不为空,直接拿来用 //拿到饺子皮上面的两个控件 ImageView img= (ImageView) convertView.findViewById(R.id.img_item); TextView tv= (TextView) convertView.findViewById(R.id.tv_item); Log.v("TAG","item"+convertView); img.setImageResource(imgs[i]); tv.setText(strs[i]); return convertView;
使用viewholder
//第二次优化,优化的item是布局上的控件 ViewHolder holder=null; if(convertView==null){ //假设为空,创建复用的item布局 convertView=View.inflate(MainActivity.this,R.layout.item_layout,null); holder=new ViewHolder();//创建对象持有者//创建控件对象 holder.img=(ImageView) convertView.findViewById(R.id.img_item); holder.tv=(TextView) convertView.findViewById(R.id.tv_item); //给带有holder对象的item布局添加一个标记 convertView.setTag(holder); }else{ //如果有复用的饺子皮,直接拿来用 holder=(ViewHolder) convertView.getTag(); } //设置数据源到相应的控件上 holder.tv.setText(strs[i]); holder.img.setImageResource(imgs[i]); return convertView; //对象持有者(持有item布局上的控件) class ViewHolder{ private ImageView img; private TextView tv; }
看国旗猜国家项目
1.主界面布局
styles.xml设置按钮样式
在布局文件中引用的时候直接写 style="" ,不要写成android:style=""
按钮选择器(drawable文件夹)
visibility属性的三个值
visible
invisible
界面保留了view控件所占有的空间
gone
界面不保留view控件所占有的空间。
.9格式图片的绘制,拉伸左右上下四条小黑线都对齐
上 左两条线控制拉伸的位置
下 右两条线控制内容显示的位置
2.主界面事件逻辑
开始游戏
帮助
day05项目课
晨讲
listview
安卓开发的几种方式
1.游戏界面布局
GridView(包饺子)
表格布局
<TableLayout android:id="@+id/td" android:layout_width="match_parent" android:layout_height="match_parent"> <!--第一行--> <TableRow> <RelativeLayout android:id="@+id/rl_one_one" android:background="#30f0" android:layout_width="0dp" android:layout_weight="1" android:layout_height="100dp"> </RelativeLayout> <RelativeLayout android:id="@+id/rl_one_two" android:layout_marginLeft="5dp" android:background="#30f0" android:layout_width="0dp" android:layout_weight="1" android:layout_height="100dp"> </RelativeLayout> <RelativeLayout android:id="@+id/rl_one_three" android:layout_marginLeft="5dp" android:background="#30f0" android:layout_width="0dp" android:layout_weight="1" android:layout_height="100dp"> </RelativeLayout> </TableRow> <!--第二行--> <TableRow android:layout_marginTop="5dp"> <RelativeLayout android:id="@+id/rl_two_one" android:background="#30f0" android:layout_width="0dp" android:layout_weight="1" android:layout_height="100dp"> </RelativeLayout> <RelativeLayout android:id="@+id/rl_two_two" android:layout_marginLeft="5dp" android:background="#30f0" android:layout_width="0dp" android:layout_weight="1" android:layout_height="100dp"> </RelativeLayout> <RelativeLayout android:id="@+id/rl_two_three" android:layout_marginLeft="5dp" android:background="#30f0" android:layout_width="0dp" android:layout_weight="1" android:layout_height="100dp"> </RelativeLayout> </TableRow> <!--第三行--> <TableRow android:layout_marginTop="5dp"> <RelativeLayout android:id="@+id/rl_three_one" android:background="#30f0" android:layout_width="0dp" android:layout_weight="1" android:layout_height="100dp"> </RelativeLayout> <RelativeLayout android:id="@+id/rl_three_two" android:layout_marginLeft="5dp" android:background="#30f0" android:layout_width="0dp" android:layout_weight="1" android:layout_height="100dp"> </RelativeLayout> <RelativeLayout android:id="@+id/rl_three_three" android:layout_marginLeft="5dp" android:background="#30f0" android:layout_width="0dp" android:layout_weight="1" android:layout_height="100dp"> </RelativeLayout> </TableRow> </TableLayout>
听歌软件
day06-07
ViewPage(包饺子的过程)
public class MyAdapter extends PagerAdapter { int[] imgs; Context context; public MyAdapter(int[] imgs, Context context) { this.imgs=imgs; this.context=context; } @Override public int getCount() { return imgs.length; } //当前显示的图片是否来自三张图片中的某一张 @Override public boolean isViewFromObject(View view, Object object) { return view==object; } //获取某一项, 包某一个饺子 @Override public Object instantiateItem(ViewGroup container, int position) { ImageView img=new ImageView(context); img.setScaleType(ImageView.ScaleType.FIT_XY); img.setImageResource(imgs[position]); container.addView(img); return img; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View)object); } }
1.放viewpager控件
<android.support.v4.view.ViewPager android:id="@+id/vp" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v4.view.ViewPager>
2.准备饺子皮(直接在java代码创建的布局)
3.准备饺子馅
//数据源 int[] imgs={ R.mipmap.png_8, R.mipmap.png_9, R.mipmap.png_10 };
4.准备适配器
//Adapter 抽象类,需要继承抽象方法 class MyPageAdapter extends PagerAdapter{ //获取页数 @Override public int getCount() { return imgs.length; } //当前显示的界面中的元素是否是所有 元素中的某一个,返回值为true可以实现 @Override public boolean isViewFromObject(View view, Object object) { return view == object; } //获取某一个item项 包某一个饺子 @Override public Object instantiateItem(ViewGroup container, int position) { //显示图片的控件 ImageView img=new ImageView(MainActivity.this); //控制控件大小 img.setScaleType(ImageView.ScaleType.FIT_XY); //设置数据源显示到控件上 img.setImageResource(imgs[position]); //把控件设置到容器中去 container.addView(img); Log.v("TAG",position+"<----初始化"); return img; } //销毁滑出屏幕的 并且和当前屏幕中的 不相邻 @Override public void destroyItem(ViewGroup container, int position, Object object) { Log.v("TAG",position+"<----销毁"); container.removeView((View)object); } }
继承PagerAdapter,实现四个抽象方法
1.getCount 获取个数
2.isViewFromObject 判断当前显示的元素是否在所有元素中的某一个,返回true可以显示
3.instantiateItem 包某一个饺子
4.destroyItem 销毁某(页面)饺子 销毁的是和当前显示不相邻的页面
5.包饺子
vp=(ViewPager)findViewById(R.id.vp); MyPageAdapter adapter=new MyPageAdapter(); vp.setAdapter(adapter);
Fragment和ViewPage
1.放viewpager控件
<android.support.v4.view.ViewPager android:id="@+id/vp" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v4.view.ViewPager>
2.创建Fragment
3.在fragment中布局
4.准备适配器
//Adapter适配器 class MyPagerAdapter extends FragmentPagerAdapter{ public MyPagerAdapter(FragmentManager fm) { super(fm); } //获取某一页 @Override public Fragment getItem(int position) { Fragment fm=null; switch (position){ case 0: fm=new MyMusicFragment(); break; case 1: fm=new TaoGeFragment(); break; case 2: fm=new SearchFragment(); break; case 3: fm=new RecommendFragment(); break; } return fm; } //获取item个数 @Override public int getCount() { return 4; } }
实现两个方法和构造器:
构造方法 , 注意:构造方法中有个FragmentManager参数,要获取这个参数,必须把继承的Activity改成FragmentActivity
getItem
getCount
5.包饺子
ViewPager和RadioGroup的同步
1.给ViewPager设置监听器
private void addListener() { vpMain.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { switch (position){ case 0: rgMain.check(R.id.rb_main); break; case 1: rgMain.check(R.id.rb_taoge); break; case 2: rgMain.check(R.id.rb_search); break; case 3: rgMain.check(R.id.rb_recommend); break; } } @Override public void onPageScrollStateChanged(int state) { } }); }
设置监听器两种方式
set
add(此处用add)
2.给RadioGroup设置监听器
rgMain.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) { switch (checkedId){ case R.id.rb_main: vpMain.setCurrentItem(0); break; case R.id.rb_taoge: vpMain.setCurrentItem(1); break; case R.id.rb_search: vpMain.setCurrentItem(2); break; case R.id.rb_recommend: vpMain.setCurrentItem(3); break; } } });
Activity生命周期
千千静听项目
我的音乐界面
根据手机界面设置宽高
获取屏幕宽度
//获取手机屏幕的宽度 getActivity()相当于MainActivity.this WindowManager wm=getActivity().getWindowManager(); int width=wm.getDefaultDisplay().getWidth()-10;
给控件设置宽度
ViewGroup.LayoutParams lpOneOne=rlOneOne.getLayoutParams(); lpOneOne.width=width/3; lpOneOne.height=width/3;
day07
上午放假
下午团建活动看电影
答辩
成员介绍
实训项目展示
知识重点总结
实训感想总结
第一次测验
1.adb的全称以及作用
Android Debug Bridge
起到调试桥的作用,在手机和PC端架起一个桥梁,可以在电脑上对手机操作
2.四大核心组件应用场景和启动方式
Activity
Service
BroadcastReciver
ContentProvider
3.目前市场上安卓APP有几种开发方式,以及每种方式开发的优缺点
nativeApp
webApp
hyBridApp混编
4.列举五种安卓文件存储方式
5.xml解析方式
DOM解析
解释:DOM解析是把文档所有内容都加载进内存,解析成DOM树,有根节点(Element)、子孙节点,文本节点(Text),属性节点(Attr)。
SAX解析
解释:SAX解析是从上往下读一行解析一行,不能往回读。
6.编程题,简单listview使用
第二次测验
1.四个核心组件
2.抽象类和接口的区别
抽象类可以有构造方法,接口不能
抽象类中可以有普通成员变量,接口中没有普通成员变量
抽象类中的抽象方法的访问类型可以是public,或者别的,但是接口中的方法访问类型只能是public
一个类可以实现多个接口,但只能继承一个抽象类
抽象类中可以包含静态方法,接口中不能包含静态方法
3.Activity的四种启动方式
standard
特点
Activity的默认启动方式
每启动一个Activity就会在栈顶创建一个新的实例
缺点
当Activity已经位于栈顶时,而再次启动Activity时还需要在创建一个新的实例,不能直接复用
singleTop
特点
该模式会判断要启动的Activity实例是否位于栈顶,如果位于栈顶直接复用,否则创建新的实例
缺点
如果Activity并未处于栈顶位置,则可能还会创建多个实例
singleTask
特点
使Activity在整个应用程序中只有一个实例。每次启动Activity时系统首先检查栈中是否存在当前Activity实例,如果存在则直接复用,并把当前Activity之上所有实例全部出栈。例如:浏览器主界面
singleInstance
特点
该模式的Activity会启动一个新的任务栈来管理Activity实例,并且该实例在整个系统中只有一个。无论从那个任务栈中 启动该Activity,都会是该Activity所在的任务栈转移到前台,从而使Activity显示。主要作用是为了在不同程序中共享一个Activity实例。
4.常见的异常
java.lang.NullPointerException 空指针引用异常
java.lang.ClassNotFoundException 指定的类不存在
java.lang.ArithmeticException 算术运算异常
java.lang.ArrayIndexOutOfBoundsException 数组下标越界异常
java.lang.IllegalArgumentException 方法的参数错误
java.lang.NumberFormatException 字符串装转换异常
SQLException 操作数据库异常
IOException 输入输出异常
SocketException 通信异常
5.安卓几种存储方式
day08
存储
内部存储(data/data/项目名)
用户登录记住密码demo
public void onClick(View v) { if(cb.isChecked()){ //拿到用户输入的 用户名和密码 String etUser=etUername.getText().toString(); String etPwd=etPassword.getText().toString(); //获取内部存储空间路径 File file=new File("data/data/cn.tedu.nbcc/info.txt"); //获取输出流 写入用户名和密码 FileOutputStream fos=null; try { fos=new FileOutputStream(file); //开始写入 fos.write((etUser+"##"+etPwd).getBytes()); } catch (IOException e) { e.printStackTrace(); }finally { if(fos!=null){ try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } Toast.makeText(MainActivity.this,"恭喜你写入成功",Toast.LENGTH_SHORT).show(); } }
输入流写入文件
导出到电脑桌面
登录时自动显示记住的用户名和密码
//从内部存储空间读取空间 public void readContent(){ File file=new File("data/data/cn.tedu.nbcc/info.txt"); FileInputStream fis=null; //缓冲流 BufferedReader br=null; try { fis=new FileInputStream(file); br=new BufferedReader(new InputStreamReader(fis)); String text=br.readLine(); String[] strs=text.split("##"); etUername.setText(strs[0]); etPassword.setText(strs[1]); } catch (IOException e) { e.printStackTrace(); }finally { if(br!=null){ try { br.close(); } catch (IOException e) { e.printStackTrace(); } } if(fis!=null){ try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } }
外部存储
sharedPrefence偏好文件设置
设置
if(cb.isChecked()){ String etUser=etUername.getText().toString(); String etPwd=etPassword.getText().toString(); SharedPreferences spf=getSharedPreferences("info",MODE_APPEND); //获取编辑器 SharedPreferences.Editor editor=spf.edit(); //存储用户名和密码 editor.putString("user",etUser); editor.putString("pwd",etPwd); editor.commit(); Toast.makeText(this,"success",Toast.LENGTH_SHORT).show(); }
读取
public void readContent(){ SharedPreferences spf=getSharedPreferences("info",MODE_APPEND); String strUser=spf.getString("user",""); String strPwd=spf.getString("pwd",""); etUername.setText(strUser); etPassword.setText(strPwd); }
MediaPlayer
获取路径
private File dir=null; dir= Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
实例化MediaPlatyer
播放步骤
重置播放工具
设置播放工具
准备播放
开始播放
销毁MediaPlayer实例
@Override protected void onDestroy() { super.onDestroy(); if(player!=null){ player.stop(); player.release(); player=null; } }
在Activity的onDestory中
给读取SD卡权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
Service
启动方式(两个特点)
启动之后,service和activity相互独立
有黏性 ,就算意外终止还会自动创建
设置非黏性return START_NOT_STICKY;
自杀stopSelf(startId);
绑定方式
步骤
Activity中写bindService(service,conn,flag)
service 绑定意图 制定activity和哪个service连接
conn 绑定后建立连接的状态
flag 绑定后建立连接的方式
创建信使对象
特点
activity和Service一起创建,一起销毁
两种方式的Service都必须注册
如何把Adapter在外部类写?
inflate的第一个参数
构造方法传递两个参数(数据源和上下文)
day09-12
service绑定方式(在day08笔记中)
广播接收器
步骤
发送广播
//发送一条广播(携带当前被点中歌曲的下标) Intent intent=new Intent("currentMusicIndex"); //携带数据 intent.putExtra("position",position); sendBroadcast(intent);
广播接收器
//广播接收器,专门用来接收Activity发来的广播 class MyActivityReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { //对过滤到的广播进行处理 String action=intent.getAction(); //拿到所有过滤到的广播 if("currentMusicIndex".equals(action)){ //拿到广播里面携带的数据 currentMusicIndex=intent.getIntExtra("position",0); //播放当前下标的这一首 play(); } } }
继承
拿到所有广播
动态注册
private BroadcastReceiver receiver;//注册的广播接收器对象 /对广播接收器进行注册 receiver=new MyActivityReceiver(); IntentFilter filter=new IntentFilter(); //对广播接收器进行过滤 filter.addAction("currentMusicIndex"); registerReceiver(receiver,filter);
解除广播
@Override public void onDestroy() { super.onDestroy(); //解除注册 unregisterReceiver(receiver); }
onDestory
需要注册
静态注册
动态注册
千千静听
实现了广播传递当前下标来 播放点击的音乐
day10
侧滑菜单
day11
解决了返回再进入歌曲时播放按钮、时长、歌曲名称不对应的问题
用绑定方式的Service解决的
ContentProvider
App内置网页
通知栏显示消息
day12
第二次测验
1.四个核心组件
2.抽象类和接口的区别
抽象类可以有构造方法,接口不能
抽象类中可以有普通成员变量,接口中没有普通成员变量
抽象类中的抽象方法的访问类型可以是public,或者别的,但是接口中的方法访问类型只能是public
一个类可以实现多个接口,但只能继承一个抽象类
抽象类中可以包含静态方法,接口中不能包含静态方法
3.Activity的四种启动方式
standard
特点
Activity的默认启动方式
每启动一个Activity就会在栈顶创建一个新的实例
缺点
当Activity已经位于栈顶时,而再次启动Activity时还需要在创建一个新的实例,不能直接复用
singleTop
特点
该模式会判断要启动的Activity实例是否位于栈顶,如果位于栈顶直接复用,否则创建新的实例
缺点
如果Activity并未处于栈顶位置,则可能还会创建多个实例
singleTask
特点
使Activity在整个应用程序中只有一个实例。每次启动Activity时系统首先检查栈中是否存在当前Activity实例,如果存在则直接复用,并把当前Activity之上所有实例全部出栈。例如:浏览器主界面
singleInstance
特点
该模式的Activity会启动一个新的任务栈来管理Activity实例,并且该实例在整个系统中只有一个。无论从那个任务栈中 启动该Activity,都会是该Activity所在的任务栈转移到前台,从而使Activity显示。主要作用是为了在不同程序中共享一个Activity实例。
4.常见的异常
java.lang.NullPointerException 空指针引用异常
java.lang.ClassNotFoundException 指定的类不存在
java.lang.ArithmeticException 算术运算异常
java.lang.ArrayIndexOutOfBoundsException 数组下标越界异常
java.lang.IllegalArgumentException 方法的参数错误
java.lang.NumberFormatException 字符串装转换异常
SQLException 操作数据库异常
IOException 输入输出异常
SocketException 通信异常
5.安卓几种存储方式
day13
AlertDialog
new AlertDialog.Builder(this) .setTitle("请选择飞机") .setSingleChoiceItems(strCities,-1, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { btnStartCity.setText(strCities[which]); dialog.cancel(); } }).create().show();
DatePickerDialog
//当前系统时间的年份 月份 日期 Calendar calendar=Calendar.getInstance();//获取日历对象 int year=calendar.get(Calendar.YEAR); int month=calendar.get(Calendar.MONTH); int dayOfMonth=calendar.get(Calendar.DAY_OF_MONTH); new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { btnEndDate.setText(year+"-"+(month+1)+"-"+dayOfMonth); } }, year, month, dayOfMonth).show();
数据库简单操作