我用
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版本?
答案 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)。