Android 彩色上下文菜單 Context

什麼是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彈框消息中套用,能套用的還有很多很多~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章