Android基本控件高级
ListView ArrayAdapter和SimpleAdapter
ListView中的setAdapter() 方法 ListView通过适配器来显示内容的,适配器有两种 一种是ArrayAdapter 另一种是SimpleAdapter
ArrayAdapter是解析一个数组,叫这个数组呈现出ListView效果,注意最后用setConnentView方法将这ListView加入到手机界面进行显示,而Activity本身不用set ConnentView加载本来的main.xml 文件
SimpleAdapter是解析一个List中含有map的集合,这个结构相比一个数组复杂的多,SimpleAdapter解析这个复杂的结构会叫我们可以给客户呈现结构更完美的ListView。
四种Adapter
ArrayAdapter 简单的文字列表
simpleAdapter 自己定义一个丰富的列表
SimpleCursorAdapter可以从数据库中读取数据加到列表上
BaseAdapter可以在列表上加处理事件
实例一:使用ArrayAdapter 作为Listview 适配
MainActivity
package com.example.gdlistviewarrayadapter;
public class MainActivity extends Activity {
private ListView listview;
private String data[] ={"周杰伦","佟大为","李小双","文章","范冰冰"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
listview=new ListView(this);
// 实例化ListView组件
listview.setAdapter(
new ArrayAdapter<String>
(this, android.R.layout.simple_list_item_1, this.data));
/*
* android.R.layout.simple_list_item_1 是调用系统提供的Id
* **/
this.setContentView(listview);
//设置这个布局
}
}
实例二 SimpleAdapter与List<Map<String ,String >>
MainActivity代码
package com.example.gdlistviewarrayadapter;
public class MainActivity extends Activity {
private ListView listview;
private String data[][] ={{"姓名","周杰伦"},{"姓名","郭庆雨"}};
private SimpleAdapter sip;
private List<Map<String ,String>> list = new ArrayList<Map<String,String>>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_main);
listview=(ListView)findViewById(R.id.list);
for(int i=0;i<data.length;i++){
Map<String ,String > map= new HashMap<String, String>();
map.put("A", data[i][0]);
map.put("B", data[i][1]);
/*
* map 里面的Key值是随意定义的 只要是和下面的
* new SimpleAdapter(this,
* list, R.layout.datalist,
* new String[] {"A","B"}, new int[]{R.id._id,R.id.name});
* 中的 new String[]{}数组里面的数据一样就好
* **/
list.add(map);
}
sip=
new SimpleAdapter(this,
list,
R.layout.datalist, //把模板布局夹到SimpleAdapter中去
new String[] {"A","B"}, new int[]{R.id._id,R.id.name});
/*
* new SimpleAdapter(this,
* list, R.layout.datalist,
* new String[] {"A","B"}, new int[]{R.id._id,R.id.name});
*中的new String[]{"A","B"}和 new int []{R.id._id,R.id.name} 是把 我们的Map中
*那个key值与我们模板(datalist.xml)布局(layout)中相应的组件布局一一对应
* **/
listview.setAdapter(this.sip);
/*new SimpleAdapter(this,
* list, R.layout.datalist,
* new String[] {"A","B"}, new int[]{R.id._id,R.id.name});
*中的 R.layout.datalist, 是把模板布局加到SimpleAdapter中去
* listview.setAdapter(this.sip)是把SimpleAdapter添加到ListView 中去
* ListView 又在显示布局(main.xml)中这样模板布局(layout)datalist.xml也同时
* 被加到显示布局main.xml中去
* **/
}
}
activity_main.xml代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- 本布局用于显示布局 -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="listView"
/>
<!-- 用于显示题目 -->
<ListView
android:id="@+id/list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<!-- 本ListView用于加载模板布局datalist.xml -->
</LinearLayout>
datalist.xml 代码
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<!-- 注意 用于模板的Layout的高度不能设置沾满整个全屏
如果沾满了用于显示的Layout将不起作用 -->
<TableRow >
<TextView
android:id="@+id/_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</TableRow>
</TableLayout>
ListActivity
对话框Dialog和Dialog.Builder
Dialog extends Object的子类AlertDialog和CharacterPickerDialog
AlertDialog extends Dialog的子类DataPickerDialog,ProgressDialog和TimePickerDialog
AlertDialog.Builder不是AlertDialog的子类而是AlertDialog的嵌套类,
Public void class AlertDialog extends Dialog{
Pubic static class AlertDialog.Builder extends Object{
}
}
在图形界面中,对话框也是人机交互的一种重要形式,程序可以通话对话框对用户进行一些信息的提示
,而用户也可以通过对话框和程序进行一些简单的交互操作,Dialog 可以有一个按钮或是多个按钮或是列表选项,进行人家交互。
在android的开发中,所有的对话框都是从android.app.Dialog 类继承而来,此类的继承机构如下
Java.Long.Object
Android.app.Dialog
可以看出,此类直接继承自Object类,与View类没有任何继承关系。
但是如果要想实例化,AlertDialog类,往往要依靠其内部类,AlertDialog.Builder完成,在AlertDialog.Builder
类中定义的常用方法如下表
Dialog类定义的常用方法
NO | 方 法 | 类 型 | 描 述 |
1 | Public void setTitle(CharSequence title) | 普通 | 设置对话框的显示标题 |
2 | Public void setTitle(int title Id) | 普通 | 设置对话框的显示标题,内容为资源文件指定 |
3 | Public void show() | 普通 | 显示对话框 |
4 | Public void hide() | 普通 | 隐藏对话框 |
5 | Public Boolean isShowing() | 普通 | 判断对话框是否显示 |
6 | Public void setContentView() | 普通 | 设置View组件 |
7 | Public void dismiss() | 普通 | 隐藏对话框 |
8 | |||
9 | |||
10 |
AlertDialog.Builder
NO | 方 法 | 类型 | 描述 |
1 | Public AlertDialog.Buider(Context context) | 构造 | 创建AlertDialog.Builder对象 |
2 | Public AlertDialog.Builder setPositiveButton(int textId,DialogInterFace.OnClickListener listener) | 普通 | 为对话框添加一个确定按钮,显示内容有资源文件制定,并设置监听操作 |
3 | Public AlertDialog.Builder setNegativeButton(CharSequence text,DialogInterface.OnClickListener listener) | 普通 | 为对话框设置一个取消按钮,显示内容有资源文件制定,并设置监听操作 |
4 | Public AlertDialog.Builder set NeutralButton(CharSequence text,DialogInterface.OnclickListener listener) | 普通 | 为对话框设置一个普通按钮 ,并设置监听 |
5 | Public AlertDialog.Builder setMessage( int messageId) | 普通 | 设置显示信息(内容由资源ID引用) |
6 | Public AlertDialog.Builder setMessage(CharSequence) | 普通 | 设置显示信息(内容由字符串直接组成) |
7 | Public AlertDialog.Builder setItems( Int textId,DialogInterface.OnClickListener listener ) | 普通 | 将信息内容设置为列表项,列表项的内容由 String数组组成, 同时设置监听 |
8 | Public AlertDialog.Builder setItems( CharSequence[] items,DialogInterface.OnClickListener listener ) | 普通 | 将信息设置为列表项,列表项由资源文件制定,同时设置监听 |
9 | Public AlertDialog create() | 普通 | 创建AlertDialog的实例 |
10 | Public AlertDialog setIcon(Drawable icon) | 普通 | 设置显示图标 |
11 | Public AlertDialog setIcon(int iconId) | 普通 | 设置要显示的图标的资源ID |
案例一 :简单对话框提示信息
Activity_main.xml
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="104dp"
android:layout_marginTop="146dp"
android:text="Button" />
</RelativeLayout>
MainActivity
package com.example.alertdialogdemo;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private Button text=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text=(Button)findViewById(R.id.text);
text.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("对话框");
builder.setMessage("显示提示信息");
builder.setIcon(R.drawable.ic_launcher);
AlertDialog alertDialog= builder.create();
alertDialog.show();
}
});
}
}
案例二:Dialog对话框上的按钮Button以及监听Listener
对话框Dialog可以设置按钮以及一些监听 来提示用户是否要退出程序,隐藏对话框,取消对话框,以及加上一些列表选项
NO | 接 口 名 称 | 描 述 |
1 | DialogInterface.OnClickListener | 对话框单击事件处理 |
2 | DialogInterface.OnCancelListener | 对话框取消事件处理 |
3 | DialogInterface.OnDismissListener | 对话框隐藏事件处理 |
4 | DialogInterface.OnkeyListener | 对话框键盘事件处理 |
5 | DialogInterface.OnMultiChoiceClickListener | 对话框多选事件处理 |
6 | DialogInter.OnShowListener | 对话框显示事件处理 |
Activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
MainActivity
package com.example.alertdialogdemo;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.content.DialogInterface;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private Button text=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text=(Button)findViewById(R.id.text);
text.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("对话框");
builder.setMessage("显示提示信息");
builder.setIcon(R.drawable.ic_launcher);
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
//添加一个确定按钮
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
MainActivity.this.finish();
//结束Activity
}
} );
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
// 设置取消按钮
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
});
builder.setNeutralButton("普通按钮",new DialogInterface.OnClickListener() {
//设置普通按钮
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
});
AlertDialog alertDialog= builder.create();
alertDialog.show();
}
});
}
}
案例三:Dialog对话框上的按钮Button以及Listener二
Activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/but"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击" />
</LinearLayout>
MainActivity
package com.example.dialoglinstenerdemo;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private Button but=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
but=(Button)findViewById(R.id.but);
but.setOnClickListener(new DialogListener());
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode==event.KEYCODE_BACK){
MainActivity.this.exitDialog();
}
return false;
}
class DialogListener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
MainActivity.this.exitDialog();
}
}
private void exitDialog(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("程序退出");
builder.setMessage("你确定退出么?");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
MainActivity.this.finish();
}
});
builder.setNegativeButton(R.string.negative,newDialogInterface.OnClickListener() {
//此处引用String.xml文件下的R.string.negative的id
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
});
builder.setNeutralButton("查看详情", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
}) ;
AlertDialog alertDialog = builder.create();
alertDialog.show();
}
}
String.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Dialog案例</string>
<string name="action_settings">Settings</string>
<string name="negative">取消</string>
</resources>
案例四:Dialog列表选项setItems()
Activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FF00FF"
/>
<Button
android:id="@+id/onlick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击" />
</LinearLayout>
MainActivity
package com.example.dialogitemdemo;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.view.View;
import android.view.View.OnClickListener;
public class MainActivity extends Activity {
private Button but;
private TextView show;
private String [] args= {"北京","上海","南京"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show=(TextView)findViewById(R.id.show);
but=(Button)findViewById(R.id.onlick);
but.setOnClickListener(new DialogSetItemOnClicklistener());
}
class DialogSetItemOnClicklistener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("你喜欢的城市");
builder.setItems(args, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
MainActivity.this.show.setText("你喜欢的城市是:"+MainActivity.this.args[which]);
}
});
AlertDialog alert= builder.create();
alert.show();
}
}
}
案例五:Dialog列表选项setItems()数据用资源文件配置
Activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FF00FF"
/>
<Button
android:id="@+id/onlick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击" />
</LinearLayout>
MainActivity
package com.example.dialogitemdemo;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
private Button but;
private TextView show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show=(TextView)findViewById(R.id.show);
but=(Button)findViewById(R.id.onlick);
but.setOnClickListener(new DialogSetItemOnClicklistener());
}
class DialogSetItemOnClicklistener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("你喜欢的城市");
builder.setItems(R.array.city, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
MainActivity.this.show.setText("你喜欢的城市是:"+
MainActivity.this.getResources().
getStringArray(R.array.city)[which]);
//获得资源文件下的StringArray中的R.array.city中的哪一个选项
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}});
AlertDialog alert= builder.create();
alert.show();
}}}
Res/values/city.xml
<resources>
<string-array name="city" >
<item >广州</item>
<item >深圳</item>
<item >香港</item>
<item >澳门</item>
<item >台湾</item>
</string-array>
</resources>
案例六 :使用单选框setSingleChoiceItems定义对话框内容
MainActivity
package com.example.dialogsetsinglechoiceitems;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
private Button mybut;
private TextView show;
private String [] fruitData ={"苹果","香蕉","西瓜"};
private int chNum=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mybut=(Button)findViewById(R.id.mybut);
show=(TextView)findViewById(R.id.show);
mybut.setOnClickListener(new SetSingleChoice());
}
class SetSingleChoice implements OnClickListener{
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("选择你喜欢的水果");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
MainActivity.this.show.setText("你喜欢的水果是:"+MainActivity.this.fruitData[chNum]);
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
});
builder.setSingleChoiceItems(MainActivity.this.fruitData, 0, new DialogInterface.OnClickListener() {
/*
* setSingleChoiceItems(
* MainActivity.this.fruitData,-------> 选项数据源 可以通过配置获得
* 0,------------> 默认选中项位置
*new DialogInterface.OnClickListener()---> 选项的监听
* )
* **/ @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
MainActivity.this.show.setText(MainActivity.this.fruitData[which]);
MainActivity.this.chNum=which;
//修改选中选
}
});
AlertDialog alertDialog= builder.create();
alertDialog.show();
}
}
}
Activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="" />
<Button
android:id="@+id/mybut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="选择你喜欢的水果" />
</LinearLayout>
案例七 :使用复选框setMultiChoiceItems定义对话框内容
MainActivity
package com.example.alertdialogsetmultichoiceiteme;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
private Button but;
private TextView show;
private String [] args={"大学","中庸","论语"};
private boolean chdata[]= new boolean[]{true,true,true};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show=(TextView)findViewById(R.id.show);
but=(Button)findViewById(R.id.but);
but.setOnClickListener(new DialogMultiChoicIteme());
}
class DialogMultiChoicIteme implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("你喜欢的书籍");
builder.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
MainActivity.this.show.append(MainActivity.this.args[0]+","
+MainActivity.this.args[1]+","+
MainActivity.this.args[2]
);
}
});
builder.setNegativeButton("取消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
});
builder.setMultiChoiceItems(
MainActivity.this.args,
MainActivity.this.chdata ,
new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which,
boolean isChecked) {
// TODO Auto-generated method stub
for (int i = 0; i < MainActivity.this.args.length; i++) {
if(i==which&&isChecked){
MainActivity.this.show.append(MainActivity.this.args[i]+",");
}
}
}
});
AlertDialog alertDialog= builder.create();
alertDialog.show();
}
}
}
Activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="" />
<Button
android:id="@+id/but"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="选择你喜欢的数据" />
</LinearLayout>