从静态片段调用webview中的JS函数

我正在尝试通过选择“固定标签+ swype”的导航类型来创建我的项目时自动为我设置的表格活动。 在每个选项卡中,我加载了一个基于选项卡更改URL的webview。 在一个选项卡中虽然我想调用一个存在于webview的页面上的JS函数。 我尝试了各种各样没有运气的东西,JS函数可以工作,但由于某些原因它没有被调用。

下面代码中的url不是我实际使用的URL,这里也是JS函数的参考

function callFromActivity(msg){ document.getElementById("mytext").innerHTML = msg; } public class MainActivity extends FragmentActivity implements ActionBar.TabListener { /** * The {@link android.support.v4.view.PagerAdapter} that will provide * fragments for each of the sections. We use a * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which * will keep every loaded fragment in memory. If this becomes too memory * intensive, it may be best to switch to a * {@link android.support.v4.app.FragmentStatePagerAdapter}. */ SectionsPagerAdapter mSectionsPagerAdapter; /** * The {@link ViewPager} that will host the section contents. */ ViewPager mViewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Set up the action bar. final ActionBar actionBar = getActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); // Create the adapter that will return a fragment for each of the three // primary sections of the app. mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); // Set up the ViewPager with the sections adapter. mViewPager = (ViewPager) findViewById(R.id.pager); mViewPager.setAdapter(mSectionsPagerAdapter); // When swiping between different sections, select the corresponding // tab. We can also use ActionBar.Tab#select() to do this if we have // a reference to the Tab. mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { actionBar.setSelectedNavigationItem(position); } }); // For each of the sections in the app, add a tab to the action bar. for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { // Create a tab with text corresponding to the page title defined by // the adapter. Also specify this Activity object, which implements // the TabListener interface, as the callback (listener) for when // this tab is selected. actionBar.addTab( actionBar.newTab() .setText(mSectionsPagerAdapter.getPageTitle(i)) .setTabListener(this)); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { // When the given tab is selected, switch to the corresponding page in // the ViewPager. mViewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { } @Override public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { } /** * A {@link FragmentPagerAdapter} that returns a fragment corresponding to * one of the sections/tabs/pages. */ public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { // getItem is called to instantiate the fragment for the given page. // Return a DummySectionFragment (defined as a static inner class // below) with the page number as its lone argument. Fragment fragment = new DummySectionFragment(); Bundle args = new Bundle(); args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1); fragment.setArguments(args); return fragment; } @Override public int getCount() { // Show 5 total pages. return 5; } @Override public CharSequence getPageTitle(int position) { Locale l = Locale.getDefault(); switch (position) { case 0: return getString(R.string.title_section1).toUpperCase(l); case 1: return getString(R.string.title_section2).toUpperCase(l); case 2: return getString(R.string.title_section3).toUpperCase(l); case 3: return getString(R.string.title_section4).toUpperCase(l); case 4: return getString(R.string.title_section5).toUpperCase(l); } return null; } } /** * A dummy fragment representing a section of the app, but that simply * displays dummy text. */ public static class DummySectionFragment extends Fragment { /** * The fragment argument representing the section number for this * fragment. */ public static final String ARG_SECTION_NUMBER = "section_number"; public DummySectionFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_main_dummy, container, false); View htmlView =inflater.inflate(R.layout.home_wvtc,container,false); WebView wc = (WebView) htmlView.findViewById(R.id.webView1); TextView dummyTextView = (TextView) rootView.findViewById(R.id.section_label); // dummyTextView.setText(Integer.toString(getArguments().getInt(ARG_SECTION_NUMBER))); if(getArguments().getInt(ARG_SECTION_NUMBER) == 1 ) { wc.getSettings().setJavaScriptEnabled(true); wc.loadUrl("http://www.example.com/android/index.html"); wc.loadUrl("javascript:callFromActivity('some msg')"); wc.setWebViewClient(new WebViewClient(){ public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } }); return htmlView; } if(getArguments().getInt(ARG_SECTION_NUMBER) == 2 ) { wc.getSettings().setJavaScriptEnabled(true); wc.loadUrl("http://www.example.com/android/request.html"); wc.setWebViewClient(new WebViewClient(){ public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url != null ) { return false; } else { return false; } } }); return htmlView; } if(getArguments().getInt(ARG_SECTION_NUMBER) == 3 ) { wc.getSettings().setJavaScriptEnabled(true); wc.loadUrl("http://www.example.com/android/recent.html"); wc.setWebViewClient(new WebViewClient(){ public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url != null ) { return false; } else { return false; } } }); return htmlView; } if(getArguments().getInt(ARG_SECTION_NUMBER) == 4 ) { wc.getSettings().setJavaScriptEnabled(true); wc.loadUrl("http://www.example.com/android/queue.html"); wc.setWebViewClient(new WebViewClient(){ public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url != null ) { return false; } else { return false; } } }); return htmlView; } if(getArguments().getInt(ARG_SECTION_NUMBER) == 5 ) { wc.getSettings().setJavaScriptEnabled(true); wc.loadUrl("http://www.example.com/android/webcam.html"); wc.setWebViewClient(new WebViewClient(){ public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url != null ) { return false; } else { return false; } } }); return htmlView; } else { return rootView; } } } } 

在执行java脚本之前,您应该等待文档加载完成。 您可以使用WebChromeClient来查看加载进度。

 private class MyWebChromeClient extends WebChromeClient { private WebView mWebView; public MyWebChromeClient(WebView webView) { mWebView = webView; } @Override public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); if (newProgress == 100) { mWebView.loadUrl("javascript:callFromActivity('some msg')"); } } } 

MyWebChromeClient设置为WebView

 wc.getSettings().setJavaScriptEnabled(true); wc.loadUrl("http://www.example.com/android/index.html"); wc.setWebChromeClient(new MyWebChromeClient(wc));