1

我正在尝试修改 Android 教程(http://developer.android.com/training/basics/firstapp/index.html),以便用户输入应用程序不会显示文本,而是加载他们输入的 url 并显示它在 Web 视图中。

这是我的目录...

    D/dalvikvm(  401): GC_CONCURRENT freed 431K, 6% free 9693K/10311K, paused 474ms+125ms, total 7912ms
    D/myfirstapp_tag( 1090): Main Line 23
    D/myfirstapp_tag( 1090): Main Line 26
    D/myfirstapp_tag( 1090): Main Line 28
    D/myfirstapp_tag( 1090): Main Line 30
    D/myfirstapp_tag( 1090): Main Line 32
    I/ActivityManager(  150): START {cmp=com.example.myfirstapp/.DisplayMessageActivity (has extras) u=0} from pid 1090
    W/WindowManager(  150): Failure taking screenshot for (246x410) to layer 21015
    I/Choreographer( 1090): Skipped 137 frames!  The application may be doing too much work on its main thread.
    D/myfirstapp_tag( 1090): Line 14
    D/myfirstapp_tag( 1090): Line 16
    D/myfirstapp_tag( 1090): Line 20
    D/myfirstapp_tag( 1090): Line 22
    D/myfirstapp_tag( 1090): Line 32
    D/myfirstapp_tag( 1090): Line 34
    D/AndroidRuntime( 1090): Shutting down VM
    W/dalvikvm( 1090): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
    E/AndroidRuntime( 1090): FATAL EXCEPTION: main
    E/AndroidRuntime( 1090): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myfirstapp/com.example                                  .myfirstapp.DisplayMessageActivity}: java.lang.NullPointerException
    E/AndroidRuntime( 1090):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
    E/AndroidRuntime( 1090):        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
    E/AndroidRuntime( 1090):        at android.app.ActivityThread.access$600(ActivityThread.java:130)
    E/AndroidRuntime( 1090):        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
    E/AndroidRuntime( 1090):        at android.os.Handler.dispatchMessage(Handler.java:99)
    E/AndroidRuntime( 1090):        at android.os.Looper.loop(Looper.java:137)
    E/AndroidRuntime( 1090):        at android.app.ActivityThread.main(ActivityThread.java:4745)
    E/AndroidRuntime( 1090):        at java.lang.reflect.Method.invokeNative(Native Method)
    E/AndroidRuntime( 1090):        at java.lang.reflect.Method.invoke(Method.java:511)
    E/AndroidRuntime( 1090):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
    E/AndroidRuntime( 1090):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    E/AndroidRuntime( 1090):        at dalvik.system.NativeStart.main(Native Method)
    E/AndroidRuntime( 1090): Caused by: java.lang.NullPointerException
    E/AndroidRuntime( 1090):        at com.example.myfirstapp.DisplayMessageActivity.onCreate(DisplayMessageActivity.java:36)
    E/AndroidRuntime( 1090):        at android.app.Activity.performCreate(Activity.java:5008)
    E/AndroidRuntime( 1090):        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
    E/AndroidRuntime( 1090):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
    E/AndroidRuntime( 1090):        ... 11 more
    W/ActivityManager(  150):   Force finishing activity com.example.myfirstapp/.DisplayMessageActivity
    W/ActivityManager(  150):   Force finishing activity com.example.myfirstapp/.MainActivity
    W/ActivityManager(  150): Activity pause timeout for ActivityRecord{415e1cc8 com.example.myfirstapp/.DisplayMessageActivity}

我在 ubuntu 上以命令行方式执行此操作,所以这是我的 ./AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
            package="com.example.myfirstapp"
            android:versionCode="1"
            android:versionName="1.0">
            <uses-permission android:name="android.permission.INTERNET" />
            <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
              <activity android:name="MainActivity" android:label="@string/app_name">
                <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
              </activity>
              <activity     android:name=".DisplayMessageActivity" android:label="@string/title_activity_display_message" >
                <meta-data  android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" />
              </activity>
            </application>
    </manifest>

这是我的 res/layout/main.xml ...

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 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:orientation="horizontal">
              <EditText android:id="@+id/edit_message"
                android:layout_weight="1"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:hint="@string/edit_message" />
              <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/button_send"
                android:onClick="sendMessage" />
    </LinearLayout>

...和我的 res/layout/webview.xml 文件:

    <?xml version="1.0" encoding="utf-8"?>
    <WebView  xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/webview"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
    />

我有两个源文件。这个 src/com/example/myfirstapp/MainActivity.java

    package com.example.myfirstapp;

    import android.app.Activity;
    import android.view.View;
    import android.content.Intent;
    import android.os.Bundle;
    import android.widget.EditText;
    import android.util.Log;

    public class MainActivity extends Activity {
            public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";

            /** Called when the activity is first created. */
            @Override
            public void onCreate(Bundle savedInstanceState) {
    Log.d ("myfirstapp_tag", "Main Line 15" );
              super.onCreate(savedInstanceState);
    Log.d ("myfirstapp_tag", "Main Line 17" );
              setContentView(R.layout.main);
    Log.d ("myfirstapp_tag", "Main Line 19" );
            }
            /** Called when the user clicks the Send button */
            public void sendMessage(View view) {
    Log.d ("myfirstapp_tag", "Main Line 23" );
              // Do something in response to button
              Intent intent = new Intent(this, com.example.myfirstapp.DisplayMessageActivity.class);
    Log.d ("myfirstapp_tag", "Main Line 26" );
              EditText editText = (EditText) findViewById(R.id.edit_message);
    Log.d ("myfirstapp_tag", "Main Line 28" );
              String message = editText.getText().toString();
    Log.d ("myfirstapp_tag", "Main Line 30" );
              intent.putExtra(EXTRA_MESSAGE, message);
    Log.d ("myfirstapp_tag", "Main Line 32" );
              startActivity(intent);
            }
    }

而这个... src/com/example/myfirstapp/DisplayMessageActivity.java

    package com.example.myfirstapp;
    import android.app.Activity;
    import android.content.Intent;
    import android.widget.TextView;
    import android.view.View;
    import android.webkit.WebView;
    import android.os.Bundle;
    import android.util.Log;


    public class DisplayMessageActivity extends Activity {
            @Override
            public void onCreate(Bundle savedInstanceState) {
    Log.d ("myfirstapp_tag", "Line 14" );
              super.onCreate(savedInstanceState);
    Log.d ("myfirstapp_tag", "Line 16" );

              // Get the message from the intent
              Intent intent = getIntent();
    Log.d ("myfirstapp_tag", "Line 20" );
              String message = intent.getStringExtra(com.example.myfirstapp.MainActivity.EXTRA_MESSAGE);
    Log.d ("myfirstapp_tag", "Line 22" );

              // Create the text view
    //        TextView textView = new TextView(this);
    //        textView.setTextSize(40);
    //        textView.setText(message);

              // Set the text view as the activity layout
    //        setContentView(textView);
              //WebView webView = new WebView(this); //WebView myWebView = (WebView) findViewById(R.id.webview);
    Log.d ("myfirstapp_tag", "Line 32" );
              WebView webView = (WebView) findViewById(R.id.webview); //webView = (WebView) findViewById(R.id.webview);
    Log.d ("myfirstapp_tag", "Line 34" );
              //setContentView(webView);
              webView.loadUrl(message);
    Log.d ("myfirstapp_tag", "Line 37" );
              setContentView(webView);
    Log.d ("myfirstapp_tag", "Line 39" );
            }
    }

我可以从目录中看到该行...

    WebView webView = (WebView) findViewById(R.id.webview);

...是我的应用程序正在死去的地方。我只是不明白为什么。有人可以帮我吗 :)

4

3 回答 3

3

你必须调用 setContentView(R.layout.xmlfile); 在调用此行之前,

 WebView webView = (WebView) findViewById(R.id.webview);

这是因为您试图引用已在 xml 文件中分配的资源。

但是Android如果不映射到xml文件就找不到资源。

因此,只有当您使用 xml 文件调用 setContentView 时,andorid 才会尝试WebView使用您在findViewByID(). 如果不是,它肯定会返回 NPException。

或者,如果您不想使用 xml 分配的资源,请执行此操作,

WebView webView = new WebView(this);
 webView.loadUrl(message);
 setContentView(webView);
于 2012-08-29T07:31:24.740 回答
2

你忘了打电话

setContentView(R.layout.webview);
于 2012-08-29T07:55:25.807 回答
1

代替

WebView webView = (WebView) findViewById(R.id.webview);

将其更改为

WebView webView = new WebView(this);

然后打电话

setContentView(w);

或者

your_layout.xml, 应该包含 webview

onCreate()这个DisplayActivity应该首先调用

setContentView(R.layout.your_layout);

然后你可以打电话

WebView webView = (WebView) findViewById(R.id.webview);

现在您可以在WebView对象中进行操作

于 2012-08-29T07:32:51.690 回答