欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

android Menu菜单 和 PopupWindow

程序员文章站 2022-03-12 07:51:07
android Menu菜单 PopupWindow窗口一、常用菜单1.系统菜单OptionsMenu2.上下文菜单ContextMenu3.弹出菜单二、PopupWindow一、常用菜单1.系统菜单OptionsMenu1.在res下面创建一个menu文件夹,并新建一个xml文件作为OptionMenu的布局文件

一、常用菜单

1.系统菜单OptionsMenu

右上角的三个点
android   Menu菜单 和 PopupWindow
android   Menu菜单 和 PopupWindow

1.在res下面创建一个menu文件夹,并新建一个xml文件作为OptionMenu的布局文件

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <!--showAsAction属性:always总是  never 从不 ifroom 能显示就显示 默认是nerver-->
    <item
        android:id="@+id/blue"
        android:title="蓝色" />
    <item
        android:id="@+id/red"
        android:title="红色" />
    <item
        android:id="@+id/green"
        android:title="绿色" />
</menu>

2.Activity重写onCreateOptionsMenu加载资源文件
3.Activity重写onOptionsItemSelected加设置事件监听

    //重写onCreateOptionsMenu   加载资源文件
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //设定布局
        getMenuInflater().inflate(R.menu.optionmenu, menu);
        return super.onCreateOptionsMenu(menu);
    }
	//重写onOptionsItemSelected  加设置事件监听
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        //获取menu item的id
        int id = item.getItemId();
        switch (id) {
            case R.id.blue:
                Toast.makeText(this, "你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show();
                break;
            case R.id.green:
                Toast.makeText(this, "你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show();
                break;
            case R.id.red:
                Toast.makeText(this, "你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }

注意:一个Activity只有一个系统菜单

2.上下文菜单ContextMenu (长按实现)

可放在相对于控件的位置
android   Menu菜单 和 PopupWindow

1.在res下面创建一个menu文件夹,并新建一个xml文件作为ContextMenu的布局文件,我们复用上面的menu布局
2.Activity重写onCreateConextMenu加载资源文件
3.Activity重写onConextItemSelected设置事件监听
4.为控件添加长按属性并将菜单绑定到这个控件上:registerForContextMenu(控件)

private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.textview);
        //为控件添加长按属性并将菜单绑定到这个控件上
        registerForContextMenu(textView);
    }
    //上下文菜单
    //onCreateConextMenu加载资源文件
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        getMenuInflater().inflate(R.menu.optionmenu,menu);
    }
    //onConextItemSelected设置事件监听
    @Override
    public boolean onContextItemSelected(@NonNull MenuItem item) {
        int id = item.getItemId();
        switch (id) {
            case R.id.blue:
                Toast.makeText(this, "你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show();
                break;
            case R.id.green:
                Toast.makeText(this, "你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show();
                break;
            case R.id.red:
                Toast.makeText(this, "你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onContextItemSelected(item);
    }
    //系统菜单
    //重写onCreateOptionsMenu   加载资源文件
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //给布局解析器设定布局
        getMenuInflater().inflate(R.menu.optionmenu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    //重写onOptionsItemSelected  加设置事件监听
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        //获取menu item的id
        int id = item.getItemId();
        switch (id) {
            case R.id.blue:
                Toast.makeText(this, "你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show();
                break;
            case R.id.green:
                Toast.makeText(this, "你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show();
                break;
            case R.id.red:
                Toast.makeText(this, "你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }

注意:长按绑定的控件+可以为任意一个view设置上下文菜单

3.弹出菜单(点击实现)

1:在res下面创建一个menu文件夹,并新建一个xml文件作为PoupMenu的布局文件。(采用之前menu)
2:把PopupMenu相关逻辑封装到showPopupMenu()方法中,
包含PopupMenu的实例化、布局设置、显示、添加MenuItem的点击监听及响应等
3:为控件设置事件监听直接调用showPopupMenu()方法

//弹出菜单
    private void showPopupMenu() {
        //1:创建对象 参数 上下文 将要显示目标下方的控件
        PopupMenu popupMenu= new PopupMenu(this,textView);
        //2:记载布局
        popupMenu.inflate(R.menu.optionmenu);
        //3:事件监听
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                int id = item.getItemId();
                switch (id) {
                    case R.id.blue:
                        Toast.makeText(MainActivity.this, item.getTitle(), Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.green:
                        Toast.makeText(MainActivity.this, "你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.red:
                        Toast.makeText(MainActivity.this, "你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show();
                        break;
                }
                return false;
            }
        });
        //TODO 4:显示
        popupMenu.show();
    }

注意:弹出菜单,默认弹出的位置在控件view的下方

二、PopupWindow

1、简易PopupWindow

设定布局可随意
android   Menu菜单 和 PopupWindow

private TextView textView;
    private Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        registerForContextMenu(textView);
        //控件设置点击监听  弹出窗口
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showPopupMenu();
            }
        });
        //popupwindow
        btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //创建对象 参数上下文
                PopupWindow popupWindow = new PopupWindow(MainActivity.this);
                //加载布局 布局随意设定
                View inflate = LayoutInflater.from(MainActivity.this).inflate(R.layout.popupwindow_layout, null);
                //设置三要素,缺一不可.
                //ContentView上下文视图(布局)  高  宽
                popupWindow.setContentView(inflate);
                popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
                popupWindow.setWidth(600);
                //设置外部点击取消
                popupWindow.setOutsideTouchable(true);
                //设置弹出的位置(控件,上下移动,左右移动)
                popupWindow.showAsDropDown(btn,0,0);
            }
        });
    }

2、PopupWindow动画

android   Menu菜单 和 PopupWindow

①、创建anim文件夹

②、创建进入和退入动画文件 pop_in.xml pop_out.xml

pop_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000">
    <translate
        android:fromYDelta="-300"
        android:toYDelta="0" />
    <alpha
        android:fromAlpha="0.1"
        android:toAlpha="1" />
</set>

duration:即动画执行时长
fromXScale:横向开始比例
fromYScale:纵向开始比例
toXScale:动画结束时横向的比例 float值 1即是保持正常大小
toYScale:动画结束时纵向的比例
alpha 透明度变化
pop_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000">
    <translate
        android:fromYDelta="0"
        android:toYDelta="300" />
    <alpha
        android:fromAlpha="1"
        android:toAlpha="0.1" />
</set>

③、定义动画style

在资源文件的values的style.xml中添加如下代码

    <style name="pop_window" parent="android:Animation">
        <item name="android:windowEnterAnimation">@anim/pop_in</item>
        <item name="android:windowExitAnimation">@anim/pop_out</item>
    </style>

android:windowEnterAnimation:为窗体进入时执行
android:windowExitAnimation:为窗体退出时执行

④、使用到PopupWindow中

//绑定动画
	popupWindow.setAnimationStyle(R.style.pop_window);
//设置弹出的位置(控件,上下移动,左右移动)
	popupWindow.showAtLocation(view, Gravity.CENTER, 0, 0);

这样就实现了窗口动画。

本文地址:https://blog.csdn.net/muzi9928/article/details/108540817