java - 从 Map 获取坐标到主 Activity

标签 java android google-maps

我正在做一个地理编码应用程序。这个应用程序包含一个主 Activity,带有一个启动 Google Maps API 的按钮( fragment ),以及 2 个必须显示纬度和经度坐标的 TextView 。

当我启动 map 时,我必须能够长按任何一个点,并且这个点的坐标必须返回到主Activity并显示在Textviews上。

这是我获取触摸点位置的 GoogleMapsFragments 代码:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
//...

    mMap.setOnMapLongClickListener(new OnMapLongClickListener() {
        @Override
        public void onMapLongClick(LatLng arg0) {
            mLatLng = arg0;
            ReturnMapData(mLatLng);
        }
    });
}

public void ReturnMapData(LatLng arg) {
    mCodingActivity.GetLocationFromMap(mLatLng);
}

GetLocationFromMap 方法属于主 Activity 。也许这是失败的地方,我不知道这是否是最好的方法。

无论如何,主 Activity 中的这个方法看起来是这样的:

public void GetLocationFromMap(LatLng arg0) {
    String latitud = String.valueOf(arg0.latitude);
    String longitud = String.valueOf(arg0.longitude);
    txtLatitude.setText(latitud);
    txtLongitude.setText(longitud);
}

但我在这一行 txtLatitude.setText(latitud);

收到下一个错误

这是出现在 LogCat 上的内容:java.lang.NullPointerException

更新 - 添加了 LogCat

02-05 13:24:06.102: E/AndroidRuntime(8907): FATAL EXCEPTION: main
02-05 13:24:06.102: E/AndroidRuntime(8907): java.lang.NullPointerException
02-05 13:24:06.102: E/AndroidRuntime(8907):     at com.final.reversegeocoding.GeocodingActivity.GetLocationFromMap(GeocodingActivity.java:231)
02-05 13:24:06.102: E/AndroidRuntime(8907):     at com.final.reversegeocoding.GoogleMapsFragment.ReturnMapData(GoogleMapsFragment.java:84)
02-05 13:24:06.102: E/AndroidRuntime(8907):     at com.final.reversegeocoding.GoogleMapsFragment$1.onMapLongClick(GoogleMapsFragment.java:70)
02-05 13:24:06.102: E/AndroidRuntime(8907):     at com.google.android.gms.maps.GoogleMap$7.onMapLongClick(Unknown Source)
02-05 13:24:06.102: E/AndroidRuntime(8907):     at com.google.android.gms.maps.internal.j$a.onTransact(Unknown Source)
02-05 13:24:06.102: E/AndroidRuntime(8907):     at android.os.Binder.transact(Binder.java:347)
02-05 13:24:06.102: E/AndroidRuntime(8907):     at ecp.a(SourceFile:93)
02-05 13:24:06.102: E/AndroidRuntime(8907):     at maps.ae.j.a(Unknown Source)
02-05 13:24:06.102: E/AndroidRuntime(8907):     at maps.ao.an.c(Unknown Source)
02-05 13:24:06.102: E/AndroidRuntime(8907):     at maps.ao.bc.onLongPress(Unknown Source)
02-05 13:24:06.102: E/AndroidRuntime(8907):     at maps.br.g.onLongPress(Unknown Source)
02-05 13:24:06.102: E/AndroidRuntime(8907):     at maps.br.h.c(Unknown Source)
02-05 13:24:06.102: E/AndroidRuntime(8907):     at maps.br.i.handleMessage(Unknown Source)
02-05 13:24:06.102: E/AndroidRuntime(8907):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-05 13:24:06.102: E/AndroidRuntime(8907):     at android.os.Looper.loop(Looper.java:137)
02-05 13:24:06.102: E/AndroidRuntime(8907):     at android.app.ActivityThread.main(ActivityThread.java:5419)
02-05 13:24:06.102: E/AndroidRuntime(8907):     at java.lang.reflect.Method.invokeNative(Native Method)
02-05 13:24:06.102: E/AndroidRuntime(8907):     at java.lang.reflect.Method.invoke(Method.java:525)
02-05 13:24:06.102: E/AndroidRuntime(8907):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
02-05 13:24:06.102: E/AndroidRuntime(8907):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
02-05 13:24:06.102: E/AndroidRuntime(8907):     at dalvik.system.NativeStart.main(Native Method)

更新 2 -- 我如何定义文本纬度:

private EditText txtLatitude;

@Override
protected void onCreate(Bundle savedInstanceState) {
    //...

    txtLatitude = (EditText) findViewById(R.id.latitude_edit);

更新 3 -- 我如何调用 MAP fragment

View mapFrame = findViewById(R.id.map_fragment);
            mDualPane = mapFrame != null && mapFrame.getVisibility() == View.VISIBLE;

            if (mDualPane){
                Fragment mapFrag = getSupportFragmentManager().findFragmentById(R.id.map_fragment);
                GoogleMapsFragment mapsFragment = new GoogleMapsFragment();

                if (mapFrag == null) {
                    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                    ft.add(R.id.map_fragment, mapsFragment).commit();
                }else {
                    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                    ft.replace(R.id.map_fragment, mapsFragment).commit();
                }
            } else {
                Intent intent = new Intent();
                intent.setClass(GeocodingActivity.this, GoogleMapsActivity.class);
                startActivity(intent);
            }

如果是智能手机 (sinlgePane),也就是我现在正在测试的智能手机,我会调用具有下一个代码的 GoogleMapsActivity。这个 Activity 只是一个调用 fragment 的过渡 Activity 。

public class GoogleMapsActivity extends FragmentActivity {

    GoogleMapsFragment mapsFragment = new GoogleMapsFragment();
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.add(android.R.id.content, mapsFragment).commit();
}

更新 4 -- ReturnMapData 方法已更新

public void ReturnMapData(LatLng arg) {

    Intent intent = getActivity().getIntent();
    Bundle args = new Bundle();
    args.putParcelable("maps_location", arg);
    intent.putExtra("bundle", args);
    getActivity().setResult(getActivity().RESULT_OK, intent);


    View mapFrame = getActivity().findViewById(R.id.map_fragment);
    mDualPane = mapFrame != null && mapFrame.getVisibility() == View.VISIBLE;

    if (!mDualPane){
        getActivity().finish();
    }
}

更新 5 -

修改代码以使用 onActivityResult 从 MapFragment 取回数据,但在获取此数据时仍然存在一些问题。这是我的做法:

从 Activity 中调用 MapsFrament:

Intent intent = new Intent();
intent.setClass(GeocodingActivity.this, GoogleMapsActivity.class);
startActivityForResult(intent, REQUEST_CODE_MAP_LOCATION);

将结果发送回主 Activity :

public void ReturnMapData(LatLng arg) {
    Intent intent = getActivity().getIntent();
    Bundle bundle = new Bundle();
    bundle.putParcelable("maps_location", arg);
    intent.putExtra("bundle", bundle);
    getActivity().setResult(getActivity().RESULT_OK, intent);
}

获取主要 Activity 的结果:

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);
            showLocation(mLocation);
    }
}

但是,这是我在 LogCat 上得到的:

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)

最佳答案

txtLatitude 为 null(在堆栈跟踪中很容易看到)。

你的

txtLatitude = (EditText) findViewById(R.id.latitude_edit);

没有工作,或者您在 GetLocationFromMap 之前的某个时间用 null 覆盖了 txtLatitude。

试试这个来检查:

txtLatitude = (EditText) findViewById(R.id.latitude_edit);
System.err.println("txtLatitude exists: "+(txtLatitude!=null));

您应该在 Logcat 中看到输出。

如果为空,请尝试重新编译项目(干净构建)。有时 IDE 会卡住,无法正确编译新类。如果这不起作用,也许 findViewById(R.id.latitude_edit) 不会返回 EditText,然后在转换时丢失。你可以检查使用这个:

System.err.println("latitude_edit is EditText: "+(findViewById(R.id.latitude_edit) instanceof EditText);

如果它实际上不为空,您将不得不检查整个程序中对 txtLatitude 的每个赋值,看看您是否在某处不小心将它设置为空(大多数 IDE 具有“查找用法”功能或类似功能,对之类的东西)。

编辑: 根据您的意见,问题出在您的 Activity 结构上。 您说您有两个 Activity ,包含 EditTexts 的 ActivityA 和包含 map 的 ActivityB。 Android 通常一次只打开一个 Activity。其他人不是“活着的”。因此,如果您打开了 ActivityB 并想在 ActivityA 中编辑可能不起作用的内容。 你可以使用的是:

-使用 startActivityForResult 而不是 startActivity 启动 Activity :

startActivityForResult(intent, requestCode); //requestCode is any unique number>0 you want.

-在 ActivityA 中实现一个 onActivityResult 方法

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  if (requestCode == x) { //x is the requestCode you chose above
     if(resultCode == RESULT_OK){
         String latitude=data.getStringExtra("latitude");
         String longitude=data.getStringExtra("longitude");
     } else if (resultCode == RESULT_CANCELED) {    
         //ActivityB was closed before you put any results
     }
  }
}

-用你的 ReturnMapData-Method 做这样的事情:

public void ReturnMapData(LatLng arg) {
    Intent intent = this.getIntent();
    intent.putExtra("latitude", String.valueOf(arg.latitude));
    intent.putExtra("longitude", String.valueOf(arg.longitude));
    this.setResult(RESULT_OK, intent);
}

关于java - 从 Map 获取坐标到主 Activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21576942/

相关文章:

Java, (low + high) >>> 1 会溢出吗?

java - 在 Android 中使用 TextUtil 类比 String 类有什么优势吗?

java - getMapAsync 错误

javascript - Google map 绘图管理器限制为 1 个多边形

android - 刷新消息队列以防止基于消息的泄漏。但是要刷新哪个 HandlerThread?

php - 如何将动态谷歌地图添加到我的网站?

java - Ubuntu中如何配置环境变量?

java - AWT中Canvas有什么用?

java - Android 平板电脑和相机之间的 USB 批量传输

java - 如何在 Android 中提取 HTTPPost 后的 URL