Java WebView从另一个类加载url

Java WebView从另一个类加载url,java,android,xml,eclipse,Java,Android,Xml,Eclipse,我想使用activity_main.xml中名为refresh的actionbar按钮在单击时加载url。webview位于fragmenttab1.xml 我该怎么做 编辑 MainActivity.java中操作栏菜单的代码 @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will

我想使用activity_main.xml中名为refresh的actionbar按钮在单击时加载url。webview位于fragmenttab1.xml

我该怎么做

编辑

MainActivity.java中操作栏菜单的代码

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_refresh) {
            FragmentTab1 rld1 = new FragmentTab1();
            rld1.webViewRefresh();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
在FragmentTab1.xml中

public class FragmentTab1 extends Fragment {

    WebView webView;

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        // get the url to open
        // set up the WebView
        webView = (WebView) getView().findViewById(R.id.webView);
        webView.setWebViewClient(new MyBrowser());
        webView.getSettings().setLoadsImagesAutomatically(true);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);  
        webView.loadUrl("http://192.168.1.4/index.html");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // Get the view from fragmenttab1.xml
        View view = inflater.inflate(R.layout.fragmenttab1, container, false);
        return view;
    }
    private class MyBrowser extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
           view.loadUrl(url);
           return true;
        }
    }

    @Override
    public void onPause() {
        super.onPause();  // Always call the superclass method first
        webViewRefresh();
        //webView.loadUrl("http://192.168.1.4/index.html");
    }

    public void webViewRefresh() {
        webView.loadUrl("http://192.168.1.4/index.html");
    }


}
LogCat

11-27 01:02:20.555: E/AndroidRuntime(31088): FATAL EXCEPTION: main
11-27 01:02:20.555: E/AndroidRuntime(31088): java.lang.NullPointerException
11-27 01:02:20.555: E/AndroidRuntime(31088):    at com.cn1304w.munch.FragmentTab1.webViewRefresh(FragmentTab1.java:53)
11-27 01:02:20.555: E/AndroidRuntime(31088):    at com.cn1304w.munch.MainActivity.onOptionsItemSelected(MainActivity.java:44)
11-27 01:02:20.555: E/AndroidRuntime(31088):    at android.app.Activity.onMenuItemSelected(Activity.java:2640)
11-27 01:02:20.555: E/AndroidRuntime(31088):    at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:373)
11-27 01:02:20.555: E/AndroidRuntime(31088):    at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1171)
11-27 01:02:20.555: E/AndroidRuntime(31088):    at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
11-27 01:02:20.555: E/AndroidRuntime(31088):    at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
11-27 01:02:20.555: E/AndroidRuntime(31088):    at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
11-27 01:02:20.555: E/AndroidRuntime(31088):    at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:630)
11-27 01:02:20.555: E/AndroidRuntime(31088):    at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:200)
11-27 01:02:20.555: E/AndroidRuntime(31088):    at android.view.View.performClick(View.java:4475)
11-27 01:02:20.555: E/AndroidRuntime(31088):    at android.view.View$PerformClick.run(View.java:18786)
11-27 01:02:20.555: E/AndroidRuntime(31088):    at android.os.Handler.handleCallback(Handler.java:730)
11-27 01:02:20.555: E/AndroidRuntime(31088):    at android.os.Handler.dispatchMessage(Handler.java:92)
11-27 01:02:20.555: E/AndroidRuntime(31088):    at android.os.Looper.loop(Looper.java:137)
11-27 01:02:20.555: E/AndroidRuntime(31088):    at android.app.ActivityThread.main(ActivityThread.java:5419)
11-27 01:02:20.555: E/AndroidRuntime(31088):    at java.lang.reflect.Method.invokeNative(Native Method)
11-27 01:02:20.555: E/AndroidRuntime(31088):    at java.lang.reflect.Method.invoke(Method.java:525)
11-27 01:02:20.555: E/AndroidRuntime(31088):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
11-27 01:02:20.555: E/AndroidRuntime(31088):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
11-27 01:02:20.555: E/AndroidRuntime(31088):    at dalvik.system.NativeStart.main(Native Method)

您需要一个引用或使用FragmentManager获取片段。然后需要调用片段中的方法来刷新webview

在活动中选择的OnOptions项目中:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    case R.menu.refresh:
          fragmentReference.webViewRefresh();
    return super.onOptionsItemSelected(item);
}
关于片段方法:

public void webViewRefresh() {
    this.webview.loadUrl(this.webURL);
}
查看您的
FragmentTab1.java
第53行,您正在对一个空对象执行某些操作,因此出现了
NullPointerException

我打赌你的
webView
对象为空

我认为您的以下代码应该在
onViewCreated()
中,而不是在
onActivityCreated()
中:


使用调试器跟踪对象的值并修复错误。

使用ButterKnife和Otto,这实际上相当简单:

public class WebViewFragment extends Fragment
{
   private Handler webViewHandler = new Handler(Looper.myLooper());

   public static class RefreshEvent
   {
   }

   private enum WebViewStateHolder
   {
        INSTANCE;

        private Bundle bundle;

        public void saveWebViewState(WebView webView)
        {
            bundle = new Bundle();
            webView.saveState(bundle);
        }

        public Bundle getBundle()
        {
            return bundle;
        }
    }

    @InjectView(R.id.webview)
    public WebView webView;

    public WebViewFragment()
    {
    }

    @Override
    public void onResume()
    {
        super.onResume();
        SingletonBus.INSTANCE.getBus().register(this);
    }

    @Override
    public void onPause()
    {
        SingletonBus.INSTANCE.getBus().unregister(this);
        WebViewStateHolder.INSTANCE.saveWebViewState(webView);
        super.onPause();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState)
    {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        ButterKnife.inject(this, rootView);

        WebSettings webSettings = webView.getSettings();
        ....
        if(WebViewStateHolder.INSTANCE.getBundle() == null)
        {
            webView.loadUrl("http://192.168.1.4/index.html");
        }
        else
        {
            webView.restoreState(WebViewStateHolder.INSTANCE.getBundle());
        }
        return rootView;        
    }

    @Subscribe
    public void handleRefreshEvent(RefreshEvent e)
    {
        webViewHandler.post(new Runnable()
        {
           @Override
           public void run()
           {
               webView.loadUrl("http://192.168.1.4/index.html");
           }
        }
    }
}
而且

public enum SingletonBus
{
    INSTANCE;

    private Bus bus;

    private SingletonBus()
    {
        this.bus = new Bus(ThreadEnforcer.ANY);
    }

    public Bus getBus()
    {
        return bus;
    }
}
那你就可以了

    if (id == R.id.action_refresh) {
        SingletonBus.INSTANCE.getBus().post(new WebViewFragment.RefreshEvent());
        return true;
    }
    return super.onOptionsItemSelected(item);

onOptionsItemSelected()
WebView.loadUrl()
?@shkschneider中,它似乎无法工作。在来这里之前我已经试过很多次了,你应该发布你的实际(非工作)代码,这样你就可以修复它了@shkschneider我刚刚在代码中编辑好了。你的代码应该可以工作。那么,请进一步解释问题的症状是什么?Logcat?空白页?我改为onViewCreated,现在当
NullPointerException
被修复后,我得到了一个@shkschneider的空白页。现在由您来找出页面空白的原因。是
http://192.168.1.4/index.html
空白页?不管怎么说,这是你们在这里问的另一个问题。好的,空白页现在被修复了。然而,我仍然得到错误public void webViewRefresh(){webView.loadUrl(“);},这就是我在FragmentTab1.java@shkschneider中使用的
public enum SingletonBus
{
    INSTANCE;

    private Bus bus;

    private SingletonBus()
    {
        this.bus = new Bus(ThreadEnforcer.ANY);
    }

    public Bus getBus()
    {
        return bus;
    }
}
    if (id == R.id.action_refresh) {
        SingletonBus.INSTANCE.getBus().post(new WebViewFragment.RefreshEvent());
        return true;
    }
    return super.onOptionsItemSelected(item);