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

时间:2015-12-07 03:57:45

标签: android android-activity view webview

我正在创建一个像这样的“浮动”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。创建服务时会显示主视图,并且未附加到任何活动。由于WindowManager.LayoutParams.TYPE_PHONE标志,视图可以浮动在其他活动之上。

问题是,我无法选择WebView中显示的任何文本。如果我按住某个单词,则选择显示然后会很快消失。用于复制文本等的操作栏不会显示,也不会显示Marshmallow中的上下文菜单。

这是否发生是因为我的观点未附加到某项活动?我曾经使用活动和文本选择来实现我的浮动视图工作正常,但我最近改为这种“无活动”方法,因为当我显示/隐藏时我不想处理所有不必要的活动生命周期管理图。

如何获取文本选择(在我的WebView中)?

编辑:此问题不是特定于WebView的。 我在主视图中添加了一个EditText,我无法从中选择文字

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

1 个答案:

答案 0 :(得分:0)

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

正如在此问题的答案中所述,从服务创建视图是“违反Google准则”

How to display a Dialog from a Service

在这里,人们正在讨论它,但最终这实际上是针对谷歌指南。您可以尝试使其运行,但您的应用程序不会进入Play商店。

Starting a View from a Service?

如果您也阅读此内容:https://developer.android.com/reference/android/view/View.html

您会发现需要一个“视图树”,它通常附加到一个具有功能的活动

创建了一个视图树后,通常会有一些类型的常见操作:

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

设置焦点:框架将处理移动焦点以响应用户输入。要强制对焦于特定视图,请调用requestFocus()。

设置侦听器:视图允许客户端设置将在视图发生有趣事件时通知的侦听器。例如,所有视图都允许您设置一个侦听器,以便在视图获得或失去焦点时得到通知。您可以使用setOnFocusChangeListener(android.view.View.OnFocusChangeListener)注册这样的侦听器。其他视图子类提供更专业的侦听器。例如,Button会公开监听器,以便在单击按钮时通知客户端。

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

度过愉快的一天。