如何在全球长按上下文菜单中添加自定义项目,如翻译和维基百科

时间:2016-02-24 17:15:40

标签: android contextmenu

enter image description here

我想知道谷歌翻译和维基百科应用程序如何在webview长按上下文菜单中添加他们的项目。 附:此屏幕截图来自Nexus 5 6.0.1版本。

2 个答案:

答案 0 :(得分:5)

他们通过ACTION_PROCESS_TEXT添加了支持<intent-filter>的活动:

<intent-filter >
    <action android:name="android.intent.action.PROCESS_TEXT"/>
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="text/plain" />
</intent-filter>

在发送到活动的Intent上(通过getIntent()获得),EXTRA_PROCESS_TEXT会保留一些文字,如果文字是只读的,EXTRA_PROCESS_TEXT_READONLY会保留该文字。当用户选择启动此活动的菜单选项时,文本将突出显示。

活动将通过startActivityForResult()调用。结果Intent可以有自己的EXTRA_PROCESS_TEXT值,这将是替换文本。

答案 1 :(得分:1)

一个完整的例子:

AndroidManifest.xml - 特定于活动的代码:

<activity
    android:name=".Activity"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.PROCESS_TEXT" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>

Activity.java 中 - 特定于onResume()的代码:

@Override
protected void onResume() {
    super.onResume();


    // Get Intent
    Intent intent = getIntent();
    // Clear the intent to prevent again receiving on resuming Main
    setIntent(new Intent());

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M &&
            intent.getAction().equals(Intent.ACTION_PROCESS_TEXT) &&
            intent.hasExtra(Intent.EXTRA_PROCESS_TEXT)) {
        // Text received for processing in readonly - i.e. from non-editable EditText
        boolean textToProcessIsReadonly = intent.getBooleanExtra(Intent.EXTRA_PROCESS_TEXT_READONLY, false);
        // Text received for processing
        CharSequence textToProcess = intent.getCharSequenceExtra(Intent.EXTRA_PROCESS_TEXT);
    }
}

Activity.java 中 - 发回已处理文本的代码:

private void sendProcessedText() {
    Intent intent = new Intent();
    intent.putExtra(Intent.EXTRA_PROCESS_TEXT, textProcessed);
    setResult(RESULT_OK, intent);
    super.finish();
}