gpt4 book ai didi

java - 谷歌地图 : Create marker from different class

转载 作者:行者123 更新时间:2023-12-02 03:31:00 24 4
gpt4 key购买 nike

在我的 android studio 项目中,我有两个 Activity :一个是 MapsActivity,另一个只是基本的。

当我单击 map 时,会启动另一个 Activity ,其中包含一组 EditText(文本字段),允许用户为标记定义自定义属性。但是,当我尝试从该类创建标记时,Android Studio 给出了一个错误。

这是代码,MapsActivity.java:

package com.geekybrackets.virtualtourguide;

import android.content.Intent;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

public GoogleMap mMap;
double lat = 0;
double lon = 0;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);

}


/**
* Manipulates the map once available.
* This callback is triggered when the map is ready to be used.
* This is where we can add markers or lines, add listeners or move the camera. In this case,
* we just add a marker near Sydney, Australia.
* If Google Play services is not installed on the device, the user will be prompted to install
* it inside the SupportMapFragment. This method will only be triggered once the user has
* installed Google Play services and returned to the app.
*/
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;

mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {

public void onMapClick(LatLng latLng) {

lat = latLng.latitude;
lon = latLng.longitude;
startActivity(new Intent(MapsActivity.this, newMarker.class));



}
});


}



}

NewMarker.java(用户输入标记属性的 Activity )

package com.geekybrackets.virtualtourguide;

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class newMarker extends AppCompatActivity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_marker);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);


Button save_btn = (Button)findViewById(R.id.btn_save);
save_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

EditText editName = (EditText)findViewById(R.id.editName);
String marker_title = editName.getText().toString();
MapsActivity i = new MapsActivity();
i.mMap.addMarker(new MarkerOptions()
.position(new LatLng(i.lat, i.lon))
.title(marker_title));
i.mMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(i.lat, i.lon)));
finish();
}
});
}

}

这是我得到的错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.model.Marker com.google.android.gms.maps.GoogleMap.addMarker(com.google.android.gms.maps.model.MarkerOptions)' on a null object reference
at com.geekybrackets.virtualtourguide.newMarker$2.onClick(newMarker.java:42)

我该如何解决这个问题?任何意见将不胜感激:)

最佳答案

哦, child ,你有一些东西要学。

首先,您永远不应该调用 Activity 的构造函数 - 这个想法是框架创建 Activity 的实例,并在 上处理初始化逻辑onCreate( bundle 保存实例状态)。如果您只调用构造函数,您将创建一个随机对象,该对象甚至不会成为您 UI 的一部分,更不用说您想要使用的 MapsActivity 实例了。

其次,newMarker是一个糟糕的类名,您应该遵守Java约定并以大写字母开头,例如NewMarkerActivity

第三,如果您想从另一个 Activity 更新 MapsActivity,您需要启动第二个 Activity获取第一个 Activity 的结果 。基本上,您应该调用 startActivityForResult(new Intent(MapsActivity.this, NewMarkerActivity.class)) 而不是当前的调用,并覆盖 MapsActivity 中的 onActivityResult >。将标题作为结果 Bundle 中的额外内容传递,并在 onActivityResult 中检索它。

Consult the documentation for getting results

编辑:要传递标题,您需要创建一个 Intent 并通过调用 Intent.putExtra("someKey", theTitle) 传入标题。 。然后, 调用Activity.setResult(int, Intent)带着这个 Intent 。在onActivityResult中,可以通过调用getStringExtra("someKey")获取标题

最好将该键设为 NewMarkerActivity 类的 public static final 字段,这样就不会出现拼写错误。

关于java - 谷歌地图 : Create marker from different class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38095047/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com