2.menu

第一章 menu概述

1.选项菜单

image-20200814080936050

2.上下文菜单

image-20200814080956812

3.弹出菜单

image-20200814081004125

第二章 menu的使用

1.创建menu文件https://developer.android.com/guide/topics/resources/menu-resource

image-20200814081122890

第一节 Option菜单操作

image-20200814081420393

使用画布进行操作

image-20200814081242699

MenuInflater 详细讲解

此类用于将菜单XML文件实例化为Menu对象。

MenuInflater(Context context)

inflate(int menuRes, Menu menu)从指定的XML资源中膨胀菜单层次结构。

image-20200814081546913

<menu>
定义 Menu,即菜单项的容器。<menu> 元素必须是该文件的根节点,并且能够包含一个或多个 <item> 和 <group> 元素。
<item>
创建 MenuItem,此元素表示菜单中的一项,可能包含嵌套的 <menu> 元素,以便创建子菜单。
<group>
<item> 元素的不可见容器(可选)。它支持您对菜单项进行分类,使其共享活动状态和可见性等属性。如需了解详细信息,请参阅创建菜单组部分。

1.使用java 代码创建Option菜单

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.game_menu, menu);
    return true;
}

此外,您还可以使用 add() 添加菜单项,并使用 findItem() 检索项目,以便使用 MenuItem API 修改其属性。

2.处理点击事件

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) {
        case R.id.new_game:
            newGame();
            return true;
        case R.id.help:
            showHelp();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

3.在运行时更改菜单项

如需根据在 Activity 生命周期中发生的事件修改选项菜单,则可通过 onPrepareOptionsMenu() 方法执行此操作。此方法向您传递 Menu 对象(因为该对象目前存在),以便您能够对其进行修改,如添加、移除或停用项目。(此外,片段还提供 onPrepareOptionsMenu() 回调。)

经常用到的菜单选项

image-20200814081705035

图标与文本

image-20200814082007645

Optionmenu菜单项选中方法

image-20200814082321074

image-20200814082330852

image-20200814082604774

第二节 上下文菜单 ContextMenu

image-20200814083225524

image-20200814083334991

1.通过调用 registerForContextMenu(),注册应与上下文菜单关联的 View 并将其传递给 View。 如果 Activity 使用 ListView 或 GridView 且您希望每个项目均提供相同的上下文菜单,请通过将 ListView 或 GridView 传递给 registerForContextMenu(),为上下文菜单注册所有项目。

2.在 Activity 或 Fragment 中实现 onCreateContextMenu() 方法。 当注册后的视图收到长按事件时,系统将调用您的 onCreateContextMenu() 方法。

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
                                ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.context_menu, menu);
}
3.实现 onContextItemSelected()

当用户选择菜单的时候,系统将调用次方法 ,一遍能够进行适当地操作

getItemId() 方法将查询所选菜单项的 ID,您应使用 android:id 属性将此 ID 分配给 XML 中的每个菜单项(如使用 XML 定义菜单部分所示)。

4.补充

如果用户选择特定的视图进行上下文操作模式

1.实现actionMode.Callback 接口 ,在回调方法汇总,您可以为上下文操作使用相关的操作.

2.当需要显示操作栏时候,请调用startActionMode

5.toast

https://developer.android.com/reference/android/widget/Toast

1.基本功能
   Context context = getApplicationContext();
    CharSequence text = "Hello toast!";
    int duration = Toast.LENGTH_SHORT;
    Toast.makeText(context, text, duration).show();

    //Toast toast = Toast.makeText(context, text, duration);
    三个参数:应用 Context、文字消息和消息框时长。
    //toast.show();
2.放置消息框
   toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0);
3.创建自定义消息框视图
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:id="@+id/custom_toast_container"
                  android:orientation="horizontal"
                  android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:padding="8dp"
                  android:background="#DAAA"
                  >
        <ImageView android:src="@drawable/droid"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:layout_marginRight="8dp"
                   />
        <TextView android:id="@+id/text"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:textColor="#FFF"
                  />
    </LinearLayout>
4.java 设置
    LayoutInflater inflater = getLayoutInflater();
    View layout = inflater.inflate(R.layout.custom_toast,
                    (ViewGroup) findViewById(R.id.custom_toast_container));

    TextView text = (TextView) layout.findViewById(R.id.text);
    text.setText("This is a custom toast");

    Toast toast = new Toast(getApplicationContext());
    toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
    toast.setDuration(Toast.LENGTH_LONG);
    toast.setView(layout);
    toast.show();

首先,使用 getLayoutInflater()(或 getSystemService())检索 LayoutInflater,然后使用 inflate(int, ViewGroup) 扩充 XML 中的布局。第一个参数是布局资源 ID,第二个参数是根视图。您可以使用此扩充后的布局在布局中查找更多 View 对象,因此现在可以捕获并定义 ImageView 和 TextView 元素的内容。最后,使用 Toast(Context) 创建一个新消息框,并设置消息框的一些属性(例如重心和时长)。接着再调用 setView(View) 并向其传递扩充后的布局。现在,您可以通过调用 show() 使用自定义布局显示消息框。

6.Gravity

作用 :用于将对象放置在可能更大的容器中的标准常量和工具。

https://developer.android.com/reference/android/view/Gravity

7.实例代码

1.基础上下文菜单代码实现

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.ActionMode;
import android.view.*;
import android.widget.AdapterView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        View viewContext = findViewById(R.id.buttoncontext);
//        1.注册点击事件
        registerForContextMenu(viewContext);
    }
    //创建上下文菜单
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.context_menu, menu);
    }
    //实现 onContextItemSelected()
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
        Context context = getApplicationContext();
        CharSequence[] text = {"Hello toast!", "Delete!"};
        int duration = Toast.LENGTH_SHORT;
        Toast toast1 = Toast.makeText(context, text[0], duration);
        Toast toast2 = Toast.makeText(context, text[1], duration);
        switch (item.getItemId()) {
            case R.id.edit:
                editNote(toast1);
                return true;
            case R.id.delete:
                deleteNote(toast2);
                return true;
            default:
                return super.onContextItemSelected(item);
        }
    }
    //onContextItemSelected 方法
    private void deleteNote(Toast info) {
        info.show();
    }
    private void editNote(Toast info) {
        info.show();
    }
}

2.上下文操作模式

再次之前,我们先学习几个个API

public final Activity getActivity () 返回此片段当前与之关联的活动。
    startActionMode(ActionMode.Callback callback, int type)
启动给定类型的操作模式。

ActionMode表示用户界面的上下文模式。动作模式可用于提供替代的交互模式,并替换普通UI的某些部分,直到完成为止。良好动作模式的示例包括文本选择和上下文动作。

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.ActionMode;
import android.view.*;
import android.widget.AdapterView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private ActionMode actionMode;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        View viewContext = findViewById(R.id.buttoncontext);
        //1.注册点击事件
        viewContext.setOnLongClickListener(new View.OnLongClickListener() {
            // Called when the user long-clicks on someView
            public boolean onLongClick(View view) {
                if (actionMode != null) {
                    return false;
                }
                // Start the CAB using the ActionMode.Callback defined above
                actionMode = startActionMode(actionModeCallback);
                view.setSelected(true);
                return true;
            }
        });
    }
    //onContextItemSelected 方法
    private void deleteNote(Toast info) {
        info.show();
    }
    private void editNote(Toast info) {
        info.show();
    }
//actionMode的回调函数
    private ActionMode.Callback actionModeCallback = new ActionMode.Callback() {
        // Called when the action mode is created; startActionMode() was called
        //当action  mode  被创建的时候,startActionMode()被创建
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            // Inflate a menu resource providing context menu items
            MenuInflater inflater = mode.getMenuInflater();
            inflater.inflate(R.menu.context_menu, menu);
            return true;
        }
        // Called each time the action mode is shown. Always called after onCreateActionMode, but
        // 如果该模式无效,可能会多次调用。
        //每次当action  mode   被展示的时候调用,
        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false; // Return false if nothing is done
        }
        // 当用户选择上下文菜单项时调用
        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            Context context = getApplicationContext();
            CharSequence[] text = {"Hello toast!", "Delete!"};
            int duration = Toast.LENGTH_SHORT;
            Toast toast1 = Toast.makeText(context, text[0], duration);
            Toast toast2 = Toast.makeText(context, text[1], duration);
            switch (item.getItemId()) {
                case R.id.edit:
                    editNote(toast1);
                    return true;
                case R.id.delete:
                    deleteNote(toast2);
                    return true;
                default:
                    return false;
            }
        }
        // 用户退出操作模式时调用
        @Override
        public void onDestroyActionMode(ActionMode mode) {
            actionMode = null;
        }
    };
}

还有一种就是

image-20200815081341403

这可能是在fragment中

第三种 Popupmenu

  1. 实例化 PopupMenu 及其构造函数,该函数将提取当前应用的 Context 以及应锚定菜单的 View
  2. 使用 MenuInflater 将菜单资源扩充到 PopupMenu.getMenu() 返回的 Menu 对象中。
  3. 调用 PopupMenu.show()
<ImageButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_overflow_holo_dark"
    android:contentDescription="@string/descr_overflow_button"
    android:onClick="showPopup" />
public void showMenu(View v) {
    PopupMenu popup = new PopupMenu(this, v);

    // This activity implements OnMenuItemClickListener
    popup.setOnMenuItemClickListener(this);
    popup.inflate(R.menu.actions);
    popup.show();
}

@Override
public boolean onMenuItemClick(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.archive:
            archive(item);
            return true;
        case R.id.delete:
            delete(item);
            return true;
        default:
            return false;
    }
}
package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.ActionMode;
import android.view.*;
import android.widget.AdapterView;
import android.widget.PopupMenu;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private ActionMode actionMode;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        View pop = findViewById(R.id.pop);
        pop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showMenu(v);
            }
        });
    }
//创建显示菜单,
//    1.实例化
//    2.选择相应侦听器
//    3.加载资源
//    4.展示
    public void showMenu(View v) {
        PopupMenu popup = new PopupMenu(this, v);

        // This activity implements OnMenuItemClickListener
        popup.setOnMenuItemClickListener(listener);
        popup.inflate(R.menu.actions);
        popup.show();
    }
//侦听器
    PopupMenu.OnMenuItemClickListener listener = new PopupMenu.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            CharSequence[] message = {"delete", "other"};
            switch (item.getItemId()) {
                case R.id.delete:
                    getToast(message[0]);
                    return true;
                case R.id.other:
                    getToast(message[1]);
                    return true;
                default:
                    return false;
            }
        }
    };
//打印相应的字幕
    public Toast getToast(CharSequence message) {
        Context context = getApplicationContext(  );
        CharSequence text = message;
        int duration = Toast.LENGTH_SHORT;
        Toast toast = Toast.makeText(context, text, duration);
        toast.show();
        return toast;
    }
}

第三章 常见问题与经验分析

1.动态生成

使用java代码

如果是静态就使用XML

image-20200814085706066

动静结合

image-20200814085800578

image-20200814085910156

java 的动静结合非常的灵活,MVC 模式, 当我们需要使用到XML的时候,

第四章 总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目:使用AngularJs编写的简单 益智游戏(附源代码)  这是一个简单的 javascript 项目。这是一个拼图游戏,也包含一个填字游戏。这个游戏玩起来很棒。有两个不同的版本可以玩这个游戏。你也可以玩填字游戏。 关于游戏 这款游戏的玩法很简单。如上所述,它包含拼图和填字游戏。您可以通过移动图像来玩滑动拼图。您还可以选择要在滑动面板中拥有的列数和网格数。 另一个是填字游戏。在这里你只需要找到浏览器左侧提到的那些单词。 要运行此游戏,您需要在系统上安装浏览器。下载并在代码编辑器中打开此项目。然后有一个 index.html 文件可供您修改。在命令提示符中运行该文件,或者您可以直接运行索引文件。使用 Google Chrome 或 FireFox 可获得更好的用户体验。此外,这是一款多人游戏,双方玩家都是人类。 这个游戏包含很多 JavaScript 验证。这个游戏很有趣,如果你能用一点 CSS 修改它,那就更好了。 总的来说,这个项目使用了很多 javascript 和 javascript 库。如果你可以添加一些具有不同颜色选项的级别,那么你一定可以利用其库来提高你的 javascript 技能。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值