在KitKat中调用的WebView中的startActionMode(在文本选择上),但在Marshmallow中没有

时间:2018-01-21 19:35:20

标签: android android-webview android-6.0-marshmallow

我用

package com.example.test07;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ";
        String c = "<p>"+s+s+s+"</p>"+"<p>"+s+s+"</p>";

        WebView gd_web = (WebView) findViewById(R.id.gd_web);

        gd_web.loadDataWithBaseURL("file:///", c, "text/html", "utf-8", null);
    }

}

拦截WebView中的文本选择。 不幸的是,这个适用于Android 4.0.4 ICS和Android 4.4.4 KitKat的代码在Android 6.0.1,Marshmallow上不起作用。

在Android 6.0.1上,当用户长按文本中的单词时,不会调用回调的重写方法(onCreateActionMode(),onPrepareActionMode(),onActionItemClicked()...)内的调试行。

我在代码下方发布以重现该问题。

班级 MainActivity

package com.example.test07;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ActionMode.Callback;
import android.webkit.WebView;


public class CustomWebView extends WebView {

    public CustomWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    @Override
    public ActionMode startActionMode(Callback callback) {
        Log.w("TEST", "ææ startActionMode");
        return super.startActionMode(new ActionMode.Callback() {
            @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                Log.w("TEST", "ææ onCreateActionMode");
                return false;
            }

            @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                Log.w("TEST", "ææ onPrepareActionMode");
                return false;
            }

            @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                Log.w("TEST", "ææ onActionItemClicked");
                return false;
            }

            @Override public void onDestroyActionMode(ActionMode mode) {

            }

        });
    }

}

CustomWebView

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    tools:context="${relativePackage}.${activityClass}" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="--" />

    <com.example.test07.CustomWebView
         android:layout_width="match_parent"
         android:layout_height="0dp"
         android:layout_weight="1"
         android:id="@+id/gd_web"
        />
</LinearLayout>

和测试布局 activity_main.xml

// Variables on an object must have unique names
var originalWidth0:int = button1.width / button1.scaleX;
var originalHeight0:int = button1.height / button1.scaleY;

var originalWidth1:int = button2.width / button2.scaleX;
var originalHeight1:int = button2.height / button2.scaleY;

// etc.

如何使此代码适用于最新的Android版本?

1 个答案:

答案 0 :(得分:0)

Android的最新版本将调用此方法的startActionMode(ActionMode.Callback, int)版本。

https://issuetracker.google.com/issues/79394037

  

此外,在API级别17和19上,WebView与当前的WebView有很大不同,基于Chromium的可更新WebView在L及更高版本上,因此我们无法为此做任何事情。这可能就是为什么在这些设备上未调用startActionMode()的原因。

     

另一方面,如果要支持23级及以上的API,则还需要覆盖另一个startActionMode(ActionMode.Callback,int)。