zoukankan      html  css  js  c++  java
  • Android 彩色上下文菜单 Context

    本文原创首发CSDN,链接 https://blog.csdn.net/qq_41464123/article/details/106954710 ,作者博客https://blog.csdn.net/qq_41464123 ,转载请带上本链接,尤其是脚本之家、码神岛等平台,谢谢配合。


    目录

    零:需求分析

    一:功能实现

    二:总结


    零:需求分析

    什么是Android进程上下文?

    • 它是应用程序环境的全局信息的接口。
    • 这是一个抽象类,由Android系统提供。
    • 它允许访问特定于应用程序的资源和类,以及调用应用程序级操作,如启动活动,广播和接收意图等。

    如果有这样一个需求,客户要求将Android中的“进程上下文”字体修改为某种颜色,你该如何去实现?

    效果如下:

    一:功能实现

    当用户长按组件时,弹出的菜单就是上下文菜单。

    使用菜单资源创建上下文菜单的具体步骤如下:

    (0)在XML文件中添加一个TextView,id为tv。

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello ZWZ!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    (1)在 MainActivity 的 onCreate 方法中注册上下文菜单。

    比如我在这里用文本框注册上下文菜单,使用以下代码,也就是在长按该文本框的时候,才显示上下文菜单。

        TextView textView1 = findViewById(R.id.tv);
        registerForContextMenu(textView1);

    (2)设计Menu 菜单项,放在res / menu 目录下。

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item
            android:id="@+id/m01"
            android:title="语言文学分院"
            />
    
        <item
            android:id="@+id/m02"
            android:title="医药与健康分院"
            />
    
        <item
            android:id="@+id/m03"
            android:title="建筑工程分院"
            />
    
        <item
            android:id="@+id/m04"
            android:title="信息与机电工程分院"
            />
    
        <item
            android:id="@+id/m05"
            android:title="腾讯云互联网学院"
            />
    
        <item
            android:id="@+id/m06"
            android:title="纺织服装与艺术设计分院"
            />
    
    </menu>

    (3)重写 MainActivity 中 onCreateContextMenu 方法。

    在该方法中,首先继承父类的 onCreateContextMenu 方法,然后调用 inflate() 方法解析一个菜单资源文件,并把解析后的菜单保存在menu中,关键代码如下所示:

        @Override
        public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo){
            super.onCreateContextMenu(menu,view,menuInfo);
            getMenuInflater().inflate(R.menu.menu, menu);
        }

    (4)给上下文菜单的文字添加颜色,但是Menu菜单项并没有直接添加颜色的方法。

    我们需要先把文字取出来,作为 SpannableString 保存,然后在给文字添加颜色属性后,在set回去。

    关键代码如下:

    MenuItem item1 = menu.findItem(R.id.m01);
    SpannableString spannableString1 = new SpannableString(item1.getTitle());
    spannableString1.setSpan(new ForegroundColorSpan(Color.RED), 0, spannableString1.length(), 0);
    item1.setTitle(spannableString1);

    其中R.id.m01,是menu.xml文件中的菜单项ID。

    item1.getTitle()指的是把菜单的文字取出来

    Color.RED,也可以使用Color.rgb(255,0,0)这样的RGB格式来替换。


    (5)完整代码。

    import android.graphics.Color;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.text.SpannableString;
    import android.text.style.ForegroundColorSpan;
    import android.view.ContextMenu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            TextView textView1 = findViewById(R.id.tv);
            registerForContextMenu(textView1);
    
        }
        @Override
        public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo){
            super.onCreateContextMenu(menu,view,menuInfo);
            getMenuInflater().inflate(R.menu.menu, menu);
    
            MenuItem item1 = menu.findItem(R.id.m01);
            SpannableString spannableString1 = new SpannableString(item1.getTitle());
            spannableString1.setSpan(new ForegroundColorSpan(Color.RED), 0, spannableString1.length(), 0);
            item1.setTitle(spannableString1);
    
            MenuItem item2 = menu.findItem(R.id.m02);
            SpannableString spannableString2 = new SpannableString(item2.getTitle());
            spannableString2.setSpan(new ForegroundColorSpan(Color.MAGENTA), 0, spannableString2.length(), 0);
            item2.setTitle(spannableString2);
    
            MenuItem item3 = menu.findItem(R.id.m03);
            SpannableString spannableString3 = new SpannableString(item3.getTitle());
            spannableString3.setSpan(new ForegroundColorSpan(Color.YELLOW), 0, spannableString3.length(), 0);
            item3.setTitle(spannableString3);
    
            MenuItem item4 = menu.findItem(R.id.m04);
            SpannableString spannableString4 = new SpannableString(item4.getTitle());
            spannableString4.setSpan(new ForegroundColorSpan(Color.GREEN), 0, spannableString4.length(), 0);
            item4.setTitle(spannableString4);
    
            MenuItem item5 = menu.findItem(R.id.m05);
            SpannableString spannableString5 = new SpannableString(item5.getTitle());
            spannableString5.setSpan(new ForegroundColorSpan(Color.LTGRAY), 0, spannableString5.length(), 0);
            item5.setTitle(spannableString5);
    
            MenuItem item6 = menu.findItem(R.id.m06);
            SpannableString spannableString6 = new SpannableString(item6.getTitle());
            spannableString6.setSpan(new ForegroundColorSpan(Color.BLUE), 0, spannableString6.length(), 0);
            item6.setTitle(spannableString6);
        }
    }

    二:总结

     

    彩色上下文菜单是我Android期末考试的一道基础题,我认为很有必要记录总结一下,这个不仅仅可以在上下文菜单中使用,也可以在Toast弹框消息中套用,能套用的还有很多很多~~

  • 相关阅读:
    windows系统Redis客户端连接远程服务器
    Linux安装JDK1.8示例
    Nexus OrientDB数据库变为只读 storage is switched to 'read only' mode
    在SQL中有时候我们需要查看现在正在SQL Server执行的命令
    注册asp.net 到 iis时出错中的一种的 解决办法
    python 装饰器
    python 类调用实例的方法
    linux 命令大全
    python多态
    python扩展字典的功能
  • 原文地址:https://www.cnblogs.com/yyzwz/p/13393214.html
Copyright © 2011-2022 走看看