第十三章:常用控件下

1、ListView

在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。抽空把对ListView的使用做了整理,并写了个小例子:

 列表的显示需要三个元素:

1.ListVeiw 用来展示列表的View。

2.适配器 用来把数据映射到ListView上的中介。

3.数据    具体的将被映射的字符串,图片,或者基本组件。

根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter

其中以ArrayAdapter最为简单,只能展示一行字。SimpleAdapter有最好的扩充性,可以自定义出各种效果。SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来。

 我们从最简单的ListView开始:

package com.example.helloandroid;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.app.Activity;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class AndroidControl2Activity extends Activity  {
    private ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_android_control2);
        
        listView = new ListView(this);
        
        listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData()));
        
        setContentView(listView);
    }
    private List<String> getData(){

        List<String> data = new ArrayList<String>();
        data.add("测试数据1");
        data.add("测试数据2");
        data.add("测试数据3");
        data.add("测试数据4");
        return data;

    }
}
View Code

上面代码使用了ArrayAdapter(Context context, int textViewResourceId, List<T> objects)来装配数据,要装配这些数据就需要一个连接ListView视图对象和数组数据的适配器来两者的适配工作,ArrayAdapter的构造需要三个参数,依次为this,布局文件(注意这里的布局文件描述的是列表的每一行的布局,android.R.layout.simple_list_item_1是系统定义好的布局文件只显示一行文字,数据源(一个List集合)。同时用setAdapter()完成适配的最后工作。运行后的显示效果如下图:

SimpleAdapter

simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。下面的代码都直接继承了ListActivity,ListActivity和普通的Activity没有太大的差别,不同就是对显示ListView做了许多优化,方面显示而已。

下面的程序是实现一个带有图片的类表。

首先需要定义好一个用来显示每一个列内容的xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="horizontal" android:layout_width="fill_parent"

    android:layout_height="fill_parent">

    <LinearLayout android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#FFFFFFFF"
            android:textSize="22px" />

        <TextView android:id="@+id/info"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#FFFFFFFF"
            android:textSize="13px" />
    </LinearLayout>

</LinearLayout>
View Code

实现代码:

package com.example.helloandroid;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class AndroidControl2Activity extends ListActivity   {
    @Override

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        SimpleAdapter adapter = new SimpleAdapter(this,getData(),R.layout.activity_android_control2,
                new String[]{"title","info"},
                new int[]{R.id.title,R.id.info});

        setListAdapter(adapter);

    }

    private List<Map<String, Object>> getData() {

        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        Map<String, Object> map = new HashMap<String, Object>();
        
        map.put("title", "G1");
        map.put("info", "google 1");
        list.add(map);

        map = new HashMap<String, Object>();
        map.put("title", "G2");
        map.put("info", "google 2");
        list.add(map);

        map = new HashMap<String, Object>();
        map.put("title", "G3");
        map.put("info", "google 3");
        list.add(map);

        return list;

    }

}
View Code

使用simpleAdapter的数据用一般都是HashMap构成的List,list的每一节对应ListView的每一行。HashMap的每个键值数据映射到布局文件中对应id的组件上。因为系统没有对应的布局文件可用,我们可以自己定义一个布局vlist.xml。下面做适配,new一个SimpleAdapter参数一次是:this,布局文件(xml),HashMap的 title 和 info。布局文件的组件id,title,info。布局文件的各组件分别映射到HashMap的各元素上,完成适配。

 2、Spinner

通常分5步:

第一步:添加一个下拉列表项的list,这里添加的项就是下拉列表的菜单项 
第二步:为下拉列表定义一个适配器,这里就用到里前面定义的list。
第三步:为适配器设置下拉列表下拉时的菜单样式。
第四步:将适配器添加到下拉列表上
第五步:为下拉列表设置各种事件的响应,这个事响应菜单被选中

XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout  
    android:id= "@+id/widget28"  
    android:layout_width= "fill_parent"  
    android:layout_height= "fill_parent"  
    android:orientation= "vertical"  
    xmlns:android= "http://schemas.android.com/apk/res/android" >  
    <TextView  
        android:id= "@+id/TextView_Show"  
        android:layout_width= "fill_parent"  
        android:layout_height= "wrap_content"  
        android:text= "你选择的是"  
        android:textSize= "25sp" >  
    </TextView>  
    <Spinner  
        android:id= "@+id/spinner_City"  
        android:layout_width= "fill_parent"  
        android:layout_height= "wrap_content" >  
    </Spinner> 
</LinearLayout> 
View Code

代码:

package com.example.helloandroid;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;

public class AndroidControl3Activity extends Activity {
       private List<String> list = new ArrayList<String>(); 
        private Spinner mySpinner; 
        private TextView myTextView; 
        private ArrayAdapter<String> spinneradapter; 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_android_control3);
        
         //Spinner显示
          //第一步:添加一个下拉列表项的list,这里添加的项就是下拉列表的菜单项 
            list.add("北京");
            list.add("上海");
            list.add("深圳");
            list.add("广州");
            mySpinner = (Spinner)findViewById(R.id.spinner_City); 
            myTextView = (TextView)findViewById(R.id.TextView_Show); 
          //第二步:为下拉列表定义一个适配器,这里就用到里前面定义的list。 
            spinneradapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, list); 
          //第三步:为适配器设置下拉列表下拉时的菜单样式。 
            spinneradapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
          //第四步:将适配器添加到下拉列表上 
            mySpinner.setAdapter(spinneradapter); 
            //第五步:为下拉列表设置各种事件的响应,这个事响应菜单被选中 
            mySpinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){

                @Override
                public void onItemSelected(AdapterView<?> parent, View view,
                        int position, long id) {
                    // TODO Auto-generated method stub
                    myTextView.setText("您选择的是:"+ spinneradapter.getItem(position)); 
                    /* 将mySpinner 显示*/ 
                    view.setVisibility(View.VISIBLE); 
                    
                }

                @Override
                public void onNothingSelected(AdapterView<?> parent) {
                    // TODO Auto-generated method stub
                    
                }

            });

    }
}
View Code

  3、GridView

GirdView的一些属性:

android:numColumns="auto_fit" --------列数设置为自动 android:columnWidth="90dp",----------每列的宽度,也就是Item的宽度 android:stretchMode="columnWidth"------缩放与列宽大小同步 android:verticalSpacing="10dp"----------垂直边距 android:horizontalSpacing="10dp"-------水平边距

1、准备数据源

2、新建适配器

3、加载适配器

GridView(网格视图)是按照行列的方式来显示内容的,一般用于显示图片,图片等内容,比如实现九宫格图,用GridView是首选,也是最简单的,下面来个实例,

activity_android_control4.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:background="#000"
    >
    
<GridView 
        android:id="@+id/gview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:numColumns="auto_fit"    
        android:columnWidth="80dp"
        android:stretchMode="columnWidth"
        ></GridView>
</LinearLayout>
View Code

item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" 
    android:gravity="center"
    android:padding="10dp"
    >
    
    
<ImageView 
    android:src="@drawable/ic_launcher"
    android:id="@+id/image"
    android:layout_width="60dp"
    android:layout_height="60dp"
    
    />

<TextView 
    android:id="@+id/text"
    android:layout_marginTop="5dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="#ffffff"
    android:text="文字"
    />
</LinearLayout>
View Code

AndroidControl4Activity.java:

package com.example.helloandroid;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.GridView;
import android.widget.SimpleAdapter;

public class AndroidControl4Activity extends Activity {
    private GridView gview;
    private List<Map<String, Object>> data_list;
    private SimpleAdapter sim_adapter;
    // 图片封装为一个数组
    private int[] icon = { R.drawable.address_book, R.drawable.calendar,
            R.drawable.camera, R.drawable.clock, R.drawable.games_control,
            R.drawable.messenger, R.drawable.ringtone, R.drawable.settings,
            R.drawable.speech_balloon, R.drawable.weather, R.drawable.world,
            R.drawable.youtube };
    private String[] iconName = { "通讯录", "日历", "照相机", "时钟", "游戏", "短信", "铃声",
            "设置", "语音", "天气", "浏览器", "视频" };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_android_control4);
        
        gview = (GridView) findViewById(R.id.gview);
        //新建List
        data_list = new ArrayList<Map<String, Object>>();
        //获取数据
        getData();
        //新建适配器
        String [] from ={"image","text"};
        int [] to = {R.id.image,R.id.text};
        sim_adapter = new SimpleAdapter(this, data_list, R.layout.item, from, to);
        //配置适配器
        gview.setAdapter(sim_adapter);

    }
    public List<Map<String, Object>> getData(){        
        //cion和iconName的长度是相同的,这里任选其一都可以
        for(int i=0;i<icon.length;i++){
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("image", icon[i]);
            map.put("text", iconName[i]);
            data_list.add(map);
        }
            
        return data_list;
    }

}
View Code

 

  4、Dialog

 

在Android开发中,我们经常会需要在界面上弹出一些对话框,比如询问用户或者让用户选择。这些功能我们叫它Android Dialog对话框,在我们使用Android的过程中,据我所知,Android Dialog的类型无非也就7种,下面我分别向大家介绍这7Android Dialog对话框的使用方法,希望对大家能有所帮助。

 

图1

图2

图3

图4

图5

图6

图7

图8

1、主窗体图1的实现,在Lanyout中添加7个按钮,代码如下所示:

main.xml
 1 package zqvie.com;
 2 import android.app.Activity;
 3 import android.app.AlertDialog;
 4 import android.app.AlertDialog.Builder;
 5 import android.os.Bundle;
 6 import android.view.View;
 7 import android.view.View.OnClickListener;
 8 import android.widget.Button;
 9 
10 public class DialogActivity extends Activity implements OnClickListener {
11     /** Called when the activity is first created. */
12     @Override
13     public void onCreate(Bundle savedInstanceState) {
14         super.onCreate(savedInstanceState);
15         setContentView(R.layout.main);
16         But_One=(Button) findViewById(R.id.But_One);     //注册按钮But_One
17         But_Two=(Button) findViewById(R.id.But_Two);   
18         But_Three=(Button) findViewById(R.id.But_Three);
19         But_Four=(Button) findViewById(R.id.But_Four);
20         But_Five=(Button) findViewById(R.id.But_Five);
21         But_Six=(Button) findViewById(R.id.But_Six);
22         But_Seven=(Button) findViewById(R.id.But_Seven);
23         But_One.setOnClickListener(this);                //为按钮But_One注册侦听器
24     }
25 Button But_One,But_Two,But_Three,But_Four,But_Five,But_Six,But_Seven;  //定义按钮
26 }
DialogActivity.java

2、图2的实现,设置单击“按钮1”时,弹出对话框,代码如下所示:

复制代码
 public void onClick(View v) {
        // TODO Auto-generated method stub
        if(v.getId()==R.id.But_One)
        {
            AlertDialog.Builder builder=new AlertDialog.Builder(DialogActivity .this);//生成一个对话框对象
            builder.setMessage("确定要退出吗?");   //设置对话框的显示信息
            builder.setTitle("提示");           //设置对话框的标题
            builder.setPositiveButton("确定",null);  //设置第一个按钮的Text,null处也可替换为new OnClickListener() {}
            builder.setNegativeButton("取消",null);   //设置第二个按钮的Text
            builder.create().show();                    //创建并显示对话框
        }
    }
复制代码

 3、图3的实现,设置单击“按钮2”时,弹出对话框,代码和效果图2如下所示:

复制代码
if(v.getId()==R.id.But_Two)
        {
            AlertDialog.Builder builder= new AlertDialog.Builder(DialogActivity.this);//生成一个对话框对象
            builder.setIcon( android.R.drawable.btn_star);//设置对话框的图标
            builder.setTitle("喜好调查");                  //设置对话的标题
            builder.setMessage("你喜欢李连杰的电影吗");   //设置对话框的显示信息
            builder.setPositiveButton("很喜欢",null);
            builder.setNeutralButton("一般",null);
            builder.setNegativeButton("不喜欢",null);
            builder.create().show();
        }
复制代码

 4、图4的实现,设置单击“按钮3”时,弹出对话框,代码和效果图3如下所示:

复制代码
 1 if(v.getId()==R.id.But_Three)
 2         {
 3             AlertDialog.Builder builder=new AlertDialog.Builder(this);
 4             builder.setTitle("请输入");
 5             builder.setIcon(android.R.drawable.ic_dialog_info);   //设置对话框的图标
 6             builder.setView(new EditText(this));      //设置对话框中显示一个输入框
 7             builder.setPositiveButton("确定",null);
 8             builder.setNegativeButton("取消",null);
 9             builder.show();
10         }
复制代码

 5、图5的实现,设置单击“按钮4”时,弹出对话框,代码和效果图4如下所示:

复制代码
1 if(v.getId()==R.id.But_Four)
2         {
3             Builder builder=new AlertDialog.Builder(this);  //生成一个对话框对象
4             builder.setTitle("单选框");   //设置对话框的标题
5             builder.setIcon(android.R.drawable.ic_dialog_info);  //设置对话框的图标
6             builder.setSingleChoiceItems( new String[] { "Item1", "Item2" }, 0,null);  //设置对话框的单选项
7             builder.setNegativeButton("取消", null);
8             builder.create().show();
9         }
复制代码

 6、图6的实现,设置单击“按钮5”时,弹出对话框,代码和效果图5如下所示:

复制代码
1 if(v.getId()==R.id.But_Five)
2         {
3             Builder builder=new AlertDialog.Builder(this);  //生成一个对话框对象
4             builder.setTitle("复选框");                  //设置对话框的标题
5             builder.setMultiChoiceItems( new String[] { "Item1", "Item2" }, null, null); //设置对话框的复选项
6             builder.setPositiveButton("确定", null); //设置对话框的第一个按钮"确定"
7             builder.setNegativeButton("取消", null); //设置对话框的第二个按钮"取消"
8             builder.show();
9         }
复制代码

 7、图7的实现,设置单击“按钮6”时,弹出对话框,代码和效果图6如下所示:

复制代码
1 if(v.getId()==R.id.But_Six)
2         {
3             Builder builder=new AlertDialog.Builder(this);  //生成一个对话框对象
4             builder.setTitle("列表框");
5             builder.setItems(new String[]{"Item1","Item2"},null);
6             builder.setNegativeButton("确定",null);
7             builder.create().show();
8         }
复制代码

 8、图8的实现,设置单击“按钮7”时,弹出自定义对话框,这种对话框相对上面讲的要复杂一些,它需要通过一个.xml文件来传递你要呈现的布局。代码和效果图7如下所示:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_height="wrap_content" android:layout_width="wrap_content"
 4  android:background="#ffffffff" android:orientation="horizontal"
 5  android:id="@+id/mydialog">
 6  <TextView android:layout_height="wrap_content"
 7    android:layout_width="wrap_content"
 8   android:id="@+id/tvname" android:text="姓名:" />
 9  <EditText android:layout_height="wrap_content"
10   android:layout_width="wrap_content" android:id="@+id/etname" android:minWidth="100dip"/>
11 
12 </LinearLayout>
dialog.xml
 1 if(v.getId()==R.id.But_Seven)
 2         {
 3             LayoutInflater inflater = getLayoutInflater();
 4                View layout = inflater.inflate(R.layout.mydialog,
 5                  null);
 6              
 7                new AlertDialog.Builder(this).setTitle("自定义布局").setView(layout)
 8                  .setPositiveButton("确定", null)
 9                  .setNegativeButton("取消", null).show();
10         }
DialogActivity.java

感悟

     学习了制作对话框,才发现其实对话框的制作也是非常简单的,一般情况下只需设置对话框的标题、信息、图标、按钮即可,有的时候还需要添加文本框、单选按钮、复选框、列表项。然而比较复杂的情况就是自定义对话框。在设置自定义对话框的时候,需要设计一个你的xml文件,里面是你的自定义布局,然后通过,主窗体调用xml来实现自定义对话框的制作。

 

  5、ProgressDialog

先看效果:

布局文件:

<?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">  
    
    <Button android:text="圆形进度条" android:id="@+id/Button01"  
        android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>  
    <Button android:text="长型进度条" android:id="@+id/Button02"  
        android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>  
  
</LinearLayout>  
View Code

代码:

package com.example.helloandroid;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class ProgressDialogActivity extends Activity {

    private ProgressDialog mpDialog;  
    private Button btn1,btn2;  
    private int mCount = 0;  

    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_progress_dialog);
        
         //得到按钮对象 
        btn1 = (Button)findViewById(R.id.Button01); 
        btn2 = (Button)findViewById(R.id.Button02); 
        btn1.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                mpDialog = new ProgressDialog(ProgressDialogActivity.this);  
                mpDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);//设置风格为圆形进度条  
                mpDialog.setTitle("提示");//设置标题  
                mpDialog.setIcon(R.drawable.clock);//设置图标  
                mpDialog.setMessage("这是一个圆形进度条");  
                mpDialog.setIndeterminate(false);//设置进度条是否为不明确  
                mpDialog.setCancelable(true);//设置进度条是否可以按退回键取消  
                mpDialog.setButton("确定", new DialogInterface.OnClickListener(){  
                        @Override  
                         public void onClick(DialogInterface dialog, int which) {  
                                dialog.cancel();  
                                          
                                }  
                                      
                          });  
                mpDialog.show();  
            }
            
        });


        //设置mButton02的事件监听 

        btn2.setOnClickListener(new Button.OnClickListener() { 
                     @Override 
                     public void onClick(View v) 
                     { 
                         // TODO Auto-generated method stub 
                         mCount = 0; 
                         // 创建ProgressDialog对象 
                         mpDialog = new ProgressDialog(ProgressDialogActivity.this); 
                         // 设置进度条风格,风格为长形 
                         mpDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
                         // 设置ProgressDialog 标题 
                         mpDialog.setTitle("提示"); 
                         // 设置ProgressDialog 提示信息 
                         mpDialog.setMessage("这是一个长形对话框进度条"); 
                         // 设置ProgressDialog 标题图标 
                         mpDialog.setIcon(R.drawable.camera); 
                         // 设置ProgressDialog 进度条进度 
                         mpDialog.setProgress(100); 

                         // 设置ProgressDialog 的进度条是否不明确 

                         mpDialog.setIndeterminate(false); 

                         // 设置ProgressDialog 是否可以按退回按键取消 

                         mpDialog.setCancelable(true); 

                         // 让ProgressDialog显示 

                         mpDialog.show(); 

                         new Thread() 

                         { 
                             public void run() 
                             { 
                                 try 
                                 { 
                                     while (mCount <= 100) 
                                     { 
                                         // 由线程来控制进度。 
                                         mpDialog.setProgress(mCount++); 
                                         Thread.sleep(100); 
                                     } 
                                     mpDialog.cancel(); 
                                 } 
                                 catch (InterruptedException e) 
                                 { 
                                     mpDialog.cancel(); 
                                 } 

                             } 

                         }.start(); 

                     } 

                 }); 

        
    }
}
View Code

6、Menu

 Android的菜单有三种:
Options Menu
  当用户按下menu button按钮时显示的菜单
Context Menu
  当用户长久按住屏幕,即被注册显示上下文菜单的视图时显示的菜单
Submenu
  当用户按下一个菜单的某个选项时弹出的子菜单

Options Menu创建选项菜单的步骤:

1、覆盖Activity 的onCreateOptionMenu(Menu menu)方法,当菜单第一次被打开时调用

2、调用Menu 的add( )方法添加菜单项(MenuItem),同时可以调用MenuItem 的setIcon( )方法来为菜单项设置图标

3、当菜单项(MenuItem)被选择时,覆盖Activity 的onOptionsItemSelected(MenuItem item)来响应事件

 

 

Context Menu顾名思义,与上下文(环境)有关。思想类似于Windows中的右键单击弹出的快捷菜单。操作时需要长时间按住某个东东不放。

创建上下文菜单的步骤:

1、覆盖Activity 的onCreateContextMenu(Menu menu)方法,调用Menu的add()方法添加菜单项(MenuItem)。

2、覆盖Activity 的onContextItemSelected(MenuItem iitem)来响应事件。

3、调用registerForContextMenu( )方法来为视图注册上下文菜单。

布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

<Button
        android:id="@+id/ContextButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="20"
        android:text="按我弹出Context Menu" />

</RelativeLayout>
View Code

代码:

package com.example.helloandroid;

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.SubMenu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MenuActivity extends Activity {

    private Button btnContext;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);
        
        btnContext = (Button) findViewById(R.id.ContextButton);
        registerForContextMenu(btnContext);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // TODO Auto-generated method stub
        //当用户按下menu button按钮时显示的菜单 
        menu.add(0, 1, 1, "香蕉");
        menu.add(0, 2, 2, "苹果");
        //当用户按下一个菜单的某个选项时弹出的子菜单
        SubMenu subMenu = menu.addSubMenu(1, 100, 100, "桃子");
        subMenu.add(2, 101, 101, "大桃子");
        subMenu.add(2, 102, 102, "小桃子");

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // TODO Auto-generated method stub
        if(item.getItemId() == 1){
            Toast t = Toast.makeText(this, "你选的是苹果", Toast.LENGTH_LONG);
            t.show();
        }
        else if(item.getItemId() == 2){
            Toast t = Toast.makeText(this, "你选的是香蕉", Toast.LENGTH_SHORT);
            t.show();
        } 
        return true;

    }
    //Context Menu
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        // TODO Auto-generated method stub
        if(v==btnContext){
            menu.setHeaderTitle("这是1");
            menu.add(200, 200, 200, "Context Menu 1");
            menu.add(200, 201, 201, "Context Menu 2");
        }
        super.onCreateContextMenu(menu, v, menuInfo);
    }
    
    
}
View Code


效果图:

 

7、AutoCompleteTextView

 自动完成文本框,它实际上也是一个文本编辑框,可以理解为对EditText功能的扩展,它对输入的内容可以进行提示并且自动完成。本文会讲解常用属性设置,以及如何向AutoCompleteTextView增加提示数据.

说明

  自动完成文本框(AutoCompleteTextView),可以从官方文档上看出,是从EditText继承而来,所以它实际上也是一个文本编辑框,只是多了一个自动提示输入补全的功能。功能类似于:当用户输入一定字符之后,自动完成文本框会显示一个下拉列表,供用户从中选择,当用户选择某个菜单项之后,AutoCompleteTextView会按照的选择自动填写该文本框。

 

常用属性

  因为是继承自EditText,所以AutoCompleteTextView除了可以使提供用Edit的属性和方法之外,还支持如下一些特殊的属性及方法,这里只介绍一些常用的,具体请参见官方文档:

  • android:completionHint/setCompletionHint(CharSequence):设置出现下拉列表的提示标题。
  • android:completionTjreshold/setThreshold(int):设置至少输入几个字符才会显示提示。
  • android:dropDownHeight/setDropHeight(int):设置下拉列表的高度。
  • android:dropDownWidth/setDropWidth(int):设置下拉列表的宽度。
  • android:popupBackground/setDropDownbackgroundResource(int):设置下拉列表的背景。

 

填充选择数据

  在Android程序中,为了展示数据,通常会用到一个Adapter的接口。没错,这是一个接口,是连接后端数据和前端显示的桥梁,是data souce和UI(View)之间一个重要的纽带。下图展示了Adapter在Android程序中的关系:

对于Adapter,它是一个接口,Android为其声明了各种实现类,对于在AutoCompleteTextView控件中,一般使用ArrayAdapter<T>即可完成功能,对于一些其他实现类的应用场景,以后会慢慢介绍。

  ArrayAdapter<T>继承自一个抽象类BaseAdapter,而这个抽象类实现了Adapter接口,所以继承关系应该是:Adapter→BaseAdater→ArrayAdapter<T>。

  从名字上可以看出,ArrayAdapter<T>是以一个数组的形式去存储数据的,它也确实是这么做的,并且可以传递一个数组对其进行构造。所以我们只需要填充一个数组对象,就完成ArrayAdapter对象的初始化工作,在把得到的ArrayAdapter对象传递给AutoCompleteTextView控件,即可对其进行选择数据设置。

布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <AutoCompleteTextView
         android:id="@+id/autotext"
         android:completionHint="Famous Citi"
         android:completionThreshold="1"
         android:layout_width="match_parent"
         android:layout_height="wrap_content" />


</RelativeLayout>
View Code

代码:

package com.example.helloandroid;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;

public class AutoCompleteTextViewActivity extends Activity {
    private AutoCompleteTextView autotext;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_auto_complete_text_view);
        
        autotext=(AutoCompleteTextView)findViewById(R.id.autotext);
        //设置数据源
        String[] autoStrings=new String[]{"New York","Tokyo","beijing","london","Seoul Special","Los Angeles"};
        //设置ArrayAdapter,并且设定以单行下拉列表风格展示(第二个参数设定)。
        ArrayAdapter<String> adapter=new ArrayAdapter<String>(AutoCompleteTextViewActivity.this, 
         android.R.layout.simple_dropdown_item_1line, autoStrings);
        
        autotext.setAdapter(adapter);



    }
}
View Code

 

8、SeekBar

拖动条(SeekBar)和进度条非常相似,只是进度条采用颜色填充来表明进度完成的程度,而拖动条则通过滑块的位置来标识数值----而且拖动条允许用户拖动滑动块来改变值,因此拖动条通常用于对系统的某种数值进行调节,比如音量调节。

SeekBar允许用户改变拖动条的滑块外观,改变滑块外观通过如下属性来指定

android:thumb  指定一个Drawable对象,该对象将作为自定义滑块。

为了让程序能响应拖动条滑块位置的改变,程序可以考虑为他绑定一个OnSeekBarChangerListener监听器。

通过一个实例:通过滑动块来改变图片的透明度,来看看SeekBar。

布局XML:

<?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"
    >
<ImageView 
    android:id="@+id/image"
    android:layout_width="fill_parent" 
    android:layout_height="240px" 
    android:src="@drawable/world"
    />
<SeekBar 
    android:id="@+id/seekbar"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:max="255"
    android:progress="255"
    android:thumb="@drawable/ic_launcher"
    />
</LinearLayout>
View Code

代码:

package com.example.helloandroid;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;

public class SeekBarActivity extends Activity {
    private ImageView  image;
    private SeekBar seekBar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_seek_bar);
        
        image = (ImageView)this.findViewById(R.id.image);
        seekBar = (SeekBar)this.findViewById(R.id.seekbar);
        
        seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
            
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            }
            
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }
            
            //当拖动条的滑块位置发生改变时触发该方法
            @Override
            public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
                image.setAlpha(arg1);
            }
        });
    }
}
View Code

效果如下:

 

posted @ 2014-12-25 14:36  自助者天助  阅读(1056)  评论(0编辑  收藏  举报