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

当我单击地图时,将启动另一个活动,该活动由一组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(用户输入标记属性的活动)

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)


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

最佳答案

哦,男孩,您有几件事需要学习。

首先,永远不要调用Activity的构造函数-想法是框架创建Activity的实例,并处理onCreate(Bundle savedInstanceState)上的初始化逻辑。如果仅调用构造函数,则会创建一个随机对象,该对象甚至都不会成为UI的一部分,更不用说要使用的MapsActivity实例了。

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

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

Consult the documentation for getting results

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

将该键设置为public static final类的NewMarkerActivity字段是一个好主意,这样您就不会打错字了。

关于java - Google Maps:创建不同类别的标记,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38095047/

10-09 04:40