java - 使用谷歌地图获取 Activity 和 fragment 之间的数据

标签 java android google-maps android-intent android-fragments

简介

好吧,我有一个主要 Activity ,它有:

  • 1 个启动 GoogleMaps API 的按钮
  • 2 编辑文本以显示纬度和经度坐标

我管理智能手机或平板电脑的使用,因此我使用 map fragment 。当我使用平板电脑时,它会在 Main Acitivity 的右侧显示 map (我在 XML 文件上使用 framelayout),而当我使用智能手机时,它会抛出一个 intent 以显示带有 map 的新 Activity 。

但是,由于 MapsFragment 不是一个 Activity ,我不能有意地调用它,因为我已经创建了一个中间 Activity 。

结构是这样的:MainActivity(GeocodingActivity) -> GoogleMapsActivity-> GoogleMapsFragment

功能

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

代码

这是我用来启动 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);
}

Ant 最后使用 onActivityResult 方法在 MainAcitivty 中接收数据:

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

问题

貌似一切正常,但是我在LogCat上得到的是这个。这发生在 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(GeocodingActivity) -> GoogleMapsActivity-> GoogleMapsFragment

当我将数据从 GoogleMapsFragment 传回 MainActivity 时, Activity openend 仍然是 GoogleMapsActivity,这就是出现这种情况的原因。

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

最佳答案

我自己回答:

问题出在 onActivityResult 方法中。

mLocation 对象为 null,因此我无法使用 setLatitude 和 setLongitude 方法。

正确的做法是这样的:

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

关于java - 使用谷歌地图获取 Activity 和 fragment 之间的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21598283/

相关文章:

java - GPS map 不要撒播它

Java如何使用ListIterator作为队列?

java - 如何在Java中对像素进行算术运算

java - 如何打印 logback 内部错误和状态日志?

java - 如果输入为空,带有 EditText 的警报对话框将关闭

javascript - 检查这是否是 JavaScript 中新的 google.maps.LatLng 的实例

java - 如何使用java.Set

适用于应用程序的 Android SSO(单点登录)

android - 如何更改 Android 应用程序包名称 (app.aab) 以反射(reflect)应用程序版本和构建类型

javascript - 以编程方式为移动应用程序获取靠近纬度和经度的多个街道名称