#java #android #gps #google-maps-android-api-2
#java #Android #gps #google-карты-android-api-2
Вопрос:
Это мой код. Произошла ошибка, когда я запускаю приложение с включенным 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)
Кто-нибудь может помочь с этим? Это было бы очень ценно.
Комментарии:
1. Что такое строка 103
com.gpsocial.fragments.MapFragment
?2. @Raghunandan это имя моего класса.
3. что такое строка 103 в этом классе??
Ответ №1:
Вы не можете использовать getView()
from 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
in onLocationChanged()
.
Комментарии:
1. @Адриан, я рад. Пожалуйста, не забудьте принять ответ, если он был полезен 😉