Android 彩色上下文菜单 Context

简介: Android 彩色上下文菜单 Context

零:需求分析

什么是Android进程上下文?

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

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

效果如下:

 

一:功能实现

 

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

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

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

1. <TextView
2. android:id="@+id/tv"
3. android:layout_width="wrap_content"
4. android:layout_height="wrap_content"
5. android:text="Hello ZWZ!"
6. app:layout_constraintBottom_toBottomOf="parent"
7. app:layout_constraintLeft_toLeftOf="parent"
8. app:layout_constraintRight_toRightOf="parent"
9. app:layout_constraintTop_toTopOf="parent" />

 

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

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

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

 


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

1. <?xml version="1.0" encoding="utf-8"?>
2. <menu xmlns:android="http://schemas.android.com/apk/res/android">
3. 
4. <item
5. android:id="@+id/m01"
6. android:title="语言文学分院"
7.         />
8. 
9. <item
10. android:id="@+id/m02"
11. android:title="医药与健康分院"
12.         />
13. 
14. <item
15. android:id="@+id/m03"
16. android:title="建筑工程分院"
17.         />
18. 
19. <item
20. android:id="@+id/m04"
21. android:title="信息与机电工程分院"
22.         />
23. 
24. <item
25. android:id="@+id/m05"
26. android:title="腾讯云互联网学院"
27.         />
28. 
29. <item
30. android:id="@+id/m06"
31. android:title="纺织服装与艺术设计分院"
32.         />
33. 
34. </menu>

 


(3)重写 MainActivity 中 onCreateContextMenu 方法。

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

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

 


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

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

关键代码如下:

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

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

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

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

 


(5)完整代码。

1. import android.graphics.Color;
2. import android.support.v7.app.AppCompatActivity;
3. import android.os.Bundle;
4. import android.text.SpannableString;
5. import android.text.style.ForegroundColorSpan;
6. import android.view.ContextMenu;
7. import android.view.MenuItem;
8. import android.view.View;
9. import android.widget.TextView;
10. 
11. public class MainActivity extends AppCompatActivity {
12. 
13. @Override
14. protected void onCreate(Bundle savedInstanceState) {
15. super.onCreate(savedInstanceState);
16.         setContentView(R.layout.activity_main);
17. 
18. TextView textView1 = findViewById(R.id.tv);
19.         registerForContextMenu(textView1);
20. 
21.     }
22. @Override
23. public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo){
24. super.onCreateContextMenu(menu,view,menuInfo);
25.         getMenuInflater().inflate(R.menu.menu, menu);
26. 
27. MenuItem item1 = menu.findItem(R.id.m01);
28. SpannableString spannableString1 = new SpannableString(item1.getTitle());
29.         spannableString1.setSpan(new ForegroundColorSpan(Color.RED), 0, spannableString1.length(), 0);
30.         item1.setTitle(spannableString1);
31. 
32. MenuItem item2 = menu.findItem(R.id.m02);
33. SpannableString spannableString2 = new SpannableString(item2.getTitle());
34.         spannableString2.setSpan(new ForegroundColorSpan(Color.MAGENTA), 0, spannableString2.length(), 0);
35.         item2.setTitle(spannableString2);
36. 
37. MenuItem item3 = menu.findItem(R.id.m03);
38. SpannableString spannableString3 = new SpannableString(item3.getTitle());
39.         spannableString3.setSpan(new ForegroundColorSpan(Color.YELLOW), 0, spannableString3.length(), 0);
40.         item3.setTitle(spannableString3);
41. 
42. MenuItem item4 = menu.findItem(R.id.m04);
43. SpannableString spannableString4 = new SpannableString(item4.getTitle());
44.         spannableString4.setSpan(new ForegroundColorSpan(Color.GREEN), 0, spannableString4.length(), 0);
45.         item4.setTitle(spannableString4);
46. 
47. MenuItem item5 = menu.findItem(R.id.m05);
48. SpannableString spannableString5 = new SpannableString(item5.getTitle());
49.         spannableString5.setSpan(new ForegroundColorSpan(Color.LTGRAY), 0, spannableString5.length(), 0);
50.         item5.setTitle(spannableString5);
51. 
52. MenuItem item6 = menu.findItem(R.id.m06);
53. SpannableString spannableString6 = new SpannableString(item6.getTitle());
54.         spannableString6.setSpan(new ForegroundColorSpan(Color.BLUE), 0, spannableString6.length(), 0);
55.         item6.setTitle(spannableString6);
56.     }
57. }

 


二:总结

 

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

相关文章
|
8月前
|
Android开发
Android 中选项菜单(Option menu)的用法
Android 中选项菜单(Option menu)的用法
82 0
|
4月前
|
Android开发
[Android]DrawerLayout滑动菜单+NavigationView
[Android]DrawerLayout滑动菜单+NavigationView
27 0
|
4月前
|
XML Java Android开发
Android App手势冲突处理中上下左右滑动的处理以及侧滑边缘菜单的讲解及实战(附源码 可直接使用)
Android App手势冲突处理中上下左右滑动的处理以及侧滑边缘菜单的讲解及实战(附源码 可直接使用)
67 0
|
4月前
|
XML Java Android开发
Android Studio App开发中工具栏Toolbar、溢出菜单OverflowMenu、标签布局TabLayout的讲解及实战(实现京东App的标签导航栏,附源码)
Android Studio App开发中工具栏Toolbar、溢出菜单OverflowMenu、标签布局TabLayout的讲解及实战(实现京东App的标签导航栏,附源码)
62 0
|
8月前
|
Android开发
Android 中实现上下文菜单(Context menu)详解
Android 中实现上下文菜单(Context menu)详解
42 0
|
9月前
|
XML Android开发 数据格式
Android上机实验-4 菜单和对话框
Android上机实验-4 菜单和对话框
112 1
|
9月前
|
XML Java 测试技术
【Android开发日常】一文弄懂桌面图标快捷菜单 & 桌面小组件
开发可以定义快捷方式,以便在应用中执行特定操作。 这些快捷方式可在受支持的启动器或助理(如 Google 助理)中显示,方便用户快速启动应用中的常见任务或推荐任务。 通过本文你还将了解一些可提升快捷方式效果的最佳做法。
|
10月前
|
前端开发 Android开发
Android高仿qq及微信底部菜单的几种实现方式
Android高仿qq及微信底部菜单的几种实现方式
|
10月前
|
数据库 Android开发
重新构建711的Android项目(一),巧妙的小屏菜单查询框架实现
重新构建711的Android项目(一),巧妙的小屏菜单查询框架实现
|
5天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
24 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库