Red Ghost
Red Ghost

Reputation: 322

NullPointerException - Android Google Maps Street View

I am trying to display a street view in a fragment.

public class StreetDisplay extends Fragment implements OnStreetViewPanoramaReadyCallback{

SupportStreetViewPanoramaFragment streetFrag;

static final LatLng PosOne = new LatLng(43.771925, -79.512460);

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.street_display, container, false);
    initialize();
    return v;

}

private void initialize() {

    streetFrag =
            (SupportStreetViewPanoramaFragment) getFragmentManager()
                    .findFragmentById(R.id.street);
    streetFrag.getStreetViewPanoramaAsync(this);
}

//this method is needed for using a ViewPager swiping feature
public static StreetDisplay newInstance(){
    StreetDisplay sd = new StreetDisplay();
    return sd;
}

@Override
public void onStreetViewPanoramaReady(StreetViewPanorama panorama) {
    panorama.setPosition(PosOne);
}
}

Here's the error message I get when I run my app

Process: com.example.nikhilbhaskar.mapplayground, PID: 22406
java.lang.NullPointerException
        at com.example.nikhilbhaskar.mapplayground.StreetDisplay.initialize(StreetDisplay.java:43)
        at com.example.nikhilbhaskar.mapplayground.StreetDisplay.onCreateView(StreetDisplay.java:33)

Line 33 is

initialize();

Line 43 is

streetFrag.getStreetViewPanoramaAsync(this);  

I am not sure what the problem is - Can you help?

Upvotes: 1

Views: 1650

Answers (3)

Boyan Krastev
Boyan Krastev

Reputation: 1

Within fragment use getChildFragmentManager() instead.

streetFrag = (SupportStreetViewPanoramaFragment) getChildFragmentManager()
                                                    .findFragmentById(R.id.street);

Upvotes: 0

bjiang
bjiang

Reputation: 6078

I tried the doc from official, and it worked perfectly.

My sample code:

StreetViewActivity

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

import com.google.android.gms.maps.OnStreetViewPanoramaReadyCallback;
import com.google.android.gms.maps.StreetViewPanorama;
import com.google.android.gms.maps.StreetViewPanoramaFragment;
import com.google.android.gms.maps.model.LatLng;


public class StreetViewActivity extends FragmentActivity
        implements OnStreetViewPanoramaReadyCallback {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_street_view);
        StreetViewPanoramaFragment streetViewPanoramaFragment =
                (StreetViewPanoramaFragment) getFragmentManager()
                        .findFragmentById(R.id.streetviewpanorama);
        streetViewPanoramaFragment.getStreetViewPanoramaAsync(this);
    }


    @Override
    public void onStreetViewPanoramaReady(StreetViewPanorama streetViewPanorama) {
        streetViewPanorama.setPosition(new LatLng(-33.87365, 151.20689));
    }
}

And for the activity_street_view.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:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_vertical_margin"
                android:paddingBottom="@dimen/activity_vertical_margin"
                tools:context="com.bjiang.map_ex.StreetViewActivity">

    <fragment
        android:name="com.google.android.gms.maps.StreetViewPanoramaFragment"
        android:id="@+id/streetviewpanorama"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

For more details, please refer here.

EDIT:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;

import com.google.android.gms.maps.OnStreetViewPanoramaReadyCallback;
import com.google.android.gms.maps.StreetViewPanorama;
import com.google.android.gms.maps.SupportStreetViewPanoramaFragment;
import com.google.android.gms.maps.model.LatLng;

public class StreetDisplay extends FragmentActivity implements OnStreetViewPanoramaReadyCallback {

    static SupportStreetViewPanoramaFragment streetViewPanoramaFragment;

    static final LatLng PosOne = new LatLng(43.771925, -79.512460);

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.street_display);
        streetViewPanoramaFragment =
                ((SupportStreetViewPanoramaFragment)getSupportFragmentManager().findFragmentById(R.id.street));

        streetViewPanoramaFragment.getStreetViewPanoramaAsync(this);
    }

    //this method is needed for using a ViewPager swiping feature
    public static Fragment newInstance(){
        return streetViewPanoramaFragment.newInstance();
    }

    @Override
    public void onStreetViewPanoramaReady(StreetViewPanorama streetViewPanorama) {
        streetViewPanorama.setPosition(new LatLng(-33.87365, 151.20689));
    }

}

Upvotes: 1

Rahul Shah
Rahul Shah

Reputation: 165

streetFrag =
            (SupportStreetViewPanoramaFragment) getFragmentManager()
                    .findFragmentById(R.id.street);

It is possible that this statement is not creating the object for StreetFrag.

Check whether is streetFrag is null or not.

Upvotes: 1

Related Questions