Reputation: 10480
I am trying to modify the Android tutorial (http://developer.android.com/training/basics/firstapp/index.html) so that instead of displaying the text the user enters the app will load the url they typed and display it in a WebView.
Here is my catlog ...
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}
I doing this the command-line way on ubuntu so here's my ./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>
Here's my 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>
... and my res/layout/webview.xml file:
<?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"
/>
I have two source files. This one 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);
}
}
and this one ... 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" );
}
}
I can see from the catlog that the line ...
WebView webView = (WebView) findViewById(R.id.webview);
... is where my app is dying. I just don't understand why. Can someone help me out :)
Upvotes: 1
Views: 2787
Reputation:
Instead of
WebView webView = (WebView) findViewById(R.id.webview);
change it to
WebView webView = new WebView(this);
then call
setContentView(w);
Or
in your_layout.xml
, should contain webview
in onCreate()
of DisplayActivity
this should call first
setContentView(R.layout.your_layout);
then you can call
WebView webView = (WebView) findViewById(R.id.webview);
and you can now do operation in WebView
object
Upvotes: 1
Reputation: 54332
You have to call setContentView(R.layout.xmlfile); before calling this line,
WebView webView = (WebView) findViewById(R.id.webview);
This is because you are trying to refer to a resource which you have allocated in a xml file.
But Android can't find the resource without mapping it to the xml file.
So only when you call the setContentView with your xml file, andorid will try to look into that particular xml file for a WebView
with the ID you have specified in the findViewByID()
. if not it will return NPException definitely.
Or if you don't want to use a xml allocated resource do this,
WebView webView = new WebView(this);
webView.loadUrl(message);
setContentView(webView);
Upvotes: 3