Java 获取从地图到主要活动的坐标

Java 获取从地图到主要活动的坐标,java,android,google-maps,Java,Android,Google Maps,我正在做一个地理编码应用程序。此应用程序包含一个主要活动,其中一个按钮用于启动谷歌地图API(片段),两个文本视图必须显示纬度和经度坐标 当我启动地图时,我必须能够长时间单击任何点,并且该点的坐标必须返回到主活动并显示在文本视图上 这是GoogleMapsFragments的代码,在这里我得到了接触点的位置: @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedI

我正在做一个地理编码应用程序。此应用程序包含一个主要活动,其中一个按钮用于启动谷歌地图API(片段),两个文本视图必须显示纬度和经度坐标

当我启动地图时,我必须能够长时间单击任何点,并且该点的坐标必须返回到主活动并显示在文本视图上

这是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方法属于主活动。也许失败就在这里,我不知道这是不是最好的办法

无论如何,主活动中的此方法具有以下外观:

public void GetLocationFromMap(LatLng arg0) {
    String latitud = String.valueOf(arg0.latitude);
    String longitud = String.valueOf(arg0.longitude);
    txtLatitude.setText(latitud);
    txtLongitude.setText(longitud);
}
但是我在这一行中得到了下一个错误
txtratitude.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)
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();
    }
}
更新2——如何定义文本纬度:

private EditText txtLatitude;

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

    txtLatitude = (EditText) findViewById(R.id.latitude_edit);
更新3——如何调用地图片段

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,它有下一个代码。此活动只是调用片段的转换活动

public class GoogleMapsActivity extends FragmentActivity {

    GoogleMapsFragment mapsFragment = new GoogleMapsFragment();
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.add(android.R.id.content, mapsFragment).commit();
}
更新4——更新了ReturnMapData方法

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)
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获取数据的代码,但在获取此数据时仍然存在一些问题。我就是这样做的:

从活动调用MapsFramework:

Intent intent = new Intent();
intent.setClass(GeocodingActivity.this, GoogleMapsActivity.class);
startActivityForResult(intent, REQUEST_CODE_MAP_LOCATION);
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);
}
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);
    }
}
将结果发送回主活动:

Intent intent = new Intent();
intent.setClass(GeocodingActivity.this, GoogleMapsActivity.class);
startActivityForResult(intent, REQUEST_CODE_MAP_LOCATION);
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);
}
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);
    }
}
获取主要活动的结果:

Intent intent = new Intent();
intent.setClass(GeocodingActivity.this, GoogleMapsActivity.class);
startActivityForResult(intent, REQUEST_CODE_MAP_LOCATION);
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);
}
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);
    }
}
但是,这是我在日志上看到的:

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为空(在stacktrace中很容易看到)

要么你

txtLatitude = (EditText) findViewById(R.id.latitude_edit);
在GetLocationFromMap之前的某个时间,没有工作或您用null重写了TXTLitude

请尝试以下检查:

txtLatitude = (EditText) findViewById(R.id.latitude_edit);
System.err.println("txtLatitude exists: "+(txtLatitude!=null));
您应该在Logcat中看到输出

如果为空,请尝试重新编译项目(干净构建)。有时IDE被卡住了,不能正确编译新类。如果这不起作用,那么findViewById(R.id.latitude\u edit)可能不会返回EditText,而get在施法时会丢失该文本。您可以使用以下方法检查:

System.err.println("latitude_edit is EditText: "+(findViewById(R.id.latitude_edit) instanceof EditText);
如果它实际上不是null,那么您必须检查整个程序中对txtlatite的每个赋值,以查看是否在某个地方意外地将其设置为null(大多数IDE都有一个“find usages”函数或类似函数,这对类似的东西很有帮助)

编辑: 根据你的评论,问题在于你的活动结构。 你说你有两个活动,活动A包含编辑文本,活动B包含地图。 Android通常一次只打开一个活动。其他人不是“活着的”。因此,如果您打开了ActivityB,并且想要编辑ActivityA中可能无法工作的内容。 不过,您可以使用以下内容:

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

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方法执行以下操作:

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

确保使用调试器将位置输入到
GetLocationFromMap(LatLng arg0)
@md中。我发现我正确获取了坐标,应用程序在执行
.setText()
时崩溃。不得不说,
textLatitude
不是文本视图,而是编辑文本。edittext可能有任何字符限制?请尝试以下方法:
txtLatitude.setText(latitud.tostring())和txtLatitude.setText(longitud.tostring())
@M D Nop,继续执行相同的错误。也许我必须使用其他方法将数据从片段传递到活动?我不知道该怎么办,因为如前所述,调试器在
latitud
longitud
中显示坐标值strings@MD我添加了日志我认为这个问题与我调用另一个活动来显示地图有关,然后,我通过以下方式从映射调用主活动的方法:
mCodingActivity.GetLocationFromMap(mLatLng)我使用其他方法来设置edittext中的坐标,所有这些方法都有效。不起作用的是这张地图。所以,也许我将坐标从地图传递回主活动的方式是,使EditText不被初始化,这样你就有了包含EditText的活动A和包含地图的活动B。从A打开B来显示地图,在打开B的同时将数据传递回A,这就是你要做的吗?如果在活动B中不执行任何其他操作,最好使用startActivityForResult()打开B,并使用ActivityB.setResult()将坐标传递回。如果要添加其他内容,请使用对象存储要放入结果中的所有数据,然后返回这些数据。我会把它写进答案里。我会试试看,但实际上我正在做的是。1) 如果是平板电脑,它将打开活动右侧空间中的MapFragment(使用XML中的framelayout)。2) 如果是智能手机,我无法打开片段,因此,我启动MapActivity,它只是用MapGFragment替换该视图(代码在de post中)。因此,我的疑问是,如果我使用startActivityForResult启动活动,即使我有这样的结构,我也会做这项工作吗?。回答你,是的,我打开地图,然后当我将数据传递给main时,我完成了它,如果你在有数据仍然有效时立即关闭活动。否则,你可以做一些变通:你现在做的方式(这应该在两个活动都处于活动状态的平板电脑上工作),只需捕获任何空指针异常,然后使用startActivityForResult()来做,这应该适用于智能手机。好的,我就是这样做的,最后一件事:在
ReturnMapData(LatLng arg)中{
我想传递
LatLng
对象,而不是单独传递一个logitud值。为此,使用您发布的内容,我按照我在OP上更新的方式编辑了此方法。但是,我想让您看看它是否正确