1

我试图在片段中显示街景。NullPointerException - 安卓谷歌地图街景

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); 
} 
} 

这里的错误消息时我跑我的应用程序,我得到

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) 

管线33

initialize(); 

第43行是

streetFrag.getStreetViewPanoramaAsync(this); 

我不知道是什么问题是 - 你能帮忙吗?

+0

对'Fragment'使用支持库吗? – Josef 2015-02-24 22:16:58

+1

你是这个意思?导入android.support.v4.app.Fragment;是的,这是我从 – 2015-02-24 22:24:07

+0

扩展的片段类尝试更改此:'getFragmentManager()'为:'getSupportFragmentManager()' – Josef 2015-02-24 22:28:09

回答

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

此声明可能不会为StreetFrag创建对象。

检查streetFrag是否为null。

+0

我刚刚检查过。你是对的。 streetFrag为空,并且该语句不会创建该对象。任何想法为什么/如何解决它? – 2015-02-24 21:57:53

+0

这可能有帮助。检查出这个问题.http://stackoverflow.com/questions/10833666/findfragmentbyid-always-returns-null – 2015-02-24 22:06:30

1

我试着从官方的文档,它的工作完美。

我的示例代码:

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)); 
    } 
} 

而对于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> 

有关详细信息,请参阅here

编辑:

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)); 
    } 

} 
+0

bijiang,我也试过了,它对我来说非常合适。但我的例子稍有不同。我的类扩展了Fragment而不是FragmentActivity,因为这个片段在ViewPager中用于ViewPager(以及其他两个片段),用于ViewPager中的水平滑动/屏幕滑动功能。示例这里:http://developer.android.com/training/animation/screen-slide.html – 2015-02-24 22:17:57

+0

我试了一个小时,但没有运气,我张贴我已经尝试编辑和[这](http: //stackoverflow.com/questions/24801981/application-getting-crashed-when-i-used-supportstreetviewpanoramafragment)是我能找到的最好的... – bjiang 2015-02-25 00:09:46

+0

谢谢bijiang,我会检查一下这个链接 - 我感谢你的帮助:) – 2015-02-25 00:15:53

0

在片段使用getChildFragmentManager()代替。

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