Reputation: 6436
When I'm testing my new update to my application for Android, the application crashes upon start when it trying to start the "optionsmenu" (what I know). Here's the code:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
Toast.makeText(this, "GPS'n är aktiverad på din mobilenhet", Toast.LENGTH_SHORT).show();
}else{
showGPSDisabledAlertToUser();
}
setContentView(R.layout.about);
Button b = (Button) findViewById(R.id.menuItem1);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
Intent i = new Intent(nowActivity.this, About.class);
startActivity(i);
}
});
}
And the LogCat:
04-04 00:50:27.324: D/LocationManager(870): Constructor: service = android.location.ILocationManager$Stub$Proxy@44e95640
04-04 00:50:27.374: D/AndroidRuntime(870): Shutting down VM
04-04 00:50:27.374: W/dalvikvm(870): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
04-04 00:50:27.374: E/AndroidRuntime(870): Uncaught handler: thread main exiting due to uncaught exception
04-04 00:50:27.384: E/AndroidRuntime(870): java.lang.RuntimeException: Unable to start activity ComponentInfo{weather.right.now/weather.right.nowActivity}: java.lang.NullPointerException
04-04 00:50:27.384: E/AndroidRuntime(870): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
04-04 00:50:27.384: E/AndroidRuntime(870): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
04-04 00:50:27.384: E/AndroidRuntime(870): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
04-04 00:50:27.384: E/AndroidRuntime(870): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
04-04 00:50:27.384: E/AndroidRuntime(870): at android.os.Handler.dispatchMessage(Handler.java:99)
04-04 00:50:27.384: E/AndroidRuntime(870): at android.os.Looper.loop(Looper.java:123)
04-04 00:50:27.384: E/AndroidRuntime(870): at android.app.ActivityThread.main(ActivityThread.java:4363)
04-04 00:50:27.384: E/AndroidRuntime(870): at java.lang.reflect.Method.invokeNative(Native Method)
04-04 00:50:27.384: E/AndroidRuntime(870): at java.lang.reflect.Method.invoke(Method.java:521)
04-04 00:50:27.384: E/AndroidRuntime(870): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
04-04 00:50:27.384: E/AndroidRuntime(870): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
04-04 00:50:27.384: E/AndroidRuntime(870): at dalvik.system.NativeStart.main(Native Method)
04-04 00:50:27.384: E/AndroidRuntime(870): Caused by: java.lang.NullPointerException
04-04 00:50:27.384: E/AndroidRuntime(870): at weather.right.nowActivity.onCreate(nowActivity.java:37)
04-04 00:50:27.384: E/AndroidRuntime(870): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-04 00:50:27.384: E/AndroidRuntime(870): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
04-04 00:50:27.384: E/AndroidRuntime(870): ... 11 more
04-04 00:50:27.404: I/dalvikvm(870): threadid=7: reacting to signal 3
04-04 00:50:27.424: E/dalvikvm(870): Unable to open stack trace file '/data/anr/traces.txt': Permission denied
I'm currently learning to build a proper Android application so I don't know what's wrong here. Do you know what's wrong?
Thanks in advance!
EDIT: About.java
package weather.right;
import weather.right.now.R;
import android.app.Activity;
import android.os.Bundle;
public class About extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.about);
}
}
EDIT: nowActivity.java
package weather.right;
// import java.util.Calendar;
import weather.right.now.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Bundle;
// import android.view.Menu;
// import android.view.MenuInflater;
// import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class nowActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
Toast.makeText(this, "GPS'n är aktiverad på din mobilenhet", Toast.LENGTH_SHORT).show();
}else{
showGPSDisabledAlertToUser();
}
setContentView(R.layout.about);
Button b = (Button) findViewById(R.id.menuItem1);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
Intent i = new Intent(nowActivity.this, About.class);
startActivity(i);
}
});
}
@Override
public void onBackPressed() {
System.exit(0);
return;
}
/*
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
// Calendar c = Calendar.getInstance();
// int year = c.get(Calendar.YEAR);
// Handle item selection
switch (item.getItemId())
{
case R.id.menuItem1:
// Toast.makeText(nowActivity.this, "Copyright " + year + " Erik Edgren", 3000).show();
setContentView(R.layout.about);
return true;
case R.id.menuItem2:
System.exit(0);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
*/
public void goToSo(View view) {
goToUrl("http://erik-edgren.nu/weather");
System.exit(0);
}
private void goToUrl(String url) {
Uri uriUrl = Uri.parse(url);
Intent launchBrowser = new Intent(Intent.ACTION_VIEW, uriUrl);
startActivity(launchBrowser);
System.exit(0);
}
private void showGPSDisabledAlertToUser(){
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setMessage("GPS-mottagaren är inte aktiverad på din mobil. För att tjänsten ska kunna hitta dig, måste den vara aktiverad.")
.setCancelable(false)
.setPositiveButton("Gå till inställningarna",
new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int id){
Intent callGPSSettingIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(callGPSSettingIntent);
System.exit(0);
}
});
alertDialogBuilder.setNegativeButton("Stäng",
new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int id){
dialog.cancel();
System.exit(0);
}
});
AlertDialog alert = alertDialogBuilder.create();
alert.show();
}
}
EDIT: AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="weather.right.now"
android:versionCode="1"
android:versionName="1.1" >
<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:icon="@drawable/sun_icon"
android:label="@string/app_name" >
<activity
android:name="weather.right.nowActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<application
android:icon="@drawable/sun_icon"
android:label="@string/app_name" >
<activity
android:name="weather.right.About"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
EDIT: about.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="252dp"
android:layout_height="wrap_content"
android:layout_margin="15dp"
android:text="@string/about" />
</LinearLayout>
Upvotes: 0
Views: 925
Reputation: 30804
Do you see the line that says Caused by: java.lang.NullPointerException
in your log? Right below that is the line at weather.right.nowActivity.onCreate(nowActivity.java:37)
This means there is a NullPointerException
being thrown at line 37
of your nowActivity
. If you double click on that line, it will open the Activity
and take you directly to where the error is being thrown. So, keep all that in mind.
One thing I notice is that you're using setContentView
twice in your onCreate
method. It looks like you'll want to use your about.xml
in your About.class
. Also, if you think the Exception
that's being thrown is caused by your Menu
, then you should post that code, as it's relevant to your OP.
It looks like line 37
has to do with starting your About.class
. Make sure you have it tagged in your Manifest
and that your Button
is a part of the Layout
you're using for your nowActivity
.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="weather.right.now"
android:versionCode="1"
android:versionName="1.1" >
<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:icon="@drawable/sun_icon"
android:label="@string/app_name" >
<activity
android:name="weather.right.nowActivity"
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="weather.right.About"
android:label="@string/app_name" />
</application>
</manifest>
Whichever Activity
you want to start first, or the one that will appear inside your app drawer, should include the Intent-Filter
tags I posted, but other Activities
don't need to include those specific tags, some may need an Intent-Filter
though. Also, everything in your AndroidManifest
should go inside ONE <manifest></manifest>
tag and ONE <application></application>
.
Upvotes: 2
Reputation: 2484
try changing this line:
Intent i = new Intent(nowActivity.this, About.class);
for Intent i = new Intent(getApplicationContext(), About.class);
and if you are in a fragment use:
Intent i = new Intent(getActivity().getApplicationContext(), About.class);
ok you are using View.onOnclickListerner.. try removing the word View. :) so it looks something like this:
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
and make sure you have the button id in your layout.
Note: since the last setContentView
you are using is: setContentView(R.layout.about);
, the id of your button MUST be in that layout.
Upvotes: 0
Reputation: 14740
Looking at your code here. You have 2 calls to setContentView which is pretty weird. I'm guessing that the about box is trying to be displayed but I'd only have call, assuming you really wanted just setContentView(R.layout.main);
Now also I'm going to guess your NullPointerException
is because Button b = (Button) findViewById(R.id.menuItem1);
is null. I think you created a menu by creating a menu XML file in the menu/ folder. What you're really looking for is a button in the layout/main.xml
that has android:id="menuItem1"
. If that exists it'll find it, otherwise it'll return null. This code implies that it was created from a menu xml which if that's the case this is how you'd handle that.
// Load the menu into the activity. Add this code to the activity class.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.example_menu, menu);
return true;
}
// Handler for menu selections.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menuItem1: {
// do work.
} break;
default:
return super.onOptionsItemSelected(item);
}
return true;
}
Upvotes: 0