我有这段代码:
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;
}
}
答案 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)
siteViewer
为null
,因为在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" />