零:需求分析
什么是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弹框消息中套用,能套用的还有很多很多