如何select和复制未附加到活动的视图中的文本?

我正在创build一个像这样的“浮动”WebView:

public class MyService extends Service { public static WindowManager windowManager; public static LinearLayout mainView; public WebView webView; @Override public void onCreate() { super.onCreate(); windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); // main view mainView = (LinearLayout) inflater.inflate(R.layout.popup, null); WindowManager.LayoutParams mainViewParams = new WindowManager.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, PixelFormat.TRANSLUCENT); windowManager.addView(mainView, mainViewParams); // main view - web views webView = (WebView) mainView.findViewById(R.id.webView1); webView.setWebViewClient(new WebViewClient()); } } 

主视图是一个包含WebView的LinearLayout。 主视图在创build服务时显示,并且不附加到任何活动。 由于WindowManager.LayoutParams.TYPE_PHONE标志,视图可以浮在其他活动之上。

问题是,我无法selectWebView中显示的任何文本。 如果我坚持一个字,那么select会很快消失。 用于复制文本等的操作栏不显示,棉花糖的上下文菜单也不显示。

这是因为我的观点没有附加到一个活动? 我曾经实现我的浮动视图使用活动和文本select工作正常,但我最近更改为这种“没有活动”的方法,因为我不想处理所有不必要的活动生命周期pipe理时,我显示/隐藏视图。

我怎样才能回到文本select(在我的WebView)?

编辑 :这个问题不是特定于WebView的。 我在主视图中添加了一个EditText,我也无法从中select文本

编辑2 :这是一个示例项目,显示问题: https : //github.com/chinhodado/floating_test 。 当你运行它时,你会发现从EditText和WebView中select和复制文本是不可能的。

Solutions Collecting From Web of "如何select和复制未附加到活动的视图中的文本?"

关于您是否可以从服务创build视图的问题存在很多争议。 问题是,你真的不能真正有完整的function,这可能是你现在面临的问题,文本不可选或可复制。 我相对确定它是因为callback没有注册到正在运行的活动实例。

正如在这个问题的答案中指出的那样,从服务中创build一个观点是“违反Google准则”

如何显示来自服务的对话框

这里人们正在争论,但最终这实际上是违反Google指南。 您可以尝试使其工作,但是您的应用程序不会将其发送到Play商店。

从服务开始查看?

如果你也读过这个: https : //developer.android.com/reference/android/view/View.html

你会发现你需要一个“视图树”,通常附加到一个活动有function

一旦你创build了一个视图树,通常有几种常见的操作你可能想要执行:

设置属性 :例如设置TextView的文本。 可用的属性和设置它们的方法在视图的不同子类中会有所不同。 请注意,构build时已知的属性可以在XML布局文件中设置。

集中焦点 :框架将响应用户input来处理移动焦点。 要将焦点强制到特定视图,请调用requestFocus()。

设置监听器 :视图允许客户端设置在视图发生有趣的事情时将被通知的监听器。 例如,所有的视图都可以让你设置一个监听器,当视图获得或失去焦点时得到通知。 你可以使用setOnFocusChangeListener(android.view.View.OnFocusChangeListener)来注册这样一个监听器。 其他视图子类提供更专业的听众。 例如,一个button暴露一个监听器来通知客户端点击button。

设置可见性 :您可以使用setVisibility(int)隐藏或显示视图。

祝你今天愉快。