【问题标题】:webview.loadURL doesnt work alwayswebview.loadURL 并不总是有效
【发布时间】:2017-05-16 01:22:34
【问题描述】:

我在 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 works only once的所有解决方案

还尝试了 onPageFinished 和评估函数。

但在我的情况下没有一个有效。我无法弄清楚出了什么问题。

【问题讨论】:

  • 澄清一下 - 当你说如果第二次不起作用时,你的意思是 mwebView.loadUrl("javascript:onGotoPage(" + pg_num + ")"); 没有任何效果?
  • @SimplyJaymin 是的,正确。它没有任何作用。
  • @SimplyJaymin 是的,你是对的。它没有任何效果.mwebView.loadUrl("javascript:onGotoPage(" + pg_num + ")");不过,这在以前的情况下有效。

标签: android webview


【解决方案1】:

我认为在 html 页面加载和 javascript 函数运行之间存在竞争条件。

建议您先加载 html 页面,然后在 onPageFinished 回调中运行 javascript。

另外,在 webview 上运行 javascript 代码时,你应该使用evaluateJavascript 方法。

希望这会有所帮助。

【讨论】:

  • @sandeshhegde 感谢您分享您的代码。我没有看到 onPageFinished 回调。我认为您只需要在 html 页面完成加载后运行 javascript 代码。当你加载一个 html 页面时,它需要一些时间来完成加载,只有在它加载之后,你才能执行任何 javascript 代码。请按照我的答案中列出的步骤操作。
猜你喜欢
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
  • 2015-06-28
  • 2015-12-04
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多