Java 使用谷歌地图获取活动和片段之间的数据

Java 使用谷歌地图获取活动和片段之间的数据,java,android,google-maps,android-intent,android-fragments,Java,Android,Google Maps,Android Intent,Android Fragments,导言 嗯,我有一项主要活动: 1个启动谷歌地图API的按钮 2编辑文本以显示纬度和经度坐标 我习惯于使用智能手机或平板电脑,所以我在地图上使用fragment。当我使用平板电脑时,它会在主活动的右侧显示地图(我使用XML文件上的framelayout),当我使用智能手机时,它会抛出一个意图,用地图显示新活动 但是,由于MapsFragment不是一个活动,所以我不能有目的地调用它,因为我创建了一个中间活动 结构如下:MainActivity(GeocodingActivity)->Googl

导言

嗯,我有一项主要活动:

  • 1个启动谷歌地图API的按钮
  • 2编辑文本以显示纬度和经度坐标
我习惯于使用智能手机或平板电脑,所以我在地图上使用fragment。当我使用平板电脑时,它会在主活动的右侧显示地图(我使用XML文件上的framelayout),当我使用智能手机时,它会抛出一个意图,用地图显示新活动

但是,由于MapsFragment不是一个活动,所以我不能有目的地调用它,因为我创建了一个中间活动

结构如下:
MainActivity(GeocodingActivity)->GoogleMapsActivity->GoogleMapsFragment

功能性

应用程序的使用很简单。当我点击地图按钮时,它会启动谷歌地图。在那里,我单击地图的任何位置,它必须将该位置的坐标返回到主要活动,并在编辑文本中显示它们

代码

这是我用来启动GoogleMaps的代码:

/**ON BUTTON CLICK IN MAIN ACTIVITY*/
Intent intent = new Intent();
intent.setClass(GeocodingActivity.this, GoogleMapsActivity.class);
startActivityForResult(intent, REQUEST_CODE_MAP_LOCATION);

/**IN GOOGLEMAPSACTIVITY'S ONCREATE METHOD*/
GoogleMapsFragment mapsFragment = new GoogleMapsFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(android.R.id.content, mapsFragment).commit();
要将数据从GoogleMapsFragment发送回mainActivity,请执行以下操作:

/**ON MAP LONG CLICK STARTS RETURNMAPDATA METHOD*/
mMap.setOnMapLongClickListener(new OnMapLongClickListener() {
    @Override
    public void onMapLongClick(LatLng arg0) {
        mLatLng = arg0;
        ReturnMapData(mLatLng);
     }
});

/**METHOD THAT RETURNS DATA FORM GOOGLEMAPSFRAGMENT TO MAINACTIVITY*/
public void ReturnMapData(LatLng arg) {
    Intent intent = new Intent();
    Bundle bundle = new Bundle();
    bundle.putParcelable("maps_location", arg);
    intent.putExtra("bundle", bundle);
    getActivity().setResult(getActivity().RESULT_OK, intent);
}
最后一次使用onActivityResult方法接收MainActivity中的数据:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_CODE_MAP_LOCATION) {
            if(resultCode == RESULT_OK){
                Bundle bundle = data.getBundleExtra("bundle");
                LatLng coordinates = bundle.getParcelable("maps_location");
                mLocation.setLatitude(coordinates.latitude);
                mLocation.setLongitude(coordinates.longitude);
        }
    }
}
问题

看起来一切正常,但这是我在日志上看到的。这在onActivityResult方法中发生

02-06 09:26:43.210: E/AndroidRuntime(20541): FATAL EXCEPTION: main
02-06 09:26:43.210: E/AndroidRuntime(20541): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=Intent { cmp=com.uax_final.reversegeocoding/.GoogleMapsActivity (has extras) }} to activity {com.uax_final.reversegeocoding/com.uax_final.reversegeocoding.GeocodingActivity}: java.lang.NullPointerException
02-06 09:26:43.210: E/AndroidRuntime(20541):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3500)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3543)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at android.app.ActivityThread.access$1200(ActivityThread.java:159)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at android.os.Looper.loop(Looper.java:137)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at android.app.ActivityThread.main(ActivityThread.java:5419)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at java.lang.reflect.Method.invokeNative(Native Method)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at java.lang.reflect.Method.invoke(Method.java:525)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at dalvik.system.NativeStart.main(Native Method)
02-06 09:26:43.210: E/AndroidRuntime(20541): Caused by: java.lang.NullPointerException
02-06 09:26:43.210: E/AndroidRuntime(20541):    at com.uax_final.reversegeocoding.GeocodingActivity.onActivityResult(GeocodingActivity.java:232)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at android.app.Activity.dispatchActivityResult(Activity.java:5563)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3496)
更新1——可能的原因

我发现问题在于,当将数据从GoogleMapsFragment返回到mainActivity时,对象是空的,我认为这是因为我使用的结构

MainActivity(地理编码活动)->GoogleMapsActivity->GoogleMapsFragment

当我将数据从GoogleMapsFragment传递回MainActivity时,activity openend仍然是GoogleMapsActivity,这就是发生这种情况的原因

现在,问题是。。。当我请求GoogleMapsFragment中的数据并想返回mainActivity时,如何关闭GoogleMapsActivity???

我回答自己:

问题出在onActivityResult方法中

02-06 09:26:43.210: E/AndroidRuntime(20541): FATAL EXCEPTION: main
02-06 09:26:43.210: E/AndroidRuntime(20541): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=Intent { cmp=com.uax_final.reversegeocoding/.GoogleMapsActivity (has extras) }} to activity {com.uax_final.reversegeocoding/com.uax_final.reversegeocoding.GeocodingActivity}: java.lang.NullPointerException
02-06 09:26:43.210: E/AndroidRuntime(20541):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3500)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3543)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at android.app.ActivityThread.access$1200(ActivityThread.java:159)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at android.os.Looper.loop(Looper.java:137)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at android.app.ActivityThread.main(ActivityThread.java:5419)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at java.lang.reflect.Method.invokeNative(Native Method)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at java.lang.reflect.Method.invoke(Method.java:525)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at dalvik.system.NativeStart.main(Native Method)
02-06 09:26:43.210: E/AndroidRuntime(20541): Caused by: java.lang.NullPointerException
02-06 09:26:43.210: E/AndroidRuntime(20541):    at com.uax_final.reversegeocoding.GeocodingActivity.onActivityResult(GeocodingActivity.java:232)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at android.app.Activity.dispatchActivityResult(Activity.java:5563)
02-06 09:26:43.210: E/AndroidRuntime(20541):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3496)
mLocation对象为null,因此我无法使用setLatitude和set经度方法

正确的方法是:

Location position = new Location("Test");
position.setLatitude(coordinates.latitude);
position.setLongitude(coordinates.longitude);
mLocation = position;