Menu/Dialog/PopupWindow

菜单 menu

选项菜单(系统菜单)

特点
  • 归属Activity管理
  • 位于Activity的TitleBar右上角
创建方式
  • 列表内容
  • 1、 在res/menu中创建xml文件,再在Activity或Fragment中加载菜单项
  • 2、 java代码创建菜单项
实例:

第一种:

  xml文件属性设置:
    <item 
        android:id="@+id/aciton_colors"
        android:title="选择颜色" >
        <menu>
            <item
                android:id="@+id/action_red"
                android:title="红色"/>
            <item 
                android:id="@+id/action_green"
                android:title="绿色" >
           <item 
                android:id="@+id/action_blue"
                android:title="蓝色" >
        </menu>
    </item>

  如上,id为每个item的id,会在R.java文件文件中自动生成对应值;
    title为每个item标签在UI中显示的值,如同TextView中的text属性;
    menu为下一级菜单的标签,此处为二级菜单;
  在Activity或Fragment中加载菜单项:
        重新父类的2个方法:
            //加载菜单项
            @onCreateOptionsMenu(Menu menu)
            {
                //加载菜单项,R.menu.main为菜单xml文件的id
                getMenuInflater().inflate(R.menu.main,menu);
            }

            //每个菜单项的处理方法
            @onOptionsItemSelected(MenuItem item)
            {
                switch(item.getItemId())
                {
                    case R.id.action_quit:
                    finish();
                    break;
                }
            }

第二种:

        //通过add增加菜单项,"1"为菜单id,对菜单项作处理时,
        //与方法一中的menu.getItemId()相同
        menu.add(menu.NONE, 1, menu.NONE, "java代码创建的菜单");
        //设置二级菜单,带有子菜单的二级菜单
        SubMenu subMenu = menu.addSubMenu(menu.NONE, 2, menu.NONE, "二级菜单");
        subMenu.add(menu.NONE, 21, 1, "sub 2-1");
        subMenu.add(menu.NONE, 22, 1, "sub 2-2");

        //对菜单项的处理与一中相同;
        
### ContextMenu上下文菜单 #### 特点 - 归属View管理 - 为任意View均可设置 - 长按弹出菜单选项 #### 使用
   

        //为控件注册上下文菜单
        registerForContextMenu(lv);

        //在res/menu中创建每个菜单项
        //在Activity中加载菜单
        @onCreateContextMenu(Menu menu,View v, ContextMenuInfo menuInfo){
            getMenuInflater().inflate(R.menu.main,menu);
        }

        //对每个菜单项做出处理

        @onContextItemSelected(MenuItem item){
            switch(item.getItemId())
            {
                case R.id.action_delect:
                break;                  
                .......
            }
        }

PopupMenu 弹出式菜单

特点
  • Api11以上
  • 可以为任意的view设置弹出式菜单
  • 一般设置在一个监听事件中
使用
        //1、得到PopupMenu对象,context为上下文对象,view为需要设置弹出菜单的
        //view控件        
        PopupMenu popupMenu=new PopupMenu(context,view);

        //2、加载菜单
        getMenuInflater().inflate(R.menu.main,pm.getMenu());

        //3、 为PopupMenu设置监听器
        pm.setOnMenuItemClickListener(.....);

        //4、 显示PopupMenu
        pm.show();

对话框 Dialog

这里写图片描述

普通对话框

创建使用
    //此为一个确认退出的对话框样例:   

    //1, 得到普通对话框的创建者
    AlertDialog.Builder builder = new AlertDialog.Builder(this);

    //2, 构建对话框
    builder.setIcon(R.drawable.ic_launcher);//设置图标
    builder.setTitle("提示");//设置标题
    builder.setMessage("是否确认退出?");//设置内容

    //设置按钮
    /**
     * text         按钮显示的文字
     * listener     按钮处理的事件,不做任何处理填null
     */                         
    builder.setNegativeButton("取消", null);//(text,listener)
    builder.setPositiveButton("确定", new OnClickListener() {
        @Override
            public void onClick(DialogInterface dialog, int which) {

        finish();

        }
    });

普通对话框效果

一些封装好了的对话框

进度条对话框
        // 1, 得到进度条对话框的对象
        ProgressDialog pd = new ProgressDialog(this);

        // 2, 构建对话框
        pd.setIcon(R.drawable.ic_launcher);
        pd.setTitle("提示");
        pd.setMessage("正在加载, 请稍后....");
        pd.setCancelable(false);

        // 设置进度条对话框的样式
        // ProgressDialog.STYLE_HORIZONTAL 水平的
        // ProgressDialog.STYLE_SPINNER 转圈的

        pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

        // 3, 显示对话框
        pd.show();

        // 设置进度值 必须要放在显示对话框之后 此处主要看下效果
        pd.setProgress(70);

进度条对话框效果

日期对话框
        // 获取当前的日期
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        int monthOfYear = calendar.get(Calendar.MONTH);
        int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);

        // 1, 得到日期选择对话框对象
        /**
         * context 上下文对象 callBack onDateSetListener (日期选择器上的"确定"按钮监听器) year 默认的年
         * monthOfYear 默认的月份 dayOfMonth 默认的日期
         */
        DatePickerDialog dp = new DatePickerDialog(this,
                new OnDateSetListener() {

                    @Override
                    public void onDateSet(DatePicker view, int year,
                            int monthOfYear, int dayOfMonth) {

                        // 日期选择器上的"确定按钮" 的监听

                        String str = year + "-" + (monthOfYear + 1) + "-"
                                + dayOfMonth;

                        Toast.makeText(MainActivity.this, str,
                                Toast.LENGTH_LONG).show();

                    }
                }, year, monthOfYear, dayOfMonth);

        // 2, 显示对话框
        dp.show();  

日期选择对话框效果

时间选择对话框
        // 1, 得到带有时间选择器的对话框对象
        /**
         * context 上下文对象 callBack onTimeSetListener (点击"完成" 监听器) hourOfDay 默认的小时
         * minute 默认的分钟 is24HourView 是否为24小时制
         */
        TimePickerDialog td = new TimePickerDialog(this,
                new OnTimeSetListener() {

                    @Override
                    public void onTimeSet(TimePicker view, int hourOfDay,
                            int minute) {

                        // 点击的是时间选择器上的"完成"
                        Toast.makeText(MainActivity.this,
                                hourOfDay + ":" + minute, Toast.LENGTH_LONG)
                                .show();
                    }
                }, 15, 10, true);

        // 2, 显示对话框
        td.show();

时间选择对话框

自定义对话框

  • 注意:自定义对话框中的EditText需要先res/layout中创建layout和两个editText
// 1, 得到对话框的创建者
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        // 2, 构建对话框
        builder.setIcon(R.drawable.ic_launcher);
        builder.setTitle("用户登陆");

        View view = getLayoutInflater().inflate(R.layout.login, null);

        final EditText nameEdit = (EditText) view.findViewById(R.id.name_id);
        final EditText pwdEdit = (EditText) view.findViewById(R.id.pwd_id);

        builder.setView(view);

        builder.setNegativeButton("取消", null);
        builder.setPositiveButton("确定", new OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {

                String name = nameEdit.getText().toString();
                String pwd = pwdEdit.getText().toString();

                Toast.makeText(MainActivity.this, name + "  ,   " + pwd,
                        Toast.LENGTH_LONG).show();

            }
        });

        // 3, 显示对话框
        builder.show();

自定义对话框效果

列表对话框

  • !!!注意,单击方法请注意自己添加,TextView请注意初始化。
    布局文件:(res/layout目录下)
    <LinearLayout 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:orientation="vertical"
    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" >

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="改变我的颜色, 大小和内容" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:onClick="sohwCummon"
        android:text="普通列表对话框" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="showSingle"
        android:text="单选列表对话框" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="sohwMulti"
        android:text="多选列表对话框" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="showAdapter"
        android:text="适配器列表对话框" />

    </LinearLayout>

主界面

普通列表对话框
  • 主要方法:builder.setItems(String[] items, new OnClickListener(){……});
        //1.得到普通对话框的创建者
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        //2.构建对话框
        builder.setIcon(R.drawable.ic_launcher);
        builder.setTitle("选择颜色");

        //设置列表
        /**
         * items        列表的数组
         * listener     每个Item的监听
         */
        //String[] colors =getResources().getStringArray(R.array.colors);

        builder.setItems(R.array.colors, new OnClickListener() {
        /**
         * DialogInterface dialog   当前对话框
         * int which            用户当前选中的列表       从0开始
         */
        @Override
        public void onClick(DialogInterface dialog, int which) {
            switch (which) {
            case 0:
                tv.setTextColor(Color.RED);
                break;
            case 1:
                tv.setTextColor(Color.GREEN);
                break;
            case 2:
                tv.setTextColor(Color.BLUE);
                break;
            }
        }
    });

        //3.显示对话框
        builder.show();

普通列表对话框效果

单选对话框
  • 主要方法:
    builder.setSingleChoiceItems(String[] items, int checkedItem,onClickListener(){….})
    // 1.得到普通对话框的创建者
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        // 2.构建对话框
        builder.setIcon(R.drawable.ic_launcher);
        builder.setTitle("设置文字大小");

        // 设置单选列表
        String[] sizes = { "文字大小为:20", "文字大小为:30", "文字大小为:40" };

        // 第二个参数 : 默认选中Item的下标 如果没有默认选中: checkedItem 为-1
        builder.setSingleChoiceItems(sizes, -1, new OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {

                // 记录当前选中的是那一个
                position = which;
            }
        });

        builder.setPositiveButton("确定", new OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // 根据记录的选中的内容, 去设置TextSize
                switch (position) {
                case 0:
                    tv.setTextSize(20);
                    break;
                case 1:
                    tv.setTextSize(30);
                    break;
                case 2:
                    tv.setTextSize(40);
                    break;
                }
            }
        });

        // 3, 显示对话框
        builder.show();

单选对话框效果

多选列表对话框
  • 主要方法:
    builder.setMultiChoiceItems(String[] items,
    boolean[] checkedItems,onMultiChoiceItems(){…..})
        // 1.得到普通对话框的创建者
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        // 2.构建对话框
        builder.setIcon(R.drawable.ic_launcher);
        builder.setTitle("请选择您的爱好");

        //设置多选列表
        final String[] hobbys = { "游戏", "电影", "学习", "看书", "敲代码" };
        final boolean[] checkedItems = new boolean[hobbys.length];

        builder.setMultiChoiceItems(hobbys, checkedItems,
                new OnMultiChoiceClickListener() {

                    /**
                     * DialogInterface dialog 当前对话框 int which 当前选中*的Item的下标
                     * boolean isChecked 当前选中的Item对应的状态
                     */
                    @Override
                    public void onClick(DialogInterface dialog, int which,
                            boolean isChecked) {
                        // 记录当前item状态

                        checkedItems[which] = isChecked;
                    }
                });

        builder.setPositiveButton("确定", new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

                StringBuilder sBuilder = new StringBuilder();
                // 根据状态, 设置内容
                for (int i = 0; i 
适配器列表对话框
  • 主要方法:builder.setAdapter(adapter, onClickListener(){…..})
        // 1, 得到普通对话框的创建者
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        // 2, 构建对话框
        builder.setIcon(R.drawable.ic_launcher);
        builder.setTitle("请选择你的操作");

        // 设置适配器列表
        String[] data = { "声音设置", "WIFI设置", "设置" };
        ArrayAdapter adapter = new ArrayAdapter(this,
                android.R.layout.simple_list_item_1, data);
        builder.setAdapter(adapter, new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent();
                switch (which) {
                case 0:
                    intent.setAction("android.settings.SOUND_SETTINGS");
                    break;
                case 1:
                    intent.setAction("android.settings.WIFI_SETTINGS");
                    break;
                case 2:
                    intent.setAction("android.settings.SETTINGS");
                    break;
                }
                startActivity(intent);
            }
        });

        // 3, 显示对话框
        builder.show();
        // builder.create().show();
        // builder.create().dismiss();对话框消失

适配器对话框效果

特点(与dialog区别)

  • 他能够直接指定显示位置
  • 自定义设置宽高
  • PopupWindow没有默认布局,必须由手动设置
  • -

PopupWindow的创建

public PopupWindow (Context context)
public PopupWindow(View contentView)
public PopupWindow(View contentView, int width, int height)
public PopupWindow(View contentView, int width, int height, boolean focusable)

根据他的构造函数,一般使用第三个构造方法
例如:
PopupWindow window = new PopupWindow(view,LayoutParams.MATCH_PARENT,

PopupWindow的展示

  • 根据设定的具体位置去展示
  • showAtLocation(parent, gravity, x, y); >>>(parent:父控件/gravity:相对于父控件的位置/x y 偏移量width,height;例如:showAtLocation(view, Gravity.BOTTOM, 0, 0);)
  • showAsDropDown(view, x, y);>>>view:以某个控件为参照(例如: window.showAsDropDown(textView, 0, 100);)
  • isShowing(); 判断是否正在展示
  • dismiss();

实例展示

Layout布局:

主布局activity_main:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity" >
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:onClick="showPopupWindow"
            android:text="展示popupWindow" />
    </RelativeLayout>

popupWindow显示布局popup_item:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" 
        android:background="#ee0">

        <ListView
            android:id="@+id/list_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
        </ListView>

    </LinearLayout>
MainActivity代码:

MainActivity.java:

    package com.example.popupwindowdemo;

    import android.os.Bundle;
    import android.text.Layout;
    import android.view.Gravity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup.LayoutParams;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import android.widget.PopupWindow;
    import android.app.Activity;

    public class MainActivity extends Activity {
        //数据:
        private String[] data = { "Java", "C++", "C", "Android" };
        //此处数据简单,用ArrayAdapter即可
        private ArrayAdapter adapter;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //将数据放入adapter
            adapter = new ArrayAdapter(this,
                    android.R.layout.simple_list_item_1, data);
        }

        public void showPopupWindow(View view) {
            //此为popupWindow弹出控件的布局文件,将popup_item通过LayoutInflater转化为View
            View contentView = LayoutInflater.from(MainActivity.this).inflate(
                    R.layout.popup_item, null);
            //从contentView中找到listView视图
            ListView listView=(ListView) contentView.findViewById(R.id.list_view);
            //将数据放入listView
            listView.setAdapter(adapter);
            //1.实例化PopupWindow对象
            PopupWindow popupWindow = new PopupWindow(contentView,
                    300, LayoutParams.WRAP_CONTENT);
            //2.显示popupWindow
            View rootview = LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_main, null);  
            popupWindow.showAtLocation(rootview, Gravity.BOTTOM, 0, 0);  
            //此处就不再设置listView的点击事件了,这个一个简单的popupWindow的展示
        }
    }


点击前
点击后

  • 此处由于只是简单的展示popupWindow功能,并没有设置listView的监听事件,感兴趣的小伙伴可以自己尝试
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值