Android WebView loadURL崩溃的应用程序?

时间:2014-05-15 19:41:18

标签: java android

我有这段代码:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    WebView siteViewer = (WebView) findViewById(R.id.webView);
    if(siteViewer != null)
        siteViewer.loadUrl("http://www.website.com");

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment())
                .commit();


    }
}

这是默认的Android应用程序代码,除了:

    WebView siteViewer = (WebView) findViewById(R.id.webView);
    if(siteViewer != null)
        siteViewer.loadUrl("http://www.website.com");

siteViewer始终为null。如果我不使用if()语句,应用会在打开时立即崩溃,否则只会跳过loadURL

我在这里发现了类似的错误:

https://code.google.com/p/android/issues/detail?id=11533

显然有些操作系统不允许这样做?我在模拟器中运行4.4.2。我也用4.1.2的摩托罗拉Razr试了一下,得到了相同的结果


注释掉行if(siteViewer != null),这是logcat:

05-15 16:05:35.112: D/AndroidRuntime(1201): Shutting down VM
05-15 16:05:35.112: W/dalvikvm(1201): threadid=1: thread exiting with uncaught exception (group=0xada41ba8)
05-15 16:05:35.142: E/AndroidRuntime(1201): FATAL EXCEPTION: main
05-15 16:05:35.142: E/AndroidRuntime(1201): Process: com.example.webviewtest, PID: 1201
05-15 16:05:35.142: E/AndroidRuntime(1201): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.webviewtest/com.example.webviewtest.MainActivity}: java.lang.NullPointerException
05-15 16:05:35.142: E/AndroidRuntime(1201):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
05-15 16:05:35.142: E/AndroidRuntime(1201):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
05-15 16:05:35.142: E/AndroidRuntime(1201):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
05-15 16:05:35.142: E/AndroidRuntime(1201):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
05-15 16:05:35.142: E/AndroidRuntime(1201):     at android.os.Handler.dispatchMessage(Handler.java:102)
05-15 16:05:35.142: E/AndroidRuntime(1201):     at android.os.Looper.loop(Looper.java:136)
05-15 16:05:35.142: E/AndroidRuntime(1201):     at android.app.ActivityThread.main(ActivityThread.java:5017)
05-15 16:05:35.142: E/AndroidRuntime(1201):     at java.lang.reflect.Method.invokeNative(Native Method)
05-15 16:05:35.142: E/AndroidRuntime(1201):     at java.lang.reflect.Method.invoke(Method.java:515)
05-15 16:05:35.142: E/AndroidRuntime(1201):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
05-15 16:05:35.142: E/AndroidRuntime(1201):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
05-15 16:05:35.142: E/AndroidRuntime(1201):     at dalvik.system.NativeStart.main(Native Method)
05-15 16:05:35.142: E/AndroidRuntime(1201): Caused by: java.lang.NullPointerException
05-15 16:05:35.142: E/AndroidRuntime(1201):     at com.example.webviewtest.MainActivity.onCreate(MainActivity.java:25)
05-15 16:05:35.142: E/AndroidRuntime(1201):     at android.app.Activity.performCreate(Activity.java:5231)
05-15 16:05:35.142: E/AndroidRuntime(1201):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
05-15 16:05:35.142: E/AndroidRuntime(1201):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
05-15 16:05:35.142: E/AndroidRuntime(1201):     ... 11 more

以下是activity_main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.webviewtest.MainActivity"
    tools:ignore="MergeRootFrame" />

以下是fragment_main.xml

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.webviewtest.MainActivity$PlaceholderFragment" >

    <WebView
        android:id="@+id/webView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true" />

</RelativeLayout>

根据给出的建议,这是包含WebView代码的PlaceHolderFragment代码,它给出了错误cannot make a static reference to the non-static method findViewById(int) from the type Activity

public static class PlaceholderFragment extends Fragment {

    public PlaceholderFragment() {

    }

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

        WebView siteViewer = (WebView) findViewById(R.id.webView);
        if(siteViewer != null)
            siteViewer.loadUrl("http://www.website.com");

        return rootView;
    }
}

4 个答案:

答案 0 :(得分:3)

在你的活动中,你正在给main_layout充气,它根本不包含WebView。因此findViewById无法找到任何内容,而siteViewer为null。

移动您的代码以将Url加载到您的片段中。 由于您使用的是PlaceHolderFragment,我猜它以后会被真实的替换。这是放置代码的地方。您可能会在片段onCreateView中为您的fragment_main.xml充气,然后您可以在片段的onResume方法中加载Url。

要查找WebView,请执行以下操作:

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

    WebView siteViewer = (WebView) rootView.findViewById(R.id.webView);
    if(siteViewer != null)
        siteViewer.loadUrl("http://www.website.com");

    return rootView;
}

注意rootView.findViewById(R.id.webView)而不是简单的findViewById(R.id.webView)。片段没有findViewById方法,但由于您自己对布局进行了充气,​​您可以使用View.findViewById。

答案 1 :(得分:1)

siteViewernull,因为在webView找不到ID = activity_main.xml的元素。请仔细检查您输入的是否正确。

答案 2 :(得分:1)

我将从我的知识中回答,因为我不知道该项目的层次结构......

I)。如果您尝试使用包中的package com.another.package来尝试访问网页浏览,请假设您在com.main.package中有活动,并且您在清单中声明的​​项目包现在为R.id.webView com.another.package它不可用,因此您将获得空指针异常,以便修复该导入com.main.package.R。*;在崩溃活动中。

II)。假设崩溃活动位于同一个包com.main.package中,则plz交叉检查dat webView中是否存在名为activity_main的webview。

III)。可能是你正在向webView转换其他布局,如webView是除了webview之外的id(但在这种情况下,你不会只为信息获取空指针异常)。

希望它有所帮助... Thx

答案 3 :(得分:0)

您是否设置了在清单文件中访问互联网的权限?

<uses-permission android:name="android.permission.INTERNET" />