将项目添加到全局上下文菜单(Android)

9

当您在Android上长按某个物品时,会出现一个上下文菜单。我想为系统中所有的TextViews添加一些内容到这个上下文菜单中。

例如,系统使用复制和粘贴来实现此功能。我想添加自己的内容,并让它出现在每个应用程序中。


1
对于现在浏览此问题的任何人,答案在这里:https://dev59.com/5Gcs5IYBdhLWcg3wRBxQ - Richard Friedman
5个回答

8

在您的android-manifest.xml文件中添加intent-filter:

<activity
   android:name=".ProcessTextActivity"
   android:label="@string/process_text_action_name">
  <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>

在onCreate()方法中,获取用户在您的应用程序中活动中突出显示的文本:
  @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.process_text_main);
    CharSequence text = getIntent()
      .getCharSequenceExtra(Intent.EXTRA_PROCESS_TEXT);
    // process the text
}

关于medium的更多信息,请参见文章。

感谢用户YungBlade

他在ru.stackoverflow.com上的回答。


5
目前,Android不支持全局覆盖或挂钩功能,除非特定活动实现您公开的意图或活动。即使发布意图也无关紧要,除非运行的应用程序是使用者...并且所有基本系统应用程序以及显然在你之前的所有应用程序都不会没有更新应用程序来消耗。
基本上,按照现有情况,这是不可能的。
你想通过这个全局上下文菜单实现什么目标?一些全球“搜索”或“发送到”功能穿过你的应用程序吗?

谢谢。我正在尝试制作一个可以翻译任何TextView的翻译应用程序 - 你可以长按,选择翻译,选择语言,然后它会出现在TextView中。我也可以看到它在其他地方也很有用。 啊,好吧。谢谢,艾萨克·沃勒 http://www.isaacwaller.com/ - Isaac Waller
哦,那会很不错...你应该发布一个意图,这样人们就可以订阅了。如果有的话,我可能会在我的应用程序中使用它,仅供参考。祝好运! - Quintin Robinson
可以实现,只是不太美观 :-\ - haseman

0

嗯,我不确定你是否可以像示例中那样扩展内置类型。Ruby 可以这样做(我的 Java 知识不够深入)。

但是,你可以从 TextView 派生出自己的 MyTextView。然后将所有布局中的 TextView 替换为它:

<TextView android:id="@+id/TextView01" />

<com.mydomain.mypackage.MyTextView android:id="@+id/TextView01" />

自动更改所有这些字段的类型。

然后您需要覆盖所有构造函数(特别是TextView(Context context, AttributeSet attrs))。

之后,所有布局填充器(自动或手动)都将轻松创建此类型。

然后,您可以根据需要创建/注册上下文菜单回调。


2
这仅适用于他应用程序/布局中的TextView。他想要向所有应用程序添加一些内容,包括那些他没有编写的应用程序。除非TextView使用某些内部Intent来构建其操作列表,否则似乎无法进入其中。 - Ry4an Brase
这样做不会让你能够在其他应用程序中查看某人的密码吗?如果你可以附加到所有带有上下文菜单的TextView,那么也有可能将其内容转储出来... - Marcin Gil
1
在Android中,如果有适当的权限,可以观看某人的密码。 - Isaac Waller

0

这可能有些hacky,但您可以在应用程序/活动级别捕获菜单键,检查当前活动视图是否为文本输入视图,然后构建并显示自己的自定义弹出菜单。

虽然有点棘手,但是这是可能的。

如果您创建/填充TextView,请在其上调用setFocusable(false),然后将其设置为活动视图,Activity仍将接收关键事件。您需要手动转发所有这些事件(轨迹球、触摸、键)到您的View树中。(在您的"onKeyDown"函数中,您必须为顶层View调用相应的"onKeyDown"方法)您有效地需要捕获'焦点'的概念,并将其分配给正确的视图。

尽管有些不美观,但它可能会给您带来所需的结果。

然而,这只适用于您自己的应用程序。之前的答案正确,无法在整个手机上实现。


这在你没有构建的应用程序上如何工作?如果你打开浏览器并选择导航文本视图,更不用说此时你的活动已经消失了...你如何附加和接收事件? - Quintin Robinson

0

在选择菜单中点击分享按钮(三个点的树形图标)。然后您应该选择您自己的应用程序。不幸的是,它不能用于输入字段内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接