• Android开发教程 葵花宝典第五层 控件之 Menu DatePicker TimePicker AutoCompleteTextView MultiAutoCompleteTextView


    Hi 大家好!

      从今天起,课程中所讲的控件会比前几节复杂,功能也越强大,希望大家能将这些控件消化理解。

      照例,上笑话。。

      楼主:给我一个女人,我就能创造出一个民族!
      回复:嗯,给你一头母猪,明年的肉价就能下跌! :)

      开始今天的课程

      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类型,填写名称
    -->
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:id="@+id/menuGroup1">
    <item
    android:id
    ="@+id/item1"
    android:title
    ="添加"
    android:icon
    ="@drawable/add"/>
    <item
    android:id
    ="@+id/item2"
    android:title
    ="修改"
    android:icon
    ="@drawable/edituser"/>
    <item
    android:id
    ="@+id/item3"
    android:title
    ="删除"
    android:icon
    ="@drawable/remove"/>
    <item
    android:id
    ="@+id/item4"
    android:title
    ="关于"
    android:icon
    ="@drawable/exit"/>
    </group>
    </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
    *
    */
    publicclass MenuActivity extends Activity {
    @Override
    protectedvoid onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    }

    /**
    * 创建菜单
    */
    @Override
    publicboolean onCreateOptionsMenu(Menu menu) {

    //将XML文件转化成Menu对象
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.appmenu, menu);
    returntrue;
    }

    /**
    * 选中某项菜单事件
    */
    @Override
    publicboolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.item1:

    break;
    case R.id.item2:

    break;
    default:
    break;
    }
    ShowToast(
    "选则了"+ item.getTitle());
    returntrue;
    }

    privatevoid 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
    *
    */
    publicclass MenuActivity1 extends Activity {

    @Override
    protectedvoid onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    }

    @Override
    publicboolean 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);

    returnsuper.onCreateOptionsMenu(menu);
    }

    /**
    * 选中某项菜单事件
    */
    @Override
    publicboolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case1:

    break;
    case2:

    break;
    default:
    break;
    }
    ShowToast(
    "选则了"+ item.getTitle());
    returntrue;
    }

    privatevoid 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
    *
    */
    publicclass DataActivity extends Activity {

    TextView m_TextView;
    //声明DatePicker对象
    DatePicker m_DatePicker;
    //声明TimePicker对象
    TimePicker m_TimePicker;

    Button m_dpButton;
    Button m_tpButton;
    //java中的日历类
    Calendar c;
    @Override
    protectedvoid 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
    publicvoid 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
    publicvoid onTimeChanged(TimePicker view, int hourOfDay, int minute)
    {
    DisplayShow(
    "时:"+ hourOfDay +" 分:"+ minute);


    }
    });

    m_dpButton.setOnClickListener(
    new Button.OnClickListener(){
    publicvoid onClick(View v)
    {
    //创建、显示日期对话框
    new DatePickerDialog(DataActivity.this,
    new DatePickerDialog.OnDateSetListener()
    {
    publicvoid 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() {
    publicvoid onClick(View v)
    {
    //创建、显示时间对话框
    new TimePickerDialog(DataActivity.this,
    new TimePickerDialog.OnTimeSetListener()
    {
    publicvoid 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();
    }
    });
    }

    privatevoid 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"?>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation
    ="vertical" android:layout_width="fill_parent"
    android:layout_height
    ="fill_parent" android:scrollbars="vertical">

    <AutoCompleteTextView
    android:id
    ="@+id/AutoCompleteTextView01"
    android:layout_width
    ="fill_parent"
    android:layout_height
    ="wrap_content"
    android:completionThreshold
    ="3"
    >
    <!-- android:completionThreshold 设置最少输入几个字符进行提示 -->
    </AutoCompleteTextView>
    <MultiAutoCompleteTextView
    android:id
    ="@+id/MultiAutoCompleteTextView01"
    android:layout_width
    ="fill_parent"
    android:layout_height
    ="wrap_content"
    >
    </MultiAutoCompleteTextView>
    </LinearLayout>

    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
    *
    */
    publicclass AutoCompleteAndMultiAuto extends Activity {
    privatestaticfinal String[] autoString =new String[] { "a2", "abf",
    "abe", "abcde", "abc2", "abcd3", "abcde2", "abc2", "abcd2",
    "abcde2" };

    @Override
    protectedvoid onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.autocomplete);
    // 关联关键字
    ArrayAdapter<String> adapter =new ArrayAdapter<String>(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());

    }
    }

    今天的课程就到这里,源码已经上传到北京天圣达科技有限公司网站,大家可以去下载进行学习  

  • 相关阅读:
    QuantLib 金融计算
    【翻译】《理解收益率曲线》系列
    QuantLib 金融计算——C++ 代码改写成 Python 程序的一些经验
    可转债研报阅读笔记
    SWIG 3 中文手册——13. 约定
    SWIG 3 中文手册——12. 自定义功能
    SWIG 3 中文手册——11. 类型映射
    【翻译】Quant 应该怎样写博客?
    QuantLib 金融计算——案例之普通利率互换分析(2)
    仿射期限结构模型:理论与实现——实现部分
  • 原文地址:https://www.cnblogs.com/jasoncc/p/2117791.html
Copyright © 2020-2023  润新知