我在 oncreate 和 onOptionsItemSelected 中有 webview 代码,它可以正常工作,如下所示。(这是我按要求工作的旧代码)
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState)
{ mwebView = (WebView) findViewById(R.id.pdf_web_view);
WebSettings settings = mwebView.getSettings();
settings.setJavaScriptEnabled(true);
mwebView.setWebChromeClient(new WebChromeClient());
mwebView.loadUrl("file://" + getFilesDir() + "/index.html");
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.action_gotopage:
LayoutInflater layoutInflater = LayoutInflater.from(this);
View input_dialogView = layoutInflater.inflate(
R.layout.gotopage_dialogbox, null);
final AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Enter the page number");
alert.setView(input_dialogView);
final EditText input = (EditText) input_dialogView
.findViewById(R.id.pagenum_edit);
input.requestFocus();
input.setTextColor(Color.BLACK);
alert.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
String pg_num = input.getText().toString();
if (pg_num.equals("")) {
input.setError("Page number Required");
} else {
mwebView.loadUrl("javascript:onGotoPage("
+ pg_num + ")");
}
}
});
alert.setNegativeButton("CANCEL",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
}
});
// create an alert dialog
AlertDialog alert1 = alert.create();
alert1.show();
return super.onOptionsItemSelected(item);
default:
return super.onOptionsItemSelected(item);
}
}
我想使用 ViewPager 将此代码转换为幻灯片页面。所以我有这样的代码(我的新代码):
MainActivity.java
public class Mainactivity extends AppCompatActivity {
private int NUM_PAGES=10;
private ViewPager mPager;
private PagerAdapter mPagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.pdf_webview);
mPager = (ViewPager) findViewById(R.id.pdf_view_pager);
mPagerAdapter = new
ScreenSlidePagerAdapter(getSupportFragmentManager());
mPager.setAdapter(mPagerAdapter);
}
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return new SlideFragment().create(position);
}
@Override
public int getCount() {
return NUM_PAGES;
}
}
}
SlideFragment.java
public class SlideFragment extends Fragment {
private static final String ARG_PAGE = "page";
private int mPageNumber;
private WebView mwebView;
public static SlideFragment create(int pageNumber) {
SlideFragment fragment = new SlideFragment();
Bundle args = new Bundle();
args.putInt(ARG_PAGE, pageNumber);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPageNumber = getArguments().getInt(ARG_PAGE);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(
R.layout.pdf_fragment_webview, container, false);
mwebView = (WebView) findViewById(R.id.pdf_web_view);
WebSettings settings = mwebView.getSettings();
settings.setJavaScriptEnabled(true);
mwebView.setWebChromeClient(new WebChromeClient());
mwebView.loadUrl("file://" + getFilesDir() + "/index.html");
mwebView.loadUrl("javascript:onGotoPage("
+ pg_num + ")");
}
}
webview.loadURL 仅第一次有效,第二次无效。但是当它在 onOptionsItemSelected 方法内部时,它工作正常。
我已经尝试了 WebView loadUrl 仅工作一次
中的所有解决方案还尝试了 onPageFinished 和评估功能。
但在我的情况下没有一个起作用。我无法弄清楚出了什么问题。
我认为 html 页面加载和 javascript 函数运行之间存在竞争条件。
建议您首先加载 html 页面,然后在 onPageFinished 回调中运行 javascript。
另外,在 webview 上运行 javascript 代码时,应该使用 evaluateJavascript 方法。
希望这有帮助。
就我而言,最简单、最有效的解决方案是在尝试加载网址之前停止任何加载:
webView.stopLoading();
webView.loadUrl(url);