gpt4 book ai didi

android - 如何在未附加到 Activity 的 View 中选择和复制文本?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:15:07 25 4
gpt4 key购买 nike

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

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

发生这种情况是因为我的 View 未附加到 Activity 吗?我曾经使用 Activity 和文本选择来实现我的 float View ,但我最近更改为这种“无 Activity ”方法,因为我不想在显示/隐藏时处理所有不必要的 Activity 生命周期管理查看。

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

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

编辑 2:这是一个显示问题的示例项目:https://github.com/chinhodado/floating_test .运行它时,您会发现无法从 EditText 和 WebView 选择和复制文本。

最佳答案

关于是否可以从服务创建 View 的问题有很多争论。问题是您不能真正拥有完整的功能,这可能是您现在面临的文本不可选择或不可复制的问题。我比较确定这是因为回调没有注册到正在运行的 Activity 实例。

正如这个问题的答案中所述,从服务创建 View “违反了 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

你会发现你需要一个“ View 树”,它通常附加到一个 Activity 上以具有功能

一旦您创建了 View 树,通常您可能希望执行几种类型的常见操作:

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

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

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

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

祝你有美好的一天。

关于android - 如何在未附加到 Activity 的 View 中选择和复制文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34126198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com