【Android基础笔记10】Dialog Menu Toast以及Notification

本文详细介绍了Android中常用的UI组件,包括Dialog对话框的各种类型及其使用方法,菜单(Menu)及上下文菜单(ContextMenu)的创建与操作,以及如何使用Toast和Notification进行简单的提示和全局通知。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



Dialog Menu Toast以及Notification
一、Dialog对话框:
(一)、分类:
  1. AlertDialog   警告对话框(提示对话框)
  2. ProgressDialog    进度对话框
  3. DatePickerDialog   日期选择对话框
  4. TimerPickerDialog   时间选择对话框
  5. 自定义对话框(登录对话框、关于对话框)
  6. 列表对话框
    • 普通列表对话框
    • 单选列表对话框
    • 多选列表对话框
    • 带图标的列表对话框

(二)、AlertDialog ——简单对话框: 
1、类结构:
java.lang.Object
   ↳  android.app.Dialog
      ↳  android.app.AlertDialog
 
2、创建AlertDialog对话框的步骤
  1. 创建AlertDialog.Builder对象,该对象能创建AlertDialog;
  2. 调用Builder对象的方法设置图标、标题、内容、按钮等;
    • setTitle():为对话框设置标题
    • setIcon ():设置图标
    • setMessage ():设置要显示的信息
    • setNegativeButton ():设置取消按钮
    • setPositiveButton ():设置确定按钮
    • setNeutralButton ():设置中立按钮
  3. 调用Builder对象的create()方法创建AlertDialog对话框;
  4. 调用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对话框的步骤
  1. 创建AlertDialog.Builder对象,该对象能创建AlertDialog;
  2. 调用Builder对象的方法设置图标、标题、内容、按钮等;
    • setTitle():为对话框设置标题
    • setIcon ():设置图标
    • setMessage ():设置要显示的信息
    • setNegativeButton ():设置取消按钮
    • setPositiveButton ():设置确定按钮
    • setNeutralButton ():设置中立按钮
    • setItems ():为对话框添加列表项
    • setSingleChoiceItems ():为对话框添加单选列表项
    • setMultiChoiceItems ():为对话框添加多选列表项
    • setAdapter ():为对话框添加带图标的列表项
  3. 调用Builder对象的create()方法创建AlertDialog对话框;
  4. 调用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对话框的步骤
  1. 创建AlertDialog.Builder对象,该对象能创建AlertDialog;
  2. 调用Builder对象的方法设置图标、标题、内容、按钮等;
  • setTitle():为对话框设置标题
  • setIcon ():设置图标
  • setMessage ():设置要显示的信息
  • setNegativeButton ():设置取消按钮
  • setPositiveButton ():设置确定按钮
  • setNeutralButton ():设置中立按钮
  1. 自定义布局文件;
  2. 使用LayoutInflater  inflater()方法填充自定义的布局文件,返回view对象。用该对象的findViewById()方法加载自定义布局上所有控件;
  3. 调用Builder对象的setView()方法加载view对象;
  4. 调用Builder对象的create()方法创建AlertDialog对话框;
  5. 调用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)。


(三)、示例代码:
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
    弹出菜单 
  关键代码如下
  FC768DE7-3656-4910-B170-EC6A02AE4057.png


五、Toast
(一)、普通的吐司

2F056C66-3D26-4342-B07B-F18B2F6C35E6.png

(二)、改变吐司的位置
C2CC9D7B-BBAA-4A7E-AC30-A484ABC291C6.png

(三)、自定义吐司

39020B7A-4C9D-46A5-B939-6C8A774B7069.png

六、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。

(四)、示例代码:
核心代码如下:
普通的通知:
 2A09F995-2A9E-4476-AE04-D548C3BE542C.png
大通知
 
E20BD64C-69C8-4D11-B31E-1DA42A478691.png

进度条通知
   C5763947-F17E-4447-9795-235B965B4F0E.png

自定义通知
45EBC7D4-52EC-49B4-A2BA-46193D70A6A3.png


(五)、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的区别:【掌握,以备面试之需】
  1.  Intent是立即使用的,而PendingIntent可以等到事件发生后触发,PendingIntent可以cancel
  2.  Intent在程序结束后即终止,而PendingIntent在程序结束后依然有效
  3.  PendingIntent自带Context,而Intent需要在某个Context内运行;
  4.  Intent在原task中运行,PendingIntent在新的task中运行。
(七)、PendingIntent的几个常量:(getActivity(Context, int, Intent, int)方法中的第四个参数
  1. FLAG_ONE_SHOT  : 这个PendingIntent只能使用一次。
  2. FLAG_NO_CREATE : 如果被描述的PendingIntent不存在,那么简单地返回null,而不是创建它。
  3. FLAG_CANCEL_CURRENT  :  如果被描述的PendingIntent已经存在,在即将生成一个新的PendingIntent前,当前的一个要被取消。
  4. FLAG_UPDATE_CURRENT  :如果被描述的PendingIntent已经存在,那么继续保持它,但它其中的数据会因为新Intent而更新。






Dialog Menu Toast以及Notification
一、Dialog对话框:
(一)、分类:
  1. AlertDialog   警告对话框(提示对话框)
  2. ProgressDialog    进度对话框
  3. DatePickerDialog   日期选择对话框
  4. TimerPickerDialog   时间选择对话框
  5. 自定义对话框(登录对话框、关于对话框)
  6. 列表对话框
    • 普通列表对话框
    • 单选列表对话框
    • 多选列表对话框
    • 带图标的列表对话框

(二)、AlertDialog ——简单对话框: 
1、类结构:
java.lang.Object
   ↳  android.app.Dialog
      ↳  android.app.AlertDialog
 
2、创建AlertDialog对话框的步骤
  1. 创建AlertDialog.Builder对象,该对象能创建AlertDialog;
  2. 调用Builder对象的方法设置图标、标题、内容、按钮等;
    • setTitle():为对话框设置标题
    • setIcon ():设置图标
    • setMessage ():设置要显示的信息
    • setNegativeButton ():设置取消按钮
    • setPositiveButton ():设置确定按钮
    • setNeutralButton ():设置中立按钮
  3. 调用Builder对象的create()方法创建AlertDialog对话框;
  4. 调用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对话框的步骤
  1. 创建AlertDialog.Builder对象,该对象能创建AlertDialog;
  2. 调用Builder对象的方法设置图标、标题、内容、按钮等;
    • setTitle():为对话框设置标题
    • setIcon ():设置图标
    • setMessage ():设置要显示的信息
    • setNegativeButton ():设置取消按钮
    • setPositiveButton ():设置确定按钮
    • setNeutralButton ():设置中立按钮
    • setItems ():为对话框添加列表项
    • setSingleChoiceItems ():为对话框添加单选列表项
    • setMultiChoiceItems ():为对话框添加多选列表项
    • setAdapter ():为对话框添加带图标的列表项
  3. 调用Builder对象的create()方法创建AlertDialog对话框;
  4. 调用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对话框的步骤
  1. 创建AlertDialog.Builder对象,该对象能创建AlertDialog;
  2. 调用Builder对象的方法设置图标、标题、内容、按钮等;
  • setTitle():为对话框设置标题
  • setIcon ():设置图标
  • setMessage ():设置要显示的信息
  • setNegativeButton ():设置取消按钮
  • setPositiveButton ():设置确定按钮
  • setNeutralButton ():设置中立按钮
  1. 自定义布局文件;
  2. 使用LayoutInflater  inflater()方法填充自定义的布局文件,返回view对象。用该对象的findViewById()方法加载自定义布局上所有控件;
  3. 调用Builder对象的setView()方法加载view对象;
  4. 调用Builder对象的create()方法创建AlertDialog对话框;
  5. 调用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)。


(三)、示例代码:
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
    弹出菜单 
  关键代码如下
  FC768DE7-3656-4910-B170-EC6A02AE4057.png


五、Toast
(一)、普通的吐司

2F056C66-3D26-4342-B07B-F18B2F6C35E6.png

(二)、改变吐司的位置
C2CC9D7B-BBAA-4A7E-AC30-A484ABC291C6.png

(三)、自定义吐司

39020B7A-4C9D-46A5-B939-6C8A774B7069.png

六、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。

(四)、示例代码:
核心代码如下:
普通的通知:
 2A09F995-2A9E-4476-AE04-D548C3BE542C.png
大通知
 
E20BD64C-69C8-4D11-B31E-1DA42A478691.png

进度条通知
   C5763947-F17E-4447-9795-235B965B4F0E.png

自定义通知
45EBC7D4-52EC-49B4-A2BA-46193D70A6A3.png


(五)、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的区别:【掌握,以备面试之需】
  1.  Intent是立即使用的,而PendingIntent可以等到事件发生后触发,PendingIntent可以cancel
  2.  Intent在程序结束后即终止,而PendingIntent在程序结束后依然有效
  3.  PendingIntent自带Context,而Intent需要在某个Context内运行;
  4.  Intent在原task中运行,PendingIntent在新的task中运行。
(七)、PendingIntent的几个常量:(getActivity(Context, int, Intent, int)方法中的第四个参数
  1. FLAG_ONE_SHOT  : 这个PendingIntent只能使用一次。
  2. FLAG_NO_CREATE : 如果被描述的PendingIntent不存在,那么简单地返回null,而不是创建它。
  3. FLAG_CANCEL_CURRENT  :  如果被描述的PendingIntent已经存在,在即将生成一个新的PendingIntent前,当前的一个要被取消。
  4. FLAG_UPDATE_CURRENT  :如果被描述的PendingIntent已经存在,那么继续保持它,但它其中的数据会因为新Intent而更新。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值