这是我的代码。使用已打开的GPS启动应用程序时发生错误。这也意味着通过关闭GPS,应用程序可以完美运行。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View v = inflater.inflate(R.layout.fragment_map, null, false);
map = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map))
.getMap();
map.setMyLocationEnabled(true);
LocationManager lm=(LocationManager)getActivity().getSystemService(Context.LOCATION_SERVICE);
Criteria c = new Criteria();
String provider = lm.getBestProvider(c, false);
final TextView switchStatus = (TextView) v.findViewById(R.id.switchStatus);
Switch mySwitch = (Switch) v.findViewById(R.id.gpsSwitch);
boolean statusOfGPS = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (statusOfGPS){
mySwitch.setChecked(true);
switchStatus.setText("GPS Switch is currently ON");
}
else{
mySwitch.setChecked(false);
switchStatus.setText("GPS Switch is currently OFF");
}
mySwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
switchStatus.setText("GPS Switch is currently ON");
Intent viewIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(viewIntent);
}else{
switchStatus.setText("GPS Switch is currently OFF");
}
}
});
//check the current state before we display the screen
if(mySwitch.isChecked()){
switchStatus.setText("GPS Switch is currently ON");
}
else {
switchStatus.setText("GPS Switch is currently OFF");
}
Location l = lm.getLastKnownLocation(provider);
if(l!=null)
{
onLocationChanged(l);
}
lm.requestLocationUpdates(provider, 20000, 0, this);
return v;
}
@Override
public void onLocationChanged(Location location) {
TextView ln=(TextView)getView().findViewById(R.id.lng);
TextView lt=(TextView)getView().findViewById(R.id.lat);
// Getting latitude of the current location
double latitude = location.getLatitude();
// Getting longitude of the current location
double longitude = location.getLongitude();
// Creating a LatLng object for the current location
LatLng latLng = new LatLng(latitude, longitude);
Marker myLoc = map.addMarker(new MarkerOptions()
.position(latLng)
.title("MyLocation")
.snippet("I am at ")
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.ic_launcher)));
// Showing the current location in Google Map
map.moveCamera(CameraUpdateFactory.newLatLng(latLng));
// Zoom in the Google Map
map.animateCamera(CameraUpdateFactory.zoomTo(15));
ln.setText("long: "+longitude);
lt.setText("lat: "+latitude);
}
@Override
public void onProviderDisabled(String provider) {
if (provider.equals("gps")){
TextView ln=(TextView) getView().findViewById(R.id.lng);
ln.setText("GPS is OFF");
}
}
@Override
public void onProviderEnabled(String provider) {
if (provider.equals("gps")){
TextView ln=(TextView) getView().findViewById(R.id.lng);
ln.setText("GPS is ON... wait for updates");
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
这是一个错误日志,但我不知道我的代码的哪一部分给了我一个错误。
06-22 13:18:21.639: E/AndroidRuntime(26702): FATAL EXCEPTION: main
06-22 13:18:21.639: E/AndroidRuntime(26702): java.lang.NullPointerException
06-22 13:18:21.639: E/AndroidRuntime(26702): at com.gpsocial.fragments.MapFragment.onLocationChanged(MapFragment.java:103)
06-22 13:18:21.639: E/AndroidRuntime(26702): at com.gpsocial.fragments.MapFragment.onCreateView(MapFragment.java:93)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.support.v4.view.ViewPager.populate(ViewPager.java:1064)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.support.v4.view.ViewPager.populate(ViewPager.java:911)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1432)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.view.View.measure(View.java:16848)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.view.View.measure(View.java:16848)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245)
06-22 13:18:21.639: E/AndroidRuntime(26702): at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:302)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.view.View.measure(View.java:16848)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
06-22 13:18:21.639: E/AndroidRuntime(26702): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2586)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.view.View.measure(View.java:16848)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2191)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1354)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1537)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1251)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6379)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:791)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.view.Choreographer.doCallbacks(Choreographer.java:591)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.view.Choreographer.doFrame(Choreographer.java:561)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:777)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.os.Handler.handleCallback(Handler.java:730)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.os.Handler.dispatchMessage(Handler.java:92)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.os.Looper.loop(Looper.java:137)
06-22 13:18:21.639: E/AndroidRuntime(26702): at android.app.ActivityThread.main(ActivityThread.java:5493)
06-22 13:18:21.639: E/AndroidRuntime(26702): at java.lang.reflect.Method.invokeNative(Native Method)
06-22 13:18:21.639: E/AndroidRuntime(26702): at java.lang.reflect.Method.invoke(Method.java:525)
06-22 13:18:21.639: E/AndroidRuntime(26702): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
06-22 13:18:21.639: E/AndroidRuntime(26702): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
06-22 13:18:21.639: E/AndroidRuntime(26702): at dalvik.system.NativeStart.main(Native Method)
任何人都可以帮忙吗?真的很感激。
答案 0 :(得分:1)
您无法使用getView()
中的onCreateView()
。它返回null,正是因为你还没有真正完成onCreateView()
的执行。
最好的选择可能是延迟此调用,直到生命周期的后期。例如,使用onStart()
将是一个很好的选择。
另一种可能的解决方法是将您返回的视图分配给一个memeber变量,例如:
private View mMainView;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View v = inflater.inflate(R.layout.fragment_map, null, false);
mMainView = v;
...
}
然后在mMainView
中使用onLocationChanged()
。