android 百战经典 - v1.0


前言前言 张亚运,男,江苏徐州人。现南京邮电大学研究生三年级学生。爱技术,研究生期间专注 Android 学习及应用开 发,现已上架三款 App,有两款在开发中。爱分享,在 CSDN 发表博文四百余篇,获CSDN认证专家、极客学院Wik i专栏作家,并在github 分享多款源码。假如你也是同道中人,可以和我联系:291214603@qq.com。 写下本系列文章的初衷是为了帮助更多 Android 的初学者可以尽快的进入角色,通过编写一些简单可行的代 码,可以大大增加自己的兴趣和信心,同时也会加深对Android的学习和理解。做技术,就是要动手、要实战。文 章中提供了较为详细的源码,大家可以写看一遍,理解后自己动手,这样可以快速入门 Android 开发。希望大家 都能通过本系列文章得到提升。 为了更好的理解和学习本书,我希望你具有如下知识: • Java SE :Android开发语言是Java,为了更好地理解和开发Android,你应该具有Java基础知识,对一些常用 的类和方法应该熟悉。 • 了解Android开发基础知识:本书不会按部就班的介绍Android基础和相关控件知识,一上来就是通过各种小 例子来讲解,没有一点Android基础的同学看起来会摸不着头脑,你需要花一点时间了解Android基本控件和 部分组件知识。 可以通过扫描微信二维码跟作者面对面沟通 目录目录 前言前言. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 第 1 章第 1 章 前言前言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 第 2 章第 2 章 百战经典第一战—听话的TextView百战经典第一战—听话的TextView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 第 3 章第 3 章 百战经典第二战-好玩的Spinner控件百战经典第二战-好玩的Spinner控件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1212 第 4 章第 4 章 百战经典第三战-实现画图板百战经典第三战-实现画图板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2020 第 5 章第 5 章 百战经典第四战-玩转ListView百战经典第四战-玩转ListView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2626 第 6 章第 6 章 百战经典第五战-各种对话框Dialog精彩荟萃百战经典第五战-各种对话框Dialog精彩荟萃 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3535 第 7 章第 7 章 百战经典第六战-Activity启动模式小样百战经典第六战-Activity启动模式小样 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5050 第 8 章第 8 章 百战经典第七战-显示倒计时的Button按钮百战经典第七战-显示倒计时的Button按钮 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6161 第 9 章第 9 章 百战经典第八战-BitmapFactory.Options对资源图片进行缩放百战经典第八战-BitmapFactory.Options对资源图片进行缩放 . . . . . . . . . . . . . . 6565 第 10 章第 10 章 百战经典第九战-ViewFlipper实现幻灯效果百战经典第九战-ViewFlipper实现幻灯效果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6969 第 11 章第 11 章 百战经典第十战-LayoutAnimation布局动画效果百战经典第十战-LayoutAnimation布局动画效果 . . . . . . . . . . . . . . . . . . . . . . . . . . 7575 第 12 章第 12 章 百战经典第十一战-GridView动态添加Item百战经典第十一战-GridView动态添加Item . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7979 第 13 章第 13 章 百战经典第十二战-GridView动态删除Item百战经典第十二战-GridView动态删除Item . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8484 第 14 章第 14 章 百战经典第十三战-网络交互,基于Baas实现用户注册功能百战经典第十三战-网络交互,基于Baas实现用户注册功能 . . . . . . . . . . . . . . . . . . 9191 第 15 章第 15 章 百战经典第十四战-网络交互,基于Baas用户表查询功能实现百战经典第十四战-网络交互,基于Baas用户表查询功能实现 . . . . . . . . . . . . . . . . 9898 第 16 章第 16 章 百战经典第十五-窃听风云之短信监听百战经典第十五-窃听风云之短信监听 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105105 第 17 章第 17 章 百战经典第十六战-图片或头像设置功能百战经典第十六战-图片或头像设置功能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110110 第 18 章第 18 章 百战经典第十七战-基于加速度传感器的摇一摇功能实例百战经典第十七战-基于加速度传感器的摇一摇功能实例 . . . . . . . . . . . . . . . . . . 115115 第 19 章第 19 章 百战经典第十八战-自定义控件实现一键清空输入框百战经典第十八战-自定义控件实现一键清空输入框 . . . . . . . . . . . . . . . . . . . . . . 118118 第 20 章第 20 章 百战经典第十九战-短信监听实现验证码自动填入百战经典第十九战-短信监听实现验证码自动填入 . . . . . . . . . . . . . . . . . . . . . . . . 124124 一、获取短信全部内容 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 二、截取验证码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 第 21 章第 21 章 百战经典第二十战-ListView中点击button跳转到拨号界面实例百战经典第二十战-ListView中点击button跳转到拨号界面实例 . . . . . . . . . . . . 134134 11 前言前言 研究Android也有两年多的时间,研究之余喜欢写一些博客,一方面是对自己学习的总结,另一方面也是本着开发 者最至高的分享精神。无心插柳柳成荫,在CSDN受到了很多人的关注,得到了很多肯定,第一次感觉到自己做的 事情是这么有意义。一年前,就收到了写书的邀请,由于还没有毕业,学业任务也一直比较繁重,写书的事情就 一推再推。 自己本身也不算什么大牛,只能算Android开发学习中的一个践行者,把自己在学习和工作中的一些经验写出 来,有兴趣的读者读一读,感觉有点用,我就心满意足了。要问我为什么选择Android开发,我认为Android开发 是十分有趣的,一个个小实例,随便写一写就可以在手机上跑起来,本身不就是十分神奇的一件事情吗? 本书通过鲜活有趣的实例,让你在玩乐中慢慢培养对Android开发的浓厚兴趣。伟大的科学家爱因斯坦说过“兴趣 是最好的老师”,当你对一项技术产生兴趣的时候,你所要做的就是和它游戏,掌握它只是顺带的事情。本书第 一卷讲解了二十个生动的小例子,读者可以通过实践让它们在自己的手机上跑起来。下面就跟着我一起愉快地进 入Android开发的游戏世界吧。 第 1 章 前言 | 6 22 百战经典第一战—听话的TextView百战经典第一战—听话的TextView TextView作为Android开发中最最常用的控件,是我们第一个要解决的敌人。 TextView的继承结构如下,可以看出TextView继承自View。 java.lang.Object ? android.view.View ? android.widget.TextView 下面通过代码介绍一下TextView的基本使用,新建项目: 图片 2.1图片 2.1 这里写图片描述 默认什么都不做,运行项目: 第 2 章 百战经典第一战—听话的TextView | 8 图片 2.2图片 2.2 这里写图片描述 可以看出项目中已经有一个TextView了,TextView上的字符串是Hello World,体现了TextView控件的重要性, 下面在TextView做一些小交互,让TextView变得U意思。代码如下: package com.example.textviewdemo; //省略导入包 public class MainActivity extends Activity { TextView mTextView=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView=(TextView)findViewById(R.id.tv_first); mTextView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mTextView.setText((int)(Math.random()*9000+1000)+""); } }); } } 这里实现了TextView的单击监听,点击一次TextView产生一个随机的四位数,显示到TextView中,类似验证码的 效果。 运行项目: 图片 2.3图片 2.3 这里写图片描述 点击TextView,数字发生改变: 第 2 章 百战经典第一战—听话的TextView | 9 图片 2.4图片 2.4 这里写图片描述 当然可以添加一下颜色在里面,修改activity_main.xml布局文件,改变背景: 运行项目: 图片 2.5图片 2.5 这里写图片描述 也可以通过代码: mTextView.setTextColor(Color.GREEN); 设置字体的颜色。 还可以通过如下代码,实现点击时颜色随机改变: package com.example.textviewdemo; //省略导入包 public class MainActivity extends Activity { private TextView mTextView=null; private int color[]={Color.GREEN,Color.BLACK,Color.GRAY,Color.YELLOW,Color.RED}; 第 2 章 百战经典第一战—听话的TextView | 10 private int i=0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView=(TextView)findViewById(R.id.tv_first); mTextView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mTextView.setText((int)(Math.random()*9000+1000)+""); mTextView.setTextColor(color[new Random().nextInt(4)]); } }); } } 运行如下: 图片 2.6图片 2.6 这里写图片描述 TextView的属性和方法还有很多很多,篇幅限制,不能一一介绍,感兴趣的同学可以看一看官方API文档,挑选自 己感兴趣的属性和方法测试一下,加深学习印象。 第 2 章 百战经典第一战—听话的TextView | 11 33 百战经典第二战-好玩的Spinner控件百战经典第二战-好玩的Spinner控件 下拉列表框是一种常见的图形组件,与其他选择组件相比,可以有效的节省屏幕空间,在Android中可以使用 andr oid.widget.Spinner 类来实现。 下拉列表框中的列表项主要有以下两种配置方式。 方式一方式一、通过资源文件配置,例如定义一个 values\city_data.xml 的文件,在定义数据内容时需要使用 元素指定,定义内容如下: 北京 上海 广州 深圳 方式二方式二、通过 android.widget.ArrayAdapter 类读取资源文件或者指定具体的数据。 方式一实现方式一实现 定义main.xml文件定义main.xml文件 运行模拟器: 第 3 章 百战经典第二战-好玩的Spinner控件 | 13 图片 3.1图片 3.1 这里写图片描述 这时可以看到数据已经添加到Spinner中,我们发现这时的Spinner控件只是徒有其表,没有什么交互,下面实现 交互,让代码更有趣。改动main.xml文件,添加一个TextView用于信息提示,一个TextView用于选择信息的显 示。代码如下: 再次编辑 MainActivity.java ,添加监听: package org.yayun.demo; //省略导入包 public class MainActivity extends Activity { private Spinner spinner; private TextView textView; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 生命周期方法 super.setContentView(R.layout.main); // 设置要使用的布局管理器 spinner = (Spinner) findViewById(R.id.spinner); textView = (TextView) findViewById(R.id.text); spinner.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView parent, View view, int position, long id) { String[] cities = getResources().getStringArray( R.array.city_labels);//获取列表数据 textView.setText("您喜欢的城市是:" + cities[position]);//显示选择项 } public void onNothingSelected(AdapterView parent) { //什么都没选触发 } }); } } 实现了 OnItemSelectedListener 接口,并覆写了里面的 onItemSelected 方法,里面的position参数决定了单击的 是哪一些,借助这个position就可以获取字符串数组中的字符串,将字符串信息通过TextView显示出来。 运行实 例如下: 第 3 章 百战经典第二战-好玩的Spinner控件 | 15 图片 3.2图片 3.2 这里写图片描述 可以选择Spinner中的选项“广州”,选项将打印在TextView上,互动性就体现出来了,小实例也就有应用的价值 了。 方式二实现方式二实现 修改main.xml文件: MainActivity.java: package org.yayun.demo; //省略导入包 public class MainActivity extends Activity { private Spinner spinner, spinnerCountry; private TextView textView; private List data = null; private ArrayAdapter adapter; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 生命周期方法 super.setContentView(R.layout.main); // 设置要使用的布局管理器 spinner = (Spinner) findViewById(R.id.spinner); textView = (TextView) findViewById(R.id.text); spinnerCountry = (Spinner) findViewById(R.id.spinnerCountry); spinnerCountry.setPrompt("选择国籍:");// 在列表中显示 data = new ArrayList(); data.add("中國"); data.add("美國"); data.add("日本"); adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, this.data);//定义下拉列表 spinnerCountry.setAdapter(adapter); spinner.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView parent, View view, int position, long id) { String[] cities = getResources().getStringArray( R.array.city_labels);// 获取列表数据 textView.setText("您喜欢的城市是:" + cities[position]);// 显示 } public void onNothingSelected(AdapterView parent) { 第 3 章 百战经典第二战-好玩的Spinner控件 | 17 } }); spinnerCountry.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView parent, View view, int position, long id) { String[] countries = data.toArray(new String[data.size()]);// 获取列表数据 Toast.makeText(MainActivity.this, "您的国籍是:"+countries[position], Toast.LENGTH_SHORT).show(); } public void onNothingSelected(AdapterView parent) { } }); } } setPrompt() 方法可以在下拉控件的上栏显示提示信息,就不用单独的TextView提示了。这里还用到了ArrayAdap ter动态填充了第二个下拉控件的数据,更为灵活。 运行实例如下: 图片 3.3图片 3.3 这里写图片描述 第 3 章 百战经典第二战-好玩的Spinner控件 | 18 总结总结 1. 定义数据内容时需要使用 元素指定; 2. android:entries="@array/city_labels" 载入文本资源; 3. String[] cities = getResources().getStringArray(R.array.city_labels);//获取资源数据的方法 4. String 和 CharSequence 关系 String 继承于CharSequence,也就是说String也是CharSequence类型。 Cha rSequence是一个接口,它只包括 length() , charAt(int index) , subSequence(int start, int end) 这几 个API接口。除了String实现了CharSequence之外,StringBuffer和StringBuilder也实现了CharSequence接 口。 需要说明的是,CharSequence就是字符序列,String, StringBuilder和StringBuffer本质上都是通过 字符数组实现的! 5. 提示信息的设置: spinnerCountry.setPrompt("选择国籍:");// 在列表中显示 6. 此外可以用 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);//来设置显 示风格 第 3 章 百战经典第二战-好玩的Spinner控件 | 19 44 百战经典第三战-实现画图板百战经典第三战-实现画图板 解触摸事件(OnTouchListener)指的是当用户接触到屏幕之后所触发的一种事件形式,用户触摸屏幕时,可以使 用触摸事件监听取得用户当前的坐标。 一、坐标显示一、坐标显示 在实现画图功能之前,先实现利用触摸事件监听获得当前触摸的坐标。 main.xmlmain.xml: 布局代码非常简单,只引入一个TextView控件,用于记录当前左边。 下面看一下MainActivity代码: package org.yayun.demo; //省略导入包 public class MainActivity extends Activity { private TextView textView; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 生命周期方法 super.setContentView(R.layout.main); // 设置要使用的布局管理器 textView=(TextView)findViewById(R.id.text); textView.setOnTouchListener(new OnTouchListener() {//触摸事件 public boolean onTouch(View v, MotionEvent event) { textView.setText("X="+event.getX()+",Y="+event.getY());//获取坐标 return false; } }); } } 实现了触摸监听,结合MotionEvent的getX和getY方法获取当前坐标值。 运行实例: 第 4 章 百战经典第三战-实现画图板 | 21 图片 4.1图片 4.1 这里写图片描述 二、实现画图功能二、实现画图功能 由于OnTouch事件是在View类中定义的,所以如果想要完成绘图的操作,首先应该定义一个属于自己的组件,该组 件专门进行绘图板的功能实现,而且组件类一定要继承View类,同时要覆写View类的 onDraw() 绘图方法。 代码 如下: package org.yayun.demo; //省略导入包 public class MyPaintView extends View{ private List allPoints=new ArrayList();//保存所有的坐标点 public MyPaintView(Context context, AttributeSet attrs) { super(context, attrs); super.setBackgroundColor(Color.WHITE); super.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { Point point=new Point((int)event.getX(),(int)event.getY()); if(event.getAction()==MotionEvent.ACTION_DOWN){//判断按下 allPoints=new ArrayList();//开始新的记录 allPoints.add(point); }else if(event.getAction()==MotionEvent.ACTION_UP){ 第 4 章 百战经典第三战-实现画图板 | 22 allPoints.add(point); }else if(event.getAction()==MotionEvent.ACTION_MOVE){ allPoints.add(point); MyPaintView.this.postInvalidate();//重绘 } return true;//表示下面的不再执行了 } }); } @Override protected void onDraw(Canvas canvas) { Paint paint=new Paint(); paint.setColor(Color.RED); if(allPoints.size()>1){ Iterator iterator=allPoints.iterator(); Point firstPoint=null;//开始点 Point lastpPoint=null;//结束点 while (iterator.hasNext()) { if(firstPoint==null){//找到开始点 firstPoint=(Point)iterator.next(); }else{ if(lastpPoint!=null){ firstPoint=lastpPoint; } lastpPoint=(Point)iterator.next(); canvas.drawLine(firstPoint.x, firstPoint.y, lastpPoint.x, lastpPoint.y, paint);//画线 } } } super.onDraw(canvas); } } 这里用到了自定义控件,继承View类。定义了一个泛型Point的List用于保存所有的坐标数据,在绘图 onDra w() 方法时,根据这些坐标划线。 修改main.xml,将自定义控件MyPaintView引入: MainActivity不用加入任何东西: package org.yayun.demo; //省略导入包 public class MainActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 生命周期方法 super.setContentView(R.layout.main); // 设置要使用的布局管理器 } } 运行实例,在实例上用手指就可以作画了,如下: 图片 4.2图片 4.2 这里写图片描述 总结总结 1. 触摸事件 OnTouchListener 及 onTouch() 方法; 2. event.getX() //利用MotionEvent获取坐标的方法getX() 第 4 章 百战经典第三战-实现画图板 | 24 3. onDraw() 方法和如何使用Canvas进行绘图的操作,而本次绘制是一条线( canvas.drawLine() )。 第 4 章 百战经典第三战-实现画图板 | 25 55 百战经典第四战-玩转ListView百战经典第四战-玩转ListView Android用的最多的,也最难用的应该就是ListView了,ListView的继承结构如下: java.lang.Object ? android.view.View ? android.view.ViewGroup ? android.widget.AdapterView ? android.widget.AbsListView ? android.widget.ListView listview 三元素: 列表的显示需要三个元素: 1. ListVeiw 用来展示列表的View。 2. 适配器 用来把数据映射到ListView上的中介。 3. 数据 具体的将被映射的字符串,图片,或者基本组件。 根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter 其中以ArrayAdapter最为简单,只能展示一行字。SimpleAdapter有最好的扩充性,可以自定义出各种效果。Simp leCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示 出来。 一、最简单的ListView一、最简单的ListView 首先简单介绍一下ListView的最简单用法,不用列表项布局文件: package org.yayun.demo; //省略导入包 public class MainActivity extends Activity { private String[] arrays = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); listView = new ListView(this); listView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_expandable_list_item_1, arrays));//利用ArrayAdapter对数据进行包装 super.setContentView(listView);//将ListView设置为显示界面 } } 第 5 章 百战经典第四战-玩转ListView | 27 这里使用了ArrayAdapter实现,直接将arrays中的数据引入ListView,满足简单的应用需求。 实例运行如下: 图片 5.1图片 5.1 这里写图片描述 二、结合ArrayAdapter实现较复杂的ListView二、结合ArrayAdapter实现较复杂的ListView 1.main.xml代码: 第 5 章 百战经典第四战-玩转ListView | 28 2.fruit_item.xml代码:(ListView中的单项目) 3.Fruit.java代码如下:(封装属性) package org.yayun.demo; public class Fruit { private String name; private int imageId; public Fruit(String name, int imageId) { this.name = name; this.imageId = imageId; } public String getName() { return name; } public int getImageId() { return imageId; } } 4.集成ArrayAdapter的FruitAdapter.java代码如下:(适配器类) package org.yayun.demo; //省略导入包 public class FruitAdapter extends ArrayAdapter { private int resourceId; public FruitAdapter(Context context, int textViewResourceId, List objects) { 第 5 章 百战经典第四战-玩转ListView | 29 super(context, textViewResourceId, objects); resourceId = textViewResourceId; } @Override public View getView(int position, View convertView, ViewGroup parent) { Fruit fruit = getItem(position); View view; ViewHolder viewHolder; if (convertView == null) { view = LayoutInflater.from(getContext()).inflate(resourceId, null); viewHolder = new ViewHolder(); viewHolder.fruitImage = (ImageView) view .findViewById(R.id.fruit_image); viewHolder.fruitName = (TextView) view .findViewById(R.id.fruit_name); view.setTag(viewHolder); } else { view = convertView; viewHolder = (ViewHolder) view.getTag(); } viewHolder.fruitImage.setImageResource(fruit.getImageId()); viewHolder.fruitName.setText(fruit.getName()); return view; } class ViewHolder { ImageView fruitImage; TextView fruitName; } } 对代码不熟悉的同学不要紧张,这些都是较为固定的写法,写多了就可以理解其中的含义了。 5.MainActivity.java代码如下: package org.yayun.demo; //省略导入包 public class Hello extends Activity { private List fruitList = new ArrayList(); public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 生命周期方法 super.setContentView(R.layout.main); // 设置要使用的布局管理器 initFruits(); FruitAdapter adapter = new FruitAdapter(Hello.this, R.layout.fruit_item, fruitList); //适配器 ListView listView = (ListView) findViewById(R.id.list_view); 第 5 章 百战经典第四战-玩转ListView | 30 listView.setAdapter(adapter); //设置适配器 } private void initFruits() { //数据初始化 Fruit appleFruit = new Fruit("Apple", R.drawable.apple_pic); fruitList.add(appleFruit); Fruit bananaFruit = new Fruit("Banana", R.drawable.banana_pic); fruitList.add(bananaFruit); Fruit orangeFruit = new Fruit("Orange", R.drawable.orange_pic); fruitList.add(orangeFruit); Fruit waterFruit = new Fruit("Apple", R.drawable.watermelon_pic); fruitList.add(waterFruit); } } 运行上面的实例,使得ListView不仅可以显示文字,也可以显示图片,进行组合显示。 图片 5.2图片 5.2 这里写图片描述 三、结合上下文菜单实现单项的删除三、结合上下文菜单实现单项的删除 修改MainActivity.java程序如下: 第 5 章 百战经典第四战-玩转ListView | 31 package org.yayun.demo; //省略导入包 public class Hello extends Activity { private List fruitList = new ArrayList(); FruitAdapter adapter; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 生命周期方法 super.setContentView(R.layout.main); // 设置要使用的布局管理器 initFruits(); adapter = new FruitAdapter(Hello.this, R.layout.fruit_item, fruitList); ListView listView = (ListView) findViewById(R.id.list_view); listView.setAdapter(adapter); super.registerForContextMenu(listView);//注册上下文菜单 } @Override public void onCreateContextMenu(ContextMenu menu, View v,// 创建菜单项 ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); menu.setHeaderTitle("选择操作"); menu.add(Menu.NONE, Menu.FIRST + 1, 1, "删除"); menu.add(Menu.NONE, Menu.FIRST + 2, 2, "取消"); } @Override public boolean onContextItemSelected(MenuItem item) {// 选择监听 AdapterContextMenuInfo acmiRef = (AdapterContextMenuInfo) item .getMenuInfo();// 用来获取item信息哎,重要 int removeIndex = acmiRef.position; switch (item.getItemId()) { case Menu.FIRST + 1: fruitList.remove(removeIndex); adapter.notifyDataSetChanged();// 删除后刷新ListView break; case Menu.FIRST + 2: break; default: break; } return false; } private void initFruits() { //初始化数据 Fruit appleFruit = new Fruit("Apple", R.drawable.apple_pic); fruitList.add(appleFruit); Fruit bananaFruit = new Fruit("Banana", R.drawable.banana_pic); fruitList.add(bananaFruit); Fruit orangeFruit = new Fruit("Orange", R.drawable.orange_pic); 第 5 章 百战经典第四战-玩转ListView | 32 fruitList.add(orangeFruit); Fruit waterFruit = new Fruit("Apple", R.drawable.watermelon_pic); fruitList.add(waterFruit); } } 运行实例如下: 图片 5.3图片 5.3 这里写图片描述 点击删除按钮后: 第 5 章 百战经典第四战-玩转ListView | 33 图片 5.4图片 5.4 这里写图片描述 总结总结 1. super.registerForContextMenu(listView); //注册上下文菜单 2. adapter.notifyDataSetChanged(); // 删除后刷新ListView 3. AdapterContextMenuInfo acmiRef = (AdapterContextMenuInfo) item.getMenuInfo(); // 用来获取当前item信 息,重要 int removeIndex = acmiRef.position; //获取点击位置的坐标 第 5 章 百战经典第四战-玩转ListView | 34 66 百战经典第五战-各种对话框Dialog精彩荟萃百战经典第五战-各种对话框Dialog精彩荟萃 在图形界面中,对话框是人机交互的一种重要形式,程序可以通过对话框进行一些信息的提示,而用户也可以通 过对话框对程序进行一些简单的交互操作。 在Android中,所有的对话框都是从android.app.Dialog类继承而来的,此类的继承结构如下: java.lang.Object android.app.Dialog 可以发现此类直接继承自Object类,与View类没有任何继承关系。 一、AlertDialog和AlertDialog.Builder一、AlertDialog和AlertDialog.Builder 警告框(AlertDialog)是项目中最常见的对话框形式,是Dialog的直接子类。 如果想要实例化AlertDialog类,往往需要依靠其内部类AlertDialog.Builder类完成。 下面通过一个最常见的返回键提示退出功能来演示一下其用法。 1. 布局文件main.xml,这里只用到返回键,所以布局文件可以不设置任何控件。 2. MainActivity.java: package org.yayun.demo; //省略导入包 public class MainActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 生命周期方法 super.setContentView(R.layout.main); // 设置要使用的布局管理器 } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_BACK){ this.exitDialog(); } return super.onKeyDown(keyCode, event); } private void exitDialog() { Dialog dialog=new AlertDialog.Builder(this).setTitle("程序退出?").setMessage("确定退出吗?").setPositiveButton("退出", new OnClickListener() { public void onClick(DialogInterface dialog, int which) { MainActivity.this.finish(); } }).setNegativeButton("取消", new OnClickListener() { public void onClick(DialogInterface dialog, int which) { } 第 6 章 百战经典第五战-各种对话框Dialog精彩荟萃 | 36 }).create();//创建Dialog dialog.show();//显示对话框 } } 这里覆写了 onKeyDown() 方法,通过里面的keycode参数判断当前按下的键,若 keyCode==KeyEvent.KEYCODE_BACK 可以认定按下了返回键,弹出对话框进行提示,若选择了positivebutton(退出)则执行finish方法,退出应 用。 运行实例如下: 图片 6.1图片 6.1 这里写图片描述 这属于比较简单的应用,但是在实际开发中用到还比较多。 二、类似ListView的显示风格的选项列表二、类似ListView的显示风格的选项列表 1.main.xml代码如下: 第 6 章 百战经典第五战-各种对话框Dialog精彩荟萃 | 37
还剩141页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

文杰天下

贡献于2016-10-25

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf