2016-06-29 20 views
0

In meinem Android-Studio-Projekt habe ich zwei Aktivitäten: eine MapsActivity und die andere nur einfach.Google Maps: Erstelle Marker aus verschiedenen Klassen

Wenn ich auf die Karte klicke, wird die andere Aktivität gestartet, die aus einer Reihe von EditTexts (Textfeldern) besteht, mit denen der Benutzer benutzerdefinierte Eigenschaften für den Marker definieren kann. Wenn ich jedoch versuche, den Marker aus dieser Klasse zu erstellen, gibt Android Studio einen Fehler aus. Hier

ist der Code, 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 (Aktivität in dem Benutzereigenschaften von Marker eintritt)

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

} 

Dies ist der Fehler, den ich bekommen:

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) 

Wie könnte ich dieses Problem lösen? Jede Eingabe wird geschätzt :)

Antwort

2

Oh Junge, du hast ein paar Dinge zu lernen.

Zuerst sollten Sie nie einen Activity Konstruktor aufrufen - die Idee ist, dass das Framework eine Instanz Ihres Activity erstellt und Sie die Initialisierungslogik unter onCreate(Bundle savedInstanceState) behandeln. Wenn Sie nur den Konstruktor aufrufen, erstellen Sie ein zufälliges Objekt, das nicht einmal Teil Ihrer Benutzeroberfläche ist, ganz zu schweigen von der Instanz MapsActivity, mit der Sie arbeiten möchten.

Zweitens newMarker ist ein schrecklicher Klassenname, Sie mit der Java-Konvention und beginnen Klassennamen mit einem Großbuchstaben, so etwas wie NewMarkerActivity,

Drittens halten sollen, wenn Sie MapsActivity von einer anderen Activity aktualisieren mögen, Sie müssen die zweite Aktivität für ein Ergebnis von der ersten Aktivität starten. Grundsätzlich sollten Sie anstelle Ihres aktuellen Anrufs startActivityForResult(new Intent(MapsActivity.this, NewMarkerActivity.class)) anrufen und onActivityResult in MapsActivity überschreiben. Den Titel als Extra im Ergebnis Bundle übergeben und in onActivityResult abrufen.

Consult the documentation for getting results

Edit: den Titel zu übergeben, müssen Sie ein Intent und übergeben Sie den Titel mit einem Aufruf an Intent.putExtra("someKey", theTitle) erstellen. Danach, Anruf Activity.setResult(int, Intent) mit diesem Intent. In onActivityResult, können Sie den Titel erhalten, indem getStringExtra("someKey")

Aufruf Es ist eine gute Idee, dass Schlüsseln ein public static final Feld Ihrer NewMarkerActivity Klasse zu machen, so dass Sie nicht über einen Tippfehler machen.

+0

Vielen Dank für Ihre ausführliche Antwort. Wenn ich das Ergebnis erhalte, bekomme ich eine Absicht, aber ich bin mir nicht sicher, wie ich den "Titel" als Extra weitergeben soll. Die Dokumentation scheint auch nicht zu helfen. –

+0

Kein Problem.Schau dir die Änderung an, um zu sehen, wie du deinen Titel weitergeben kannst. – npace

+0

Ah, das klingt richtig, großartig! Danke für die Hilfe, Sir. –

0

Sie können Instanz der Karte auf diese Weise nicht erhalten. Sie erstellen eine neue Instanz des Objekts MapsActivity, bei dem das Feld mMap auf null gesetzt ist. Sie müssen den Wert von EditText in newMarker über setResult(int, Intent) zurückgeben. Sehen Sie mehr hier: Getting a Result from an Activity

+1

@npace war schneller und er hatte keine Angst zu kritisieren, also sollte ich auf seine Antwort verweisen. – egoldx