第十三章:常用控件下

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;

}
}

上面代码使用了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>

实现代码:

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;

}

}

使用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>

代码:

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

}

});

}
}

  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>

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>

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;
}

}

 

  4、Dialog

 

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

 

图1

图2

图3

图4

图5

图6

图7

图8

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<Button
android:id="@+id/But_One"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="20"
android:text="1" />
<Button
android:id="@+id/But_Two"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="20"
android:text="2" />
<Button
android:id="@+id/But_Three"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="20"
android:text="3" />
<Button
android:id="@+id/But_Four"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="20"
android:text="4" />
<Button
android:id="@+id/But_Five"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="20"
android:text="5" />
<Button
android:id="@+id/But_Six"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="20"
android:text="6" />
<Button
android:id="@+id/But_Seven"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="20"
android:text="7" />
</LinearLayout>


main.xml

package zqvie.com;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class DialogActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
But_One=(Button) findViewById(R.id.But_One); //注册按钮But_One
But_Two=(Button) findViewById(R.id.But_Two);
But_Three=(Button) findViewById(R.id.But_Three);
But_Four=(Button) findViewById(R.id.But_Four);
But_Five=(Button) findViewById(R.id.But_Five);
But_Six=(Button) findViewById(R.id.But_Six);
But_Seven=(Button) findViewById(R.id.But_Seven);
But_One.setOnClickListener(this); //为按钮But_One注册侦听器
}
Button But_One,But_Two,But_Three,But_Four,But_Five,But_Six,But_Seven; //定义按钮
}

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如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:background="#ffffffff" android:orientation="horizontal"
android:id="@+id/mydialog">
<TextView android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/tvname" android:text="姓名:" />
<EditText android:layout_height="wrap_content"
android:layout_width="wrap_content" android:id="@+id/etname" android:minWidth="100dip"/>

</LinearLayout>

dialog.xml

if(v.getId()==R.id.But_Seven)
{
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.mydialog,
null);

new AlertDialog.Builder(this).setTitle("自定义布局").setView(layout)
.setPositiveButton("确定", null)
.setNegativeButton("取消", null).show();
}

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>

代码:

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();

}

});


}
}

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>

代码:

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);
}


}


效果图:

 

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>

代码:

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);

 

}
}

 

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>

代码:

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);
}
});
}
}

效果如下:

 

posted @ 2016-06-15 17:02  《从容面对》  阅读(136)  评论(0)    收藏  举报