-4

Problem: Fail to start activity on button click from MainActiviy > MapActivity.

P/s: I following this map tutorial and changing the class name and copy all the elements to my project workspace. This Tutorial

Button listener

public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(),
                        MapActivity.class); 
                startActivity(intent);}

Logcat:

07-31 02:22:58.267: E/AndroidRuntime(20784): FATAL EXCEPTION: main
07-31 02:22:58.267: E/AndroidRuntime(20784): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.fa.financeassistant/com.fa.financeassistant.MapActivity}: java.lang.NullPointerException
07-31 02:22:58.267: E/AndroidRuntime(20784):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2308)
07-31 02:22:58.267: E/AndroidRuntime(20784):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2358)
07-31 02:22:58.267: E/AndroidRuntime(20784):    at android.app.ActivityThread.access$600(ActivityThread.java:153)
07-31 02:22:58.267: E/AndroidRuntime(20784):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
07-31 02:22:58.267: E/AndroidRuntime(20784):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-31 02:22:58.267: E/AndroidRuntime(20784):    at android.os.Looper.loop(Looper.java:137)
07-31 02:22:58.267: E/AndroidRuntime(20784):    at android.app.ActivityThread.main(ActivityThread.java:5227)
07-31 02:22:58.267: E/AndroidRuntime(20784):    at java.lang.reflect.Method.invokeNative(Native Method)
07-31 02:22:58.267: E/AndroidRuntime(20784):    at java.lang.reflect.Method.invoke(Method.java:511)
07-31 02:22:58.267: E/AndroidRuntime(20784):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
07-31 02:22:58.267: E/AndroidRuntime(20784):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
07-31 02:22:58.267: E/AndroidRuntime(20784):    at dalvik.system.NativeStart.main(Native Method)
07-31 02:22:58.267: E/AndroidRuntime(20784): Caused by: java.lang.NullPointerException
07-31 02:22:58.267: E/AndroidRuntime(20784):    at com.fa.financeassistant.MapActivity.onCreate(MapActivity.java:46)
07-31 02:22:58.267: E/AndroidRuntime(20784):    at android.app.Activity.performCreate(Activity.java:5104)
07-31 02:22:58.267: E/AndroidRuntime(20784):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
07-31 02:22:58.267: E/AndroidRuntime(20784):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2262)
07-31 02:22:58.267: E/AndroidRuntime(20784):    ... 11 more

My MapActivity Class

package com.fa.financeassistant;

import java.util.ArrayList;

import android.R.array;
import android.app.ActionBar;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.widget.ArrayAdapter;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;


public class MapActivity extends Activity {


    private final String TAG = getClass().getSimpleName();
    private GoogleMap mMap;
    private String[] places;
    private LocationManager locationManager;
    private Location loc;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mapactivity);
        initCompo();
        places = getResources().getStringArray(R.array.places);
        currentLocation();
        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
        actionBar.setListNavigationCallbacks(ArrayAdapter.createFromResource(
                this, R.array.places, android.R.layout.simple_list_item_1),
                new ActionBar.OnNavigationListener() {

                    @Override
                    public boolean onNavigationItemSelected(int itemPosition,
                            long itemId) {
                        Log.e(TAG,
                                places[itemPosition].toLowerCase().replace("-",
                                        "_"));
                        if (loc != null) {
                            mMap.clear();
                            new GetPlaces(MapActivity.this,
                                    places[itemPosition].toLowerCase().replace(
                                            "-", "_").replace(" ", "_")).execute();
                        }
                        return true;
                    }

                });

    }   

    private class GetPlaces extends AsyncTask<Void, Void, ArrayList<Place>> {

        private ProgressDialog dialog;
        private Context context;
        private String places;

        public GetPlaces(Context context, String places) {
            this.context = context;
            this.places = places;
        }

        @Override
        protected void onPostExecute(ArrayList<Place> result) {
            super.onPostExecute(result);
            if (dialog.isShowing()) {
                dialog.dismiss();
            }
            for (int i = 0; i < result.size(); i++) {
                mMap.addMarker(new MarkerOptions()
                        .title(result.get(i).getName())
                        .position(
                                new LatLng(result.get(i).getLatitude(), result
                                        .get(i).getLongitude()))
                        .icon(BitmapDescriptorFactory
                                .fromResource(R.drawable.pin))
                        .snippet(result.get(i).getVicinity()));
            }
            CameraPosition cameraPosition = new CameraPosition.Builder()
                    .target(new LatLng(result.get(0).getLatitude(), result
                            .get(0).getLongitude())) // Sets the center of the map to
                                            // Mountain View
                    .zoom(14) // Sets the zoom
                    .tilt(30) // Sets the tilt of the camera to 30 degrees
                    .build(); // Creates a CameraPosition from the builder
            mMap.animateCamera(CameraUpdateFactory
                    .newCameraPosition(cameraPosition));
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            dialog = new ProgressDialog(context);
            dialog.setCancelable(false);
            dialog.setMessage("Loading");
            dialog.isIndeterminate();
            dialog.show();
        }

        @Override
        protected ArrayList<Place> doInBackground(Void... arg0) {
            PlacesService service = new PlacesService(
                    "AIzaSyBquLw9vJPDHAZO8kzKw6ft0bPxsgBmblg");
            ArrayList<Place> findPlaces = service.findPlaces(loc.getLatitude(), // 28.632808
                    loc.getLongitude(), places); // 77.218276

            for (int i = 0; i < findPlaces.size(); i++) {

                Place placeDetail = findPlaces.get(i);
                Log.e(TAG, "places : " + placeDetail.getName());
            }
            return findPlaces;
        }

    }

    private void initCompo() {
        mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map))
                .getMap();
    }


    private void currentLocation() {
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        String provider = locationManager
                .getBestProvider(new Criteria(), false);

        Location location = locationManager.getLastKnownLocation(provider);

        if (location == null) {
            locationManager.requestLocationUpdates(provider, 0, 0, listener);
        } else {
            loc = location;
            new GetPlaces(MapActivity.this, places[0].toLowerCase().replace(
                    "-", "_")).execute();
            Log.e(TAG, "location : " + location);
        }

    }

    private LocationListener listener = new LocationListener() {

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        @Override
        public void onProviderEnabled(String provider) {

        }

        @Override
        public void onProviderDisabled(String provider) {

        }

        @Override
        public void onLocationChanged(Location location) {
            Log.e(TAG, "location update : " + location);
            loc = location;
            locationManager.removeUpdates(listener);
        }
    };

}

SOLUTION: Other than from the answer given below. I apply a quick fix by removing this line and work like a charm! Thanks to all who helped me. Have a nice day :)

android:theme="@style/Theme.NoTitle"
BlackHat
  • 147
  • 2
  • 3
  • 13
  • Make sure `getActionBar()` does not return `null`. Or take into account that it can return null. – MAV Jul 30 '13 at 18:41
  • If I've counted right, it's `actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);` - put a breakpoint on this line. Is actionBar null? – Simon Jul 30 '13 at 18:42
  • Thanks guys. Now I get it solved after reading comments. – BlackHat Jul 30 '13 at 19:08

1 Answers1

1

Line 46 is;

actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

The only thing that can be null on here is actionBar, therefore getActionBar() is returning null, the reasons for this;

getActionBar() returns null - Title bar isn't visible.

getActionBar returns null - You must request an action bar using getWindow().requestFeature(Window.FEATURE_ACTION_BAR);, you may think your info bar is an action bar.

etc.

You should be able to find your answer through the many other SO posts asking the same question.

Community
  • 1
  • 1
Robadob
  • 5,319
  • 2
  • 23
  • 32
  • Thanks for your quick respond! it works! Sorry for asking stupid question in this site again. :P (I'm very new to the development and I don't aware that NULL could cause this problem.) – BlackHat Jul 30 '13 at 19:06
  • In future, if you get a NULL pointer error, find the line of code where its occurring and select all the variables in that statement which could possibly be NULL, then either breakpoint this line or add `System.out` 's and check which of the variables are null. Once you've spotted the NULL variable, trace it back to its creation and then research why its being created as NULL. That will help you solve the vast majority of NULL pointer bugs. – Robadob Jul 30 '13 at 19:12