从今天起,课程中所讲的控件会比前几节复杂,功能也越强大,希望大家能将这些控件消化理解。
照例,上笑话。。
楼主:给我一个女人,我就能创造出一个民族!
回复:嗯,给你一头母猪,明年的肉价就能下跌! 🙂
开始今天的课程
1 Menu
菜单控件,很实用,也很常用的一种控件,那么运行的效果什么样呢?如下图
创建Menu有三种方式
第一种 通过配置文件实现菜单效果
第二种 通过编码方式实现菜单效果
第三种 在特定条件下动态创建菜单效果
那么这里我们先讲解前两种,至于第三种,后面我们做项目的时候会相信描述。
通过配置文件创建Menu
既然是通过配置文件创建,自然需要XML,首先需要在 res文件夹下创建一个menu文件夹,如下图
在创建XML时,大家要注意一点,最好不要直接对着 menu文件夹右键 新建 文件 的方式,可能是由于我的环境问题,我通过这种方式老是导致Eclipse 宕掉,无响应。。大家可以试试看你们的环境是否可以,如果不可以,请用以下两种方式来创建
第一 直接复制一个menu文件到menu文件夹下,然后打开进行修改
第二 通过 右击menu文件夹 -> 新建 -> 其它 -> Android -> Android XML File 下一步
在弹出的窗体中,创建文件名称,并选中Menu单选按钮 进行创建。
新建完成后,双击打开menu.xml文件,进行配置,代码如下:
<!--?xml version="1.0" encoding="utf-8"?--> <!-- 创建Menu的XML时,需要注意 1 不要直接去创建文件,然后创建一个.xml的文件,会导致Eclipse无响应 如何创建? 1 直接从外部访问 复制文件到menu文件夹 2 menu new Other——>Android——>XML,选择menu类型,填写名称 -->
创建完配置文件后,如何与代码关联呢?
package TSD.Jason.Example; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.widget.Toast; /** * 通过配置文件实现 * @author Administrator * */ public class MenuActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.main); } /** * 创建菜单 */ @Override public boolean onCreateOptionsMenu(Menu menu) { //将XML文件转化成Menu对象 MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.appmenu, menu); return true; } /** * 选中某项菜单事件 */ @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.item1: break; case R.id.item2: break; default: break; } ShowToast("选则了" + item.getTitle()); return true; } private void ShowToast(String str) { Toast.makeText(this,str,Toast.LENGTH_SHORT).show(); } }
大家可以注意到是通过 onCreateOptionsMenu方法进行Menu的创建操作
并通过MenuInflater类来将menu.xml转换成menu对象,进行操作。
onOptionsItemSelected方法是用来捕获菜单中某项被单击时,所要执行的功能。
当大家编写完成后,将程序启动起来,然后单击模拟器右边的功能键区域中的 MENU 按钮 就能看到菜单效果
通过代码实现
这种方式就不需要创建XML文件了,直接在编辑器中编写代码即可,代码如下
package TSD.Jason.Example; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; /** * 通过代码生成菜单 * @author Administrator * */ public class MenuActivity1 extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, 1, 1, R.string.menu1).setIcon(R.drawable.add); menu.add(0, 2, 1, R.string.menu2); menu.add(0, 3, 1, R.string.menu3); menu.add(0, 4, 1, R.string.menu4); return super.onCreateOptionsMenu(menu); } /** * 选中某项菜单事件 */ @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case 1: break; case 2: break; default: break; } ShowToast("选则了" + item.getTitle()); return true; } private void ShowToast(String str) { Toast.makeText(this,str,Toast.LENGTH_SHORT).show(); } }
大家可以发现基本上和用XML方式没有太大区别,唯一的区别就在onCreateOptionsMenu方法中
menu.add(0, 1, 1, R.string.menu1).setIcon(R.drawable.add);
直接使用这个方法的参数menu对象的add方法创建
第一个参数 组ID 一般我们都设置成一样的
第二个参数 项ID 这个项ID不要重复,否则在onOptionsItemSelected方法中你将无法正确捕捉用户点击了哪一项
第三个参数 排序 这个就按顺序设置就OK
第四个参数 要显示的提示信息
DatePicker
这是一个日期控件,在项目中可能会有一些需求是需要通过用户去选择日期的,那么通过这个控件我们可以很好的和用户进行交互,并获取到用户选择的日期,进行下一步操作,运行效果如下图
TimePicker
时间控件 和上边的DatePicker所要表达的意思是一样的,用户可以选择时间,运行效果如下图
代码如下:
package TSD.Jason.Example; import java.util.Calendar; import android.app.Activity; import android.app.DatePickerDialog; import android.app.TimePickerDialog; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.DatePicker; import android.widget.TextView; import android.widget.TimePicker; import android.widget.Toast; /** * DatePicker 重要方法 getDayOfMonth():获取当前Day getMonth():获取当前月 getYear()获取当前年 updateDate(int year, int monthOfYear, int dayOfMonth):更新日期 * * * * TimePicker 重要方法 * setCurrentMinute(Integer currentMinute)设置当前时间的分钟 getCurrentMinute()获取当前时间的分钟 setEnabled(boolean enabled)设置当前视图是否可以编辑。 m_TimePicker.setIs24HourView(true);设置为24小时制显示 setOnTimeChangedListener(TimePicker.OnTimeChangedListener onTimeChangedListener)当时间改变时调用 * @author Administrator * */ public class DataActivity extends Activity { TextView m_TextView; //声明DatePicker对象 DatePicker m_DatePicker; //声明TimePicker对象 TimePicker m_TimePicker; Button m_dpButton; Button m_tpButton; //java中的日历类 Calendar c; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.date); c=Calendar.getInstance(); //获得当前日期 m_TextView= (TextView) findViewById(R.id.TextView01); m_dpButton = (Button)findViewById(R.id.button1); m_tpButton = (Button)findViewById(R.id.button2); //获取DatePicker对象 m_DatePicker = (DatePicker) findViewById(R.id.DatePicker01); //将日历初始化为当前系统时间,并设置其事件监听 m_DatePicker.init(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH), new DatePicker.OnDateChangedListener() { @Override public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { DisplayShow("年:" + year + " 月:" + monthOfYear + " 日:" + dayOfMonth); } }); //获取TimePicker对象 m_TimePicker = (TimePicker) findViewById(R.id.TimePicker01); //设置为24小时制显示 m_TimePicker.setIs24HourView(true); //监听时间改变 m_TimePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { DisplayShow("时:" + hourOfDay +" 分:"+ minute); } }); m_dpButton.setOnClickListener(new Button.OnClickListener(){ public void onClick(View v) { //创建、显示日期对话框 new DatePickerDialog(DataActivity.this, new DatePickerDialog.OnDateSetListener() { public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { //当日期更改时,在这里处理 //m_DatePicker.updateDate(year, monthOfYear, dayOfMonth); DisplayShow("年:" + year + " 月:" + monthOfYear + " 日:" + dayOfMonth); } },c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH)).show(); } }); m_tpButton.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { //创建、显示时间对话框 new TimePickerDialog(DataActivity.this, new TimePickerDialog.OnTimeSetListener() { public void onTimeSet(TimePicker view, int hourOfDay,int minute) { //时间改变时处理 //m_TimePicker.setCurrentHour(hourOfDay); //m_TimePicker.setCurrentMinute(minute); DisplayShow("时:" + hourOfDay +" 分:"+ minute); } },c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE), true).show(); } }); } private void DisplayShow(String str) { Toast.makeText(this, str, Toast.LENGTH_SHORT).show(); } }
AutoCompleteTextView
智能提示 类似与百度的输入框,输入关键字后,跳出和此关键字匹配的数据 此控件只能匹配一次操作,运行如下图
当数据源中有匹配项时,就会弹出和输入的字符所匹配的数据,用户可以进行选择,并且可以继续输入
例如 当输入 ab 时,会提示上图所显示的这些项,当选择了abcde这项时,AutoCompleteTextView 输入框中则会显示abcde,当再次输入f时,会继续匹配abcdef这些字符。
MultiAutoCompleteTextView
和上边的AutoCompleteTextView 类似,区别在于它可以多次输入,选择,每次选择后,会以逗号分隔。效果如下
当选择了abcde时
大家通过上边的效果图就能明白,此控件是可以进行多次输入 选择的 ,只不过每次选择后,都会生出一个逗号,并且可以再次输入 选择
布局代码如下:
<!--?xml version="1.0" encoding="utf-8"?--> <!-- android:completionThreshold 设置最少输入几个字符进行提示 -->
Java代码:
package TSD.Jason.Example; import android.app.Activity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.MultiAutoCompleteTextView; /** * 提供了2种智能提示控件 AutoCompleteTextView 和 MultiAutoCompleteTextView 区别 * AutoCompleteTextView 只能在文本框中查询一次 MultiAutoCompleteTextView 可以匹配多次,每次之前都用逗号分隔 * * 默认最少2个字符进行提示 方法 setThreshold(2) 设置最少输入几个字符进行提示 * * @author Administrator * */ public class AutoCompleteAndMultiAuto extends Activity { private static final String[] autoString = new String[] { "a2", "abf", "abe", "abcde", "abc2", "abcd3", "abcde2", "abc2", "abcd2", "abcde2" }; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.autocomplete); // 关联关键字 ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, autoString); AutoCompleteTextView m_AutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.AutoCompleteTextView01); // 将adapter添加到AutoCompleteTextView中 m_AutoCompleteTextView.setAdapter(adapter); // ///////////////// MultiAutoCompleteTextView mm_AutoCompleteTextView = (MultiAutoCompleteTextView) findViewById(R.id.MultiAutoCompleteTextView01); // 将adapter添加到AutoCompleteTextView中 mm_AutoCompleteTextView.setAdapter(adapter); mm_AutoCompleteTextView .setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); } }
今天的课程就到这里,源码已经上传到天圣达网站,大家可以去下载进行学习 http://www.bj-stl.com/android.html