当我调用webView.findAll(word);它确实显示所有出现的选项并webView.findNext(true)显示不同的背景颜色,但它不会将页面滚动到下一个选定的单词.
我必须手动滚动页面才能看到所选单词.我希望,每当我调用webView.findNext(true)它时,应自动滚动页面到下一个单词.我使用的是Android 6.0设备.我也尝试过webView.findAllAsync(word);.但是我无法将webView页面滚动到所选单词.请帮忙!
编辑:
布局文件:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white" >
<WebView android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/tv_for_dummies"
android:textColor="@android:color/black"
android:padding="7dp"/>
</ScrollView>
Run Code Online (Sandbox Code Playgroud)
menu.xml文件
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:appcompat="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/tools" >
<item
android:id="@+id/search"
android:icon="@android:drawable/ic_menu_search"
android:title="Search"
appcompat:actionViewClass="android.support.v7.widget.SearchView"
appcompat:showAsAction="ifRoom|collapseActionView"/>
<item
android:id="@+id/next"
android:icon="@android:drawable/arrow_down_float"
android:title="Next"
android:visible="false"
appcompat:showAsAction="always"/>
<item
android:id="@+id/prev"
android:icon="@android:drawable/arrow_up_float"
android:title="Previous"
android:visible="false"
appcompat:showAsAction="always"/>
</menu>
Run Code Online (Sandbox Code Playgroud)
DummiesActivity.java文件
public class DummiesActivity extends AppCompatActivity {
WebView wvDummies;
Context context;
Float scale = 0.5F;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = this;
setContentView(R.layout.dummies_guide);
wvDummies = (WebView) findViewById(R.id.tv_for_dummies);
wvDummies.getSettings().setSupportZoom(true);
wvDummies.getSettings().setBuiltInZoomControls(true);
wvDummies.getSettings().setJavaScriptEnabled(true);
wvDummies.loadData(getString(R.string.app_name123), "text/html",
"UTF-8");
getSupportActionBar().setTitle("Dummies guide");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.dummies_search_menu, menu);
SearchManager searchManager = (SearchManager) context
.getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.search)
.getActionView();
searchView.setSearchableInfo(searchManager
.getSearchableInfo(getComponentName()));
searchView.setQueryHint("Search");
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@SuppressLint("NewApi")
@Override
public boolean onQueryTextSubmit(String query) {
if (!query.isEmpty()) {
menu.findItem(R.id.next).setVisible(true);
menu.findItem(R.id.prev).setVisible(true);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
wvDummies.findAllAsync(query);
} else {
wvDummies.findAll(query);
}
try {
Method m = WebView.class.getMethod("setFindIsUp",
Boolean.TYPE);
m.invoke(wvDummies, true);
} catch (Throwable e) {
e.printStackTrace();
}
} else {
menu.findItem(R.id.next).setVisible(false);
menu.findItem(R.id.prev).setVisible(false);
}
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (newText.isEmpty()) {
try {
Method m = WebView.class.getMethod("setFindIsUp",
Boolean.TYPE);
m.invoke(wvDummies, false);
} catch (Throwable ignored) {
}
}
return true;
}
});
searchView.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
Log.d("", "setOnCloseListener called");
try {
Method m = WebView.class.getMethod("setFindIsUp",
Boolean.TYPE);
m.invoke(wvDummies, false);
} catch (Throwable ignored) {
}
return false;
}
});
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId();
switch (itemId) {
case android.R.id.home:
finish();
break;
case R.id.next:
wvDummies.findNext(true);
break;
case R.id.prev:
wvDummies.findNext(false);
break;
}
return super.onOptionsItemSelected(item);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:使用SearchView
我正在使用它SearchView,它在Moto G3 marshmallow 6.0中完美地适合我.
我的xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.peacock.myproj.MainActivity">
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
在menu.xml中:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_search"
android:title="Search"
android:icon="@drawable/abc_ic_search_api_mtrl_alpha"
app:showAsAction="ifRoom|collapseActionView"
app:actionViewClass="android.support.v7.widget.SearchView" />
</menu>
Run Code Online (Sandbox Code Playgroud)
在我的活动中:
public class MainActivity extends AppCompatActivity {
WebView mWebView;
boolean flag = false;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search));
SearchManager searchManager = (SearchManager) getSystemService(SEARCH_SERVICE);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setSubmitButtonEnabled(true);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
if (!query.isEmpty()) {
if (!flag) {
mWebView.findAllAsync(query);
flag = true;
try {
Method m = WebView.class.getMethod("setFindIsUp", Boolean.TYPE);
m.invoke(mWebView, true);
} catch (Throwable ignored) {
}
} else {
mWebView.findNext(true);
}
}
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (newText.isEmpty()) {
try {
Method m = WebView.class.getMethod("setFindIsUp", Boolean.TYPE);
m.invoke(mWebView, false);
} catch (Throwable ignored) {
}
}
flag=false;
return true;
}
});
searchView.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
try {
Method m = WebView.class.getMethod("setFindIsUp", Boolean.TYPE);
m.invoke(mWebView, false);
} catch (Throwable ignored) {
}
return false;
}
});
return true;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWebView = (WebView) findViewById(R.id.webview);
// Load the url
mWebView.loadUrl("http://stackoverflow.com/questions/38254152/android-webview-findnext-does-not-scroll-to-next-selected-word");
}
}
Run Code Online (Sandbox Code Playgroud)
通过单击"提交"按钮,您可以转到下一个单词.见下面的gif:
| 归档时间: |
|
| 查看次数: |
1039 次 |
| 最近记录: |