Dialog Menu Toast以及Notification
一、Dialog对话框:
(一)、分类:
- AlertDialog 警告对话框(提示对话框)
- ProgressDialog 进度对话框
- DatePickerDialog 日期选择对话框
- TimerPickerDialog 时间选择对话框
- 自定义对话框(登录对话框、关于对话框)
- 列表对话框
- 普通列表对话框
- 单选列表对话框
- 多选列表对话框
- 带图标的列表对话框
(二)、AlertDialog ——简单对话框:
1、类结构:
java.lang.Object
↳ android.app.Dialog
↳ android.app.AlertDialog
2、创建AlertDialog对话框的步骤:
- 创建AlertDialog.Builder对象,该对象能创建AlertDialog;
- 调用Builder对象的方法设置图标、标题、内容、按钮等;
- setTitle():为对话框设置标题
- setIcon ():设置图标
- setMessage ():设置要显示的信息
- setNegativeButton ():设置取消按钮
- setPositiveButton ():设置确定按钮
- setNeutralButton ():设置中立按钮
- 调用Builder对象的create()方法创建AlertDialog对话框;
- 调用AlertDialog的show()方法来显示对话框。
3、核心代码:
Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("提示");
builder.setMessage("确认退出吗?");
builder.setPositiveButton("确认", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
text_main_info.setText("您点击了:" + which);
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
text_main_info.setText("您点击了:" + which);
}
});
builder.setNeutralButton("中立", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
text_main_info.setText("您点击了:" + which);
}
});
builder.create().show();
(三)、AlertDialog——列表对话框:
1、类结构:
java.lang.Object
↳ android.app.Dialog
↳ android.app.AlertDialog
2、创建列表AlertDialog对话框的步骤:
- 创建AlertDialog.Builder对象,该对象能创建AlertDialog;
- 调用Builder对象的方法设置图标、标题、内容、按钮等;
- setTitle():为对话框设置标题
- setIcon ():设置图标
- setMessage ():设置要显示的信息
- setNegativeButton ():设置取消按钮
- setPositiveButton ():设置确定按钮
- setNeutralButton ():设置中立按钮
- setItems ():为对话框添加列表项
- setSingleChoiceItems ():为对话框添加单选列表项
- setMultiChoiceItems ():为对话框添加多选列表项
- setAdapter ():为对话框添加带图标的列表项
- 调用Builder对象的create()方法创建AlertDialog对话框;
- 调用AlertDialog的show()方法来显示对话框。
3、核心代码:
【备注:使用setItems ()、setSingleChoiceItems ()、setMultiChoiceItems ()
、setAdapter()能得到不同的结果。】
//A. 普通列表
button_main_simpleListDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("请选择颜色:");
final String[] arrColor = new String[] { "红色", "绿色","蓝色" };
// 往对话框中放置普通列表
builder.setItems(arrColor, new OnClickListener() {
// 以下代码是模拟:勾选选项后,文字颜色和文本框背景颜色相应发生改变
@Override
public void onClick(DialogInterface dialog , int which) {
text_main_info.setText(arrColor[which]);
switch (which) {
case 0:
text_main_info.setBackgroundColor(Color.RED);
break;
case 1:
text_main_info.setBackgroundColor(Color.GREEN);
break;
case 2:
text_main_info.setBackgroundColor(Color.BLUE);
break;
default:
break;
}
}
});
builder.show();
}
});
//B. 单选列表
button_main_singleListDialog
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("请选择颜色:");
final String[] arrColor = new String[] { "红色", "绿色","蓝色" };
// 往对话框中放置单选列表
builder.setSingleChoiceItems(arrColor, 0,
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {
position = which;//通过这个监听器获取到点击的是第几个
}
});
builder.setPositiveButton("确认", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {
text_main_info.setText(arrColor[position]);
switch (position) {
case 0:
text_main_info.setBackgroundColor(Color.RED);
break;
case 1:
text_main_info.setBackgroundColor(Color.GREEN);
break;
case 2:
text_main_info.setBackgroundColor(Color.BLUE);
break;
default:
break;
}
}
});
builder.show();
}
});
//C. 多选列表
button_main_multiListDialog
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("请选择颜色:");
final String[] hobbyArr = new String[] { "看书", "学习","饮食", "爬山", "绘画" };
// 将多选项中每次勾选的结果放到一个pos数组中。
pos = new boolean[hobbyArr.length];
// 往对话框中放置多选列表
builder.setMultiChoiceItems(hobbyArr, null,
new OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog,int which, boolean isChecked) {
pos[which] = isChecked;//将每一项被勾选的状态放到一个boolean型的数组中
}
});
// 多选列表项必须要使用确认按钮才能最终获得所有勾选的数据。
builder.setPositiveButton("确认", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {
// 将所有的勾选项放到一个字符串中
StringBuilder sb = new StringBuilder();
for (int i = 0; i < pos.length; i++) {
if (pos[i]) {
sb.append(hobbyArr[i]);
sb.append("、");
}
}
text_main_info.setText("您勾选了:" + sb.toString());
}
});
builder.show();
}
});
//D. 带图标的列表dialog
button_main_adapterListDialog
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("手机设置:");
// 定义数据源。以下是模拟数据。真实工作中,有可能是从网络上获取数据,也有可能是从xml配置文件中获取数据。
// 考虑到后期维护,很少在java文件中以定义数组的形式作为适配器的数据来源。
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (int i = 0; i < settingArr.length; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("settingType", settingArr[i]);
map.put("imageId", imageId[i]);
list.add(map);
}
// 使用SimpleAdapter将数据源和自定义布局文件结合到一起。
SimpleAdapter adapter = new SimpleAdapter(
MainActivity.this, list, R.layout.item_dialog,
new String[] { "settingType", "imageId" },
new int[] { R.id.text_item_dialog,
R.id.imageView_item_dialog });
// 调用builder的setAdapter()方法将适配器加载到对话框中。
builder.setAdapter(adapter, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {
text_main_info.setText("您选择设置:" + settingArr[which]);
}
});
// 显示对话框
builder.show();
}
});
(四)、AlertDialog——自定义对话框:
1、类结构:
java.lang.Object
↳ android.app.Dialog
↳ android.app.AlertDialog
2、创建自定义AlertDialog对话框的步骤:
- 创建AlertDialog.Builder对象,该对象能创建AlertDialog;
- 调用Builder对象的方法设置图标、标题、内容、按钮等;
- setTitle():为对话框设置标题
- setIcon ():设置图标
- setMessage ():设置要显示的信息
- setNegativeButton ():设置取消按钮
- setPositiveButton ():设置确定按钮
- setNeutralButton ():设置中立按钮
- 自定义布局文件;
- 使用LayoutInflater 的 inflater()方法填充自定义的布局文件,返回view对象。用该对象的findViewById()方法加载自定义布局上所有控件;
- 调用Builder对象的setView()方法加载view对象;
- 调用Builder对象的create()方法创建AlertDialog对话框;
- 调用AlertDialog的show()方法来显示对话框。
3、核心代码:本示例代码中写了一个显示登录窗口的登录框。
【备注:】采用LayoutInflater去填充布局,返回view对象。
View view = null;
Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("管理员登录:");
LayoutInflater mInflater = LayoutInflater.from(MainActivity.this);
view = mInflater.inflate(R.layout.loginform_main, null);
final EditText edit_loginform_username = (EditText) view
.findViewById(R.id.edit_loginform_username);
final EditText edit_loginform_password = (EditText) view
.findViewById(R.id.edit_loginform_password);
builder.setView(view);
builder.setPositiveButton("登录", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String username = edit_loginform_username.getText()
.toString().trim();
String password = edit_loginform_password.getText()
.toString().trim();
if (username.length() < 1 || password.length() < 1) {
text_main_info.setText("用户名或密码不可以为空!");
} else {
StringBuilder sb = new StringBuilder();
sb.append("您的登录信息:");
sb.append("用户名:");
sb.append(username);
sb.append("密码:");
sb.append(password);
text_main_info.setText(sb.toString());
}
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//此处进行异步任务访问网络等处理。
}
});
builder.create().show();
(五)、ProgressDialog——进度对话框:
1、类结构:
java.lang.Object
↳ android.app.Dialog
↳ android.app.AlertDialog
↳ android.app.ProgressDialog
2、创建 ProgressDialog 对话框的步骤:
- 实例化ProgressDialog,创建出ProgressDialog对象;
- 调用该对象的方法设置图标、标题、内容、按钮等;
-
- setTitle():为对话框设置标题
- setIcon ():设置图标
- setMessage ():设置要显示的信息
- 调用 ProgressDialog 对象的show()方法显示出 ProgressDialog 对话框。
3、核心代码:
ProgressDialog pDialog = new ProgressDialog(MainActivity.this);
pDialog.setTitle("提示:");
pDialog.setMessage("数据加载中。。。");
pDialog.show();
(六)、DatePickerDialog——日期选择对话框:
1、类结构:
java.lang.Object
↳ android.app.Dialog
↳ android.app.AlertDialog
↳ android.app.DatePickerDialog
2、创建 DatePickerDialog 对话框的步骤:
- 实例化 DatePickerDialog ,创建出 DatePickerDialog 对象;
- 调用 DatePickerDialog 对象的show()方法显示出 DatePickerDialog 对话框;
- 绑定监听器:OnDateSetListener().
3、核心代码:
二、Menu:
(一)、简介:
1、Android应用中的菜单默认是隐藏的,只有当用户点击手机上的MENU键,系统才会显示菜单。这种菜单叫做选项菜单(Option Menu)。
2、从3.0开始,Android不要求手机设备上必须提供MENU按键。因此Android推荐使用ActionBar来代替Menu。
(二)、创建菜单:(Android提供了两种创建菜单的方式)
1、在java代码创建菜单;
2、使用xml资源文件创建菜单(res/menu目录下)。建议使用后者。
(三)、XML资源文件中定义菜单:
1、普通菜单:
<item
android:id="@+id/menu_about"
android:orderInCategory="2"
android:showAsAction="never"
android:title="关于"/>
2、二级普通菜单:
<item
android:id="@+id/menu_group2"
android:orderInCategory="1"
android:showAsAction="never"
android:title="文字颜色">
<menu >
<group>
<item android:id="@+id/font_red" android:title="red" />
<item android:id="@+id/font_green" android:title="green"></item>
<item android:id="@+id/font_blue" android:title="blue"></item>
<item android:id="@+id/font_yellow" android:title="yellow"></item>
</group>
</menu>
</item>
3、二级可选项菜单:
<item
android:id="@+id/menu_group1"
android:orderInCategory="1"
android:showAsAction="never"
android:title="文字尺寸">
<menu >
<!-- android:checkableBehavior 属性有三个可选值:all为多选,single为单选,none为不可选。为none时就是一个普通菜单 -->
<group android:checkableBehavior="single">
<item android:id="@+id/font_10" android:title="10sp"></item>
<item android:id="@+id/font_15" android:title="15sp"></item>
<item android:id="@+id/font_20" android:title="20sp"></item>
<item android:id="@+id/font_25" android:title="25sp"></item>
<item android:id="@+id/font_30" android:title="30sp"></item>
</group>
</menu>
</item>
(四)、菜单操作:
利用boolean onOptionsItemSelected(MenuItem item)回调方法。
核心代码如下:利用以上定义的xml菜单文件,实现通过菜单选项对文字的大小和颜色进行控制。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.font_20:
text_main_info.setTextSize(20);
break;
case R.id.font_30:
text_main_info.setTextSize(30);
break;
case R.id.font_red:
text_main_info.setTextColor(Color.RED);
break;
case R.id.font_green:
text_main_info.setTextColor(Color.GREEN);
break;
}
return super.onOptionsItemSelected(item);
}
三、ContextMenu:
(一)、上下文菜单介绍:上下文菜单继承自android.view.Menu。
1、上下文菜单与Options Menu最大的不同在于:
- Options Menu的拥有者是Activity,而上下文菜单的拥有者是Activity中的View;
- 每个Activity有且只有一个Options Menu,它为整个Activity服务。而一个Activity往往有多个View,哪个View需要上下文菜单就通过registerForContextMenu(View view)给这个View注册上下文菜单。
2、生成上下文菜单是通过Activity中的onCreateContextMenu()方法:
- onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo)方法很像生成Options Menu的onCreateOptionsMenu(Menu menu)方法;
- 两者的不同在于:onCreateOptionsMenu只在用户第一次按“Menu”键时被调用,而onCreateContextMenu会在用户每一次长按注册了上下文菜单的View时被调用。
3、ContextMenu工作原理图:
4、ContextMenuInfo 有什么用呢?
当视图元素需要向上下文菜单传递一些信息,比如该View对应DB记录的id等,这就要使用ContextMenuInfo。需要传递额外信息的View需要重写getContextMenuInfo()方法,返回一个带有数据的ContextMenuInfo实现类对象。
Additional information regarding the creation of the context menu. For example, AdapterViews use this to pass the exact item position within the adapter that
initiated the context menu.
ContextMenuInfo携带了注册上下文菜单控件的一些额外信息。一般用在AdaterViews(例如:Spinner 、ListView或GridView)上,
可以在ContextMenuInfo 中获取到适配器View中的position的信息。
(二)、开发上下文菜单的步骤:
1、重写onCreateContextMenu(ContextMenu
menu, View v,ContextMenuInfo menuInfo)方法;
2、调用Activity的registerForContextMenu(View view)方法为view组件注册上下文菜单;(注册上下文菜单后,意味着用户长按该控件后显示上下文菜单)。
3、为菜单项提供响应,重写onContextItemSelected(MenuItem item)。
2、调用Activity的registerForContextMenu(View view)方法为view组件注册上下文菜单;(注册上下文菜单后,意味着用户长按该控件后显示上下文菜单)。
3、为菜单项提供响应,重写onContextItemSelected(MenuItem item)。
(三)、示例代码:
private TextView text_main_info;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text_main_info = (TextView) findViewById(R.id.text_main_info);
this.registerForContextMenu(text_main_info);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.contextmenu_main, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.font_20:
text_main_info.setTextSize(20);
break;
case R.id.font_30:
text_main_info.setTextSize(30);
break;
case R.id.font_red:
text_main_info.setTextColor(Color.RED);
break;
case R.id.font_green:
text_main_info.setTextColor(Color.GREEN);
break;
}
return super.onContextItemSelected(item);
}
四、popmenu
弹出菜单
关键代码如下
五、Toast
(一)、普通的吐司
(二)、改变吐司的位置
(三)、自定义吐司
六、Notification 通知:
(一)、简介:
显示在手机状态栏的通知。Notification所代表的是一种具有全局效果的通知,程序一般通过NotificationManager服务来发送Notification。
Android3.0增加了Notification.Builder类,该类可以轻松地创建Notification对象。
Notification,俗称通知,是一种具有全局效果的通知,它展示在屏幕的顶端,首先会表现为一个图标的形式,当用户向下滑动的时候,展示出通知具体的内容。
【注意:】因为一些Android版本的兼容性问题,对于Notification而言,Android3.0是一个分水岭,在其之前构建Notification推荐使用Notification.Builder构建,而在Android3.0之后,一般推荐使用NotificationCompat.Builder构建。
通知一般通过NotificationManager服务来发送一个Notification对象来完成,NotificationManager是一个重要的系统级服务,该对象位于应用程序的框架层中,应用程序可以通过它像系统发送全局的通知。这个时候需要创建一个Notification对象,用于承载通知的内容。但是一般在实际使用过程中,一般不会直接构建Notification对象,而是使用它的一个内部类NotificationCompat.Builder来实例化一个对象(Android3.0之下使用Notification.Builder),并设置通知的各种属性,最后通过NotificationCompat.Builder.build()方法得到一个Notification对象。当获得这个对象之后,可以使用NotificationManager.notify()方法发送通知。
NotificationManager类是一个通知管理器类,这个对象是由系统维护的服务,是以单例模式获得,所以一般并不直接实例化这个对象。在Activity中,可以使用Activity.getSystemService(String)方法获取NotificationManager对象,Activity.getSystemService(String)方法可以通过Android系统级服务的句柄,返回对应的对象。在这里需要返回NotificationManager,所以直接传递Context.NOTIFICATION_SERVICE即可。
虽然通知中提供了各种属性的设置,但是一个通知对象,有几个属性是必须要设置的,其他的属性均是可选的,必须设置的属性如下:
- 小图标,使用setSamllIcon()方法设置。
- 标题,使用setContentTitle()方法设置。
- 文本内容,使用setContentText()方法设置。
(二)、Notification.Builder类中提供的方法:
builder.setAutoCancel(); 设置点击通知后,状态栏自动删除通知。
builder.setSmallIcon(R.drawable.alert); 设置通知小图标
builder.setLargeIcon(R.drawable.alert2); 设置通知大图标
builder.setContentTitle("标题"); 设置通知标题
builder.setContentText("文本"); 设置通知内容
builder.setDefaults(Notification.DEFAULT_SOUND
| Notification.DEFAULT_VIBRATE); 设置通知的音乐、振动、LED等。
builder.setSound(); 设置通知的音乐
builder.setTicker(); 设置通知在状态栏的提示文本。第一次提示消息的时候显示在通知栏上。
builder.setContentIntent(); 设置点击通知后将要启动的程序组件对应的PendingIntent
(三)、发送Notification的步骤:(四部曲)
1、调用getSystemService(NOTIFICATION_SERVICE)方法获取系统的NotificationManager服务,它是一个重要的系统服务。应用程序可以通过NotificationManager 向系统发送全局通知;
2、构造Notification.Builder对象;
3、设置Notification.Builder对象的各种属性;
4、通过NotificationManager 的notify()方法发送Notification。
(四)、示例代码:
核心代码如下:
普通的通知:
大通知
进度条通知
自定义通知
(五)、PendingIntent:
1、PendingIntent字面意义:等待的,悬而未决的Intent;Intent一般是用作Activity、Sercvice、BroadcastReceiver之间传递数据,而Pendingintent,一般用在
Notification上,可以理解为延迟执行的intent,PendingIntent是对Intent一个包装;
2、得到一个 PendingIntent 对象,使用方法类的静态方法 getActivity(Context, int, Intent, int);
3、PendingIntent是一种特殊的Intent。主要的区别在于Intent是立刻执行,而 PendingIntent 的执行不是立刻,而是当条件满足后才发送企图,而且PendingIntent 可以取消;
4、PendingIntent执行的操作实质上是参数传进来的Intent的操作,使用 PendingIntent 的目的在于它所包含的Intent的操作的执行是需要满足某些条件的。
5、主要的使用的地方和例子:通知Notificatio的发送,短消息SmsManager的发送和警报器AlarmManager的执行等。
总而言之,PendingIntent就是一个可以在满足一定条件下执行的Intent,它相比于Intent的优势在于自己携带有Context对象,这样他就不必依赖于某个activity才可以存在。
(六)、Intent和PendingIntent的区别:【掌握,以备面试之需】
- Intent是立即使用的,而PendingIntent可以等到事件发生后触发,PendingIntent可以cancel;
- Intent在程序结束后即终止,而PendingIntent在程序结束后依然有效;
- PendingIntent自带Context,而Intent需要在某个Context内运行;
- Intent在原task中运行,PendingIntent在新的task中运行。
(七)、PendingIntent的几个常量:(getActivity(Context,
int, Intent, int)方法中的第四个参数)
- FLAG_ONE_SHOT : 这个PendingIntent只能使用一次。
- FLAG_NO_CREATE : 如果被描述的PendingIntent不存在,那么简单地返回null,而不是创建它。
- FLAG_CANCEL_CURRENT : 如果被描述的PendingIntent已经存在,在即将生成一个新的PendingIntent前,当前的一个要被取消。
- FLAG_UPDATE_CURRENT :如果被描述的PendingIntent已经存在,那么继续保持它,但它其中的数据会因为新Intent而更新。
Dialog Menu Toast以及Notification
一、Dialog对话框:
(一)、分类:
- AlertDialog 警告对话框(提示对话框)
- ProgressDialog 进度对话框
- DatePickerDialog 日期选择对话框
- TimerPickerDialog 时间选择对话框
- 自定义对话框(登录对话框、关于对话框)
- 列表对话框
- 普通列表对话框
- 单选列表对话框
- 多选列表对话框
- 带图标的列表对话框
(二)、AlertDialog ——简单对话框:
1、类结构:
java.lang.Object
↳ android.app.Dialog
↳ android.app.AlertDialog
2、创建AlertDialog对话框的步骤:
- 创建AlertDialog.Builder对象,该对象能创建AlertDialog;
- 调用Builder对象的方法设置图标、标题、内容、按钮等;
- setTitle():为对话框设置标题
- setIcon ():设置图标
- setMessage ():设置要显示的信息
- setNegativeButton ():设置取消按钮
- setPositiveButton ():设置确定按钮
- setNeutralButton ():设置中立按钮
- 调用Builder对象的create()方法创建AlertDialog对话框;
- 调用AlertDialog的show()方法来显示对话框。
3、核心代码:
Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("提示");
builder.setMessage("确认退出吗?");
builder.setPositiveButton("确认", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
text_main_info.setText("您点击了:" + which);
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
text_main_info.setText("您点击了:" + which);
}
});
builder.setNeutralButton("中立", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
text_main_info.setText("您点击了:" + which);
}
});
builder.create().show();
(三)、AlertDialog——列表对话框:
1、类结构:
java.lang.Object
↳ android.app.Dialog
↳ android.app.AlertDialog
2、创建列表AlertDialog对话框的步骤:
- 创建AlertDialog.Builder对象,该对象能创建AlertDialog;
- 调用Builder对象的方法设置图标、标题、内容、按钮等;
- setTitle():为对话框设置标题
- setIcon ():设置图标
- setMessage ():设置要显示的信息
- setNegativeButton ():设置取消按钮
- setPositiveButton ():设置确定按钮
- setNeutralButton ():设置中立按钮
- setItems ():为对话框添加列表项
- setSingleChoiceItems ():为对话框添加单选列表项
- setMultiChoiceItems ():为对话框添加多选列表项
- setAdapter ():为对话框添加带图标的列表项
- 调用Builder对象的create()方法创建AlertDialog对话框;
- 调用AlertDialog的show()方法来显示对话框。
3、核心代码:
【备注:使用setItems ()、setSingleChoiceItems ()、setMultiChoiceItems ()
、setAdapter()能得到不同的结果。】
//A. 普通列表
button_main_simpleListDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("请选择颜色:");
final String[] arrColor = new String[] { "红色", "绿色","蓝色" };
// 往对话框中放置普通列表
builder.setItems(arrColor, new OnClickListener() {
// 以下代码是模拟:勾选选项后,文字颜色和文本框背景颜色相应发生改变
@Override
public void onClick(DialogInterface dialog , int which) {
text_main_info.setText(arrColor[which]);
switch (which) {
case 0:
text_main_info.setBackgroundColor(Color.RED);
break;
case 1:
text_main_info.setBackgroundColor(Color.GREEN);
break;
case 2:
text_main_info.setBackgroundColor(Color.BLUE);
break;
default:
break;
}
}
});
builder.show();
}
});
//B. 单选列表
button_main_singleListDialog
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("请选择颜色:");
final String[] arrColor = new String[] { "红色", "绿色","蓝色" };
// 往对话框中放置单选列表
builder.setSingleChoiceItems(arrColor, 0,
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {
position = which;//通过这个监听器获取到点击的是第几个
}
});
builder.setPositiveButton("确认", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {
text_main_info.setText(arrColor[position]);
switch (position) {
case 0:
text_main_info.setBackgroundColor(Color.RED);
break;
case 1:
text_main_info.setBackgroundColor(Color.GREEN);
break;
case 2:
text_main_info.setBackgroundColor(Color.BLUE);
break;
default:
break;
}
}
});
builder.show();
}
});
//C. 多选列表
button_main_multiListDialog
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("请选择颜色:");
final String[] hobbyArr = new String[] { "看书", "学习","饮食", "爬山", "绘画" };
// 将多选项中每次勾选的结果放到一个pos数组中。
pos = new boolean[hobbyArr.length];
// 往对话框中放置多选列表
builder.setMultiChoiceItems(hobbyArr, null,
new OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog,int which, boolean isChecked) {
pos[which] = isChecked;//将每一项被勾选的状态放到一个boolean型的数组中
}
});
// 多选列表项必须要使用确认按钮才能最终获得所有勾选的数据。
builder.setPositiveButton("确认", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {
// 将所有的勾选项放到一个字符串中
StringBuilder sb = new StringBuilder();
for (int i = 0; i < pos.length; i++) {
if (pos[i]) {
sb.append(hobbyArr[i]);
sb.append("、");
}
}
text_main_info.setText("您勾选了:" + sb.toString());
}
});
builder.show();
}
});
//D. 带图标的列表dialog
button_main_adapterListDialog
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("手机设置:");
// 定义数据源。以下是模拟数据。真实工作中,有可能是从网络上获取数据,也有可能是从xml配置文件中获取数据。
// 考虑到后期维护,很少在java文件中以定义数组的形式作为适配器的数据来源。
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (int i = 0; i < settingArr.length; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("settingType", settingArr[i]);
map.put("imageId", imageId[i]);
list.add(map);
}
// 使用SimpleAdapter将数据源和自定义布局文件结合到一起。
SimpleAdapter adapter = new SimpleAdapter(
MainActivity.this, list, R.layout.item_dialog,
new String[] { "settingType", "imageId" },
new int[] { R.id.text_item_dialog,
R.id.imageView_item_dialog });
// 调用builder的setAdapter()方法将适配器加载到对话框中。
builder.setAdapter(adapter, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {
text_main_info.setText("您选择设置:" + settingArr[which]);
}
});
// 显示对话框
builder.show();
}
});
(四)、AlertDialog——自定义对话框:
1、类结构:
java.lang.Object
↳ android.app.Dialog
↳ android.app.AlertDialog
2、创建自定义AlertDialog对话框的步骤:
- 创建AlertDialog.Builder对象,该对象能创建AlertDialog;
- 调用Builder对象的方法设置图标、标题、内容、按钮等;
- setTitle():为对话框设置标题
- setIcon ():设置图标
- setMessage ():设置要显示的信息
- setNegativeButton ():设置取消按钮
- setPositiveButton ():设置确定按钮
- setNeutralButton ():设置中立按钮
- 自定义布局文件;
- 使用LayoutInflater 的 inflater()方法填充自定义的布局文件,返回view对象。用该对象的findViewById()方法加载自定义布局上所有控件;
- 调用Builder对象的setView()方法加载view对象;
- 调用Builder对象的create()方法创建AlertDialog对话框;
- 调用AlertDialog的show()方法来显示对话框。
3、核心代码:本示例代码中写了一个显示登录窗口的登录框。
【备注:】采用LayoutInflater去填充布局,返回view对象。
View view = null;
Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("管理员登录:");
LayoutInflater mInflater = LayoutInflater.from(MainActivity.this);
view = mInflater.inflate(R.layout.loginform_main, null);
final EditText edit_loginform_username = (EditText) view
.findViewById(R.id.edit_loginform_username);
final EditText edit_loginform_password = (EditText) view
.findViewById(R.id.edit_loginform_password);
builder.setView(view);
builder.setPositiveButton("登录", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String username = edit_loginform_username.getText()
.toString().trim();
String password = edit_loginform_password.getText()
.toString().trim();
if (username.length() < 1 || password.length() < 1) {
text_main_info.setText("用户名或密码不可以为空!");
} else {
StringBuilder sb = new StringBuilder();
sb.append("您的登录信息:");
sb.append("用户名:");
sb.append(username);
sb.append("密码:");
sb.append(password);
text_main_info.setText(sb.toString());
}
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//此处进行异步任务访问网络等处理。
}
});
builder.create().show();
(五)、ProgressDialog——进度对话框:
1、类结构:
java.lang.Object
↳ android.app.Dialog
↳ android.app.AlertDialog
↳ android.app.ProgressDialog
2、创建 ProgressDialog 对话框的步骤:
- 实例化ProgressDialog,创建出ProgressDialog对象;
- 调用该对象的方法设置图标、标题、内容、按钮等;
-
- setTitle():为对话框设置标题
- setIcon ():设置图标
- setMessage ():设置要显示的信息
- 调用 ProgressDialog 对象的show()方法显示出 ProgressDialog 对话框。
3、核心代码:
ProgressDialog pDialog = new ProgressDialog(MainActivity.this);
pDialog.setTitle("提示:");
pDialog.setMessage("数据加载中。。。");
pDialog.show();
(六)、DatePickerDialog——日期选择对话框:
1、类结构:
java.lang.Object
↳ android.app.Dialog
↳ android.app.AlertDialog
↳ android.app.DatePickerDialog
2、创建 DatePickerDialog 对话框的步骤:
- 实例化 DatePickerDialog ,创建出 DatePickerDialog 对象;
- 调用 DatePickerDialog 对象的show()方法显示出 DatePickerDialog 对话框;
- 绑定监听器:OnDateSetListener().
3、核心代码:
二、Menu:
(一)、简介:
1、Android应用中的菜单默认是隐藏的,只有当用户点击手机上的MENU键,系统才会显示菜单。这种菜单叫做选项菜单(Option Menu)。
2、从3.0开始,Android不要求手机设备上必须提供MENU按键。因此Android推荐使用ActionBar来代替Menu。
(二)、创建菜单:(Android提供了两种创建菜单的方式)
1、在java代码创建菜单;
2、使用xml资源文件创建菜单(res/menu目录下)。建议使用后者。
(三)、XML资源文件中定义菜单:
1、普通菜单:
<item
android:id="@+id/menu_about"
android:orderInCategory="2"
android:showAsAction="never"
android:title="关于"/>
2、二级普通菜单:
<item
android:id="@+id/menu_group2"
android:orderInCategory="1"
android:showAsAction="never"
android:title="文字颜色">
<menu >
<group>
<item android:id="@+id/font_red" android:title="red" />
<item android:id="@+id/font_green" android:title="green"></item>
<item android:id="@+id/font_blue" android:title="blue"></item>
<item android:id="@+id/font_yellow" android:title="yellow"></item>
</group>
</menu>
</item>
3、二级可选项菜单:
<item
android:id="@+id/menu_group1"
android:orderInCategory="1"
android:showAsAction="never"
android:title="文字尺寸">
<menu >
<!-- android:checkableBehavior 属性有三个可选值:all为多选,single为单选,none为不可选。为none时就是一个普通菜单 -->
<group android:checkableBehavior="single">
<item android:id="@+id/font_10" android:title="10sp"></item>
<item android:id="@+id/font_15" android:title="15sp"></item>
<item android:id="@+id/font_20" android:title="20sp"></item>
<item android:id="@+id/font_25" android:title="25sp"></item>
<item android:id="@+id/font_30" android:title="30sp"></item>
</group>
</menu>
</item>
(四)、菜单操作:
利用boolean onOptionsItemSelected(MenuItem item)回调方法。
核心代码如下:利用以上定义的xml菜单文件,实现通过菜单选项对文字的大小和颜色进行控制。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.font_20:
text_main_info.setTextSize(20);
break;
case R.id.font_30:
text_main_info.setTextSize(30);
break;
case R.id.font_red:
text_main_info.setTextColor(Color.RED);
break;
case R.id.font_green:
text_main_info.setTextColor(Color.GREEN);
break;
}
return super.onOptionsItemSelected(item);
}
三、ContextMenu:
(一)、上下文菜单介绍:上下文菜单继承自android.view.Menu。
1、上下文菜单与Options Menu最大的不同在于:
- Options Menu的拥有者是Activity,而上下文菜单的拥有者是Activity中的View;
- 每个Activity有且只有一个Options Menu,它为整个Activity服务。而一个Activity往往有多个View,哪个View需要上下文菜单就通过registerForContextMenu(View view)给这个View注册上下文菜单。
2、生成上下文菜单是通过Activity中的onCreateContextMenu()方法:
- onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo)方法很像生成Options Menu的onCreateOptionsMenu(Menu menu)方法;
- 两者的不同在于:onCreateOptionsMenu只在用户第一次按“Menu”键时被调用,而onCreateContextMenu会在用户每一次长按注册了上下文菜单的View时被调用。
3、ContextMenu工作原理图:
4、ContextMenuInfo 有什么用呢?
当视图元素需要向上下文菜单传递一些信息,比如该View对应DB记录的id等,这就要使用ContextMenuInfo。需要传递额外信息的View需要重写getContextMenuInfo()方法,返回一个带有数据的ContextMenuInfo实现类对象。
Additional information regarding the creation of the context menu. For example, AdapterViews use this to pass the exact item position within the adapter that
initiated the context menu.
ContextMenuInfo携带了注册上下文菜单控件的一些额外信息。一般用在AdaterViews(例如:Spinner 、ListView或GridView)上,
可以在ContextMenuInfo 中获取到适配器View中的position的信息。
(二)、开发上下文菜单的步骤:
1、重写onCreateContextMenu(ContextMenu
menu, View v,ContextMenuInfo menuInfo)方法;
2、调用Activity的registerForContextMenu(View view)方法为view组件注册上下文菜单;(注册上下文菜单后,意味着用户长按该控件后显示上下文菜单)。
3、为菜单项提供响应,重写onContextItemSelected(MenuItem item)。
2、调用Activity的registerForContextMenu(View view)方法为view组件注册上下文菜单;(注册上下文菜单后,意味着用户长按该控件后显示上下文菜单)。
3、为菜单项提供响应,重写onContextItemSelected(MenuItem item)。
(三)、示例代码:
private TextView text_main_info;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text_main_info = (TextView) findViewById(R.id.text_main_info);
this.registerForContextMenu(text_main_info);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.contextmenu_main, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.font_20:
text_main_info.setTextSize(20);
break;
case R.id.font_30:
text_main_info.setTextSize(30);
break;
case R.id.font_red:
text_main_info.setTextColor(Color.RED);
break;
case R.id.font_green:
text_main_info.setTextColor(Color.GREEN);
break;
}
return super.onContextItemSelected(item);
}
四、popmenu
弹出菜单
关键代码如下
五、Toast
(一)、普通的吐司
(二)、改变吐司的位置
(三)、自定义吐司
六、Notification 通知:
(一)、简介:
显示在手机状态栏的通知。Notification所代表的是一种具有全局效果的通知,程序一般通过NotificationManager服务来发送Notification。
Android3.0增加了Notification.Builder类,该类可以轻松地创建Notification对象。
Notification,俗称通知,是一种具有全局效果的通知,它展示在屏幕的顶端,首先会表现为一个图标的形式,当用户向下滑动的时候,展示出通知具体的内容。
【注意:】因为一些Android版本的兼容性问题,对于Notification而言,Android3.0是一个分水岭,在其之前构建Notification推荐使用Notification.Builder构建,而在Android3.0之后,一般推荐使用NotificationCompat.Builder构建。
通知一般通过NotificationManager服务来发送一个Notification对象来完成,NotificationManager是一个重要的系统级服务,该对象位于应用程序的框架层中,应用程序可以通过它像系统发送全局的通知。这个时候需要创建一个Notification对象,用于承载通知的内容。但是一般在实际使用过程中,一般不会直接构建Notification对象,而是使用它的一个内部类NotificationCompat.Builder来实例化一个对象(Android3.0之下使用Notification.Builder),并设置通知的各种属性,最后通过NotificationCompat.Builder.build()方法得到一个Notification对象。当获得这个对象之后,可以使用NotificationManager.notify()方法发送通知。
NotificationManager类是一个通知管理器类,这个对象是由系统维护的服务,是以单例模式获得,所以一般并不直接实例化这个对象。在Activity中,可以使用Activity.getSystemService(String)方法获取NotificationManager对象,Activity.getSystemService(String)方法可以通过Android系统级服务的句柄,返回对应的对象。在这里需要返回NotificationManager,所以直接传递Context.NOTIFICATION_SERVICE即可。
虽然通知中提供了各种属性的设置,但是一个通知对象,有几个属性是必须要设置的,其他的属性均是可选的,必须设置的属性如下:
- 小图标,使用setSamllIcon()方法设置。
- 标题,使用setContentTitle()方法设置。
- 文本内容,使用setContentText()方法设置。
(二)、Notification.Builder类中提供的方法:
builder.setAutoCancel(); 设置点击通知后,状态栏自动删除通知。
builder.setSmallIcon(R.drawable.alert); 设置通知小图标
builder.setLargeIcon(R.drawable.alert2); 设置通知大图标
builder.setContentTitle("标题"); 设置通知标题
builder.setContentText("文本"); 设置通知内容
builder.setDefaults(Notification.DEFAULT_SOUND
| Notification.DEFAULT_VIBRATE); 设置通知的音乐、振动、LED等。
builder.setSound(); 设置通知的音乐
builder.setTicker(); 设置通知在状态栏的提示文本。第一次提示消息的时候显示在通知栏上。
builder.setContentIntent(); 设置点击通知后将要启动的程序组件对应的PendingIntent
(三)、发送Notification的步骤:(四部曲)
1、调用getSystemService(NOTIFICATION_SERVICE)方法获取系统的NotificationManager服务,它是一个重要的系统服务。应用程序可以通过NotificationManager 向系统发送全局通知;
2、构造Notification.Builder对象;
3、设置Notification.Builder对象的各种属性;
4、通过NotificationManager 的notify()方法发送Notification。
(四)、示例代码:
核心代码如下:
普通的通知:
大通知
进度条通知
自定义通知
(五)、PendingIntent:
1、PendingIntent字面意义:等待的,悬而未决的Intent;Intent一般是用作Activity、Sercvice、BroadcastReceiver之间传递数据,而Pendingintent,一般用在
Notification上,可以理解为延迟执行的intent,PendingIntent是对Intent一个包装;
2、得到一个 PendingIntent 对象,使用方法类的静态方法 getActivity(Context, int, Intent, int);
3、PendingIntent是一种特殊的Intent。主要的区别在于Intent是立刻执行,而 PendingIntent 的执行不是立刻,而是当条件满足后才发送企图,而且PendingIntent 可以取消;
4、PendingIntent执行的操作实质上是参数传进来的Intent的操作,使用 PendingIntent 的目的在于它所包含的Intent的操作的执行是需要满足某些条件的。
5、主要的使用的地方和例子:通知Notificatio的发送,短消息SmsManager的发送和警报器AlarmManager的执行等。
总而言之,PendingIntent就是一个可以在满足一定条件下执行的Intent,它相比于Intent的优势在于自己携带有Context对象,这样他就不必依赖于某个activity才可以存在。
(六)、Intent和PendingIntent的区别:【掌握,以备面试之需】
- Intent是立即使用的,而PendingIntent可以等到事件发生后触发,PendingIntent可以cancel;
- Intent在程序结束后即终止,而PendingIntent在程序结束后依然有效;
- PendingIntent自带Context,而Intent需要在某个Context内运行;
- Intent在原task中运行,PendingIntent在新的task中运行。
(七)、PendingIntent的几个常量:(getActivity(Context,
int, Intent, int)方法中的第四个参数)
- FLAG_ONE_SHOT : 这个PendingIntent只能使用一次。
- FLAG_NO_CREATE : 如果被描述的PendingIntent不存在,那么简单地返回null,而不是创建它。
- FLAG_CANCEL_CURRENT : 如果被描述的PendingIntent已经存在,在即将生成一个新的PendingIntent前,当前的一个要被取消。
- FLAG_UPDATE_CURRENT :如果被描述的PendingIntent已经存在,那么继续保持它,但它其中的数据会因为新Intent而更新。