-1

我想從json文件資產文件夾中脫機加載標記並將其顯示在地圖上。 以前我可以將標記顯示爲textview,但我無法在地圖上顯示它們。 該應用程序顯示地圖,但不顯示標記。android-如何在脫機顯示JSON文件的地圖上顯示標記?

我不知道爲什麼。

stations.json

[ 
    { 
     "name": "JAVANMARDAN1", 
     "lat": 35.747394, 
     "lang": 51.267577 
    } 
] 

map.xml

<?xml version="1.0" encoding="utf-8"?> 
<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:map="http://schemas.android.com/apk/res-auto" 
android:id="@+id/map" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:name="com.google.android.gms.maps.SupportMapFragment"/> 

MapsActivity

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { 
    private Marker marker; 
    private GoogleMap mMap; 

    public MapsActivity() throws JSONException { 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.map); 
     // 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); 

     new AsyncTaskGetMareker().execute(); 


    } 

    public String getJSONFromAssets() { 
     String json = null; 
     try { 
      InputStream inputData = getAssets().open("stations.json"); 
      int size = inputData.available(); 
      byte[] buffer = new byte[size]; 
      inputData.read(buffer); 
      inputData.close(); 
      json = new String(buffer, "UTF-8"); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
      return null; 
     } 
     return json; 

    } 


    private class AsyncTaskGetMareker extends AsyncTask 
    <String , String, JSONArray>{ 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 

     @Override 
     protected JSONArray doInBackground(String... strings) { 
      return null; 
     } 

     protected void onPostExecute (JSONArray result){ 
      if (result !=null){ 
       for (int i =0; i <result.length(); i++){ 
        JSONObject jsonObject= null; 
        try { 
         jsonObject= result.getJSONObject(i); 
         String name=jsonObject.getString("name"); 
         String lat=jsonObject.getString("lat"); 
         String lang=jsonObject.getString("lang"); 


         drawMarker(new LatLng(Double.parseDouble(lat), 
           Double.parseDouble(lang))); 

        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 

     } 

     private void drawMarker(LatLng point) { 
      MarkerOptions markerOptions = new MarkerOptions(); 
      markerOptions.position(point); 
      GoogleMap googleMap = null; 
      googleMap.addMarker(markerOptions); 
     } 




    } 


    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 
    } 
} 

回答

1

有你的代碼中的多個問題:

  • 你不能從你的AsyncTask
  • 你執行的AsyncTask地圖加載
  • 之前在你drawMarker()方法調用getJSONFromAssets() ,您正在創建一個新的GoogleMap參考並將其設置爲null。這不起作用。
  • 您的代碼忽略了name字段,我認爲您希望將其作爲InfoWindow的片段。

下面是上面固定更新的代碼,重新設計了所有的問題:

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { 
    private Marker marker; 
    private GoogleMap mMap; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.map); 
     // 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); 
    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 
     new AsyncTaskGetMareker().execute(); 
    } 

    public String getJSONFromAssets() { 
     String json = null; 
     try { 
      InputStream inputData = getAssets().open("stations.json"); 
      int size = inputData.available(); 
      byte[] buffer = new byte[size]; 
      inputData.read(buffer); 
      inputData.close(); 
      json = new String(buffer, "UTF-8"); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
      return null; 
     } 
     return json; 
    } 

    private class AsyncTaskGetMareker extends AsyncTask<String , String, JSONArray> { 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 

     @Override 
     protected JSONArray doInBackground(String... strings) { 
      String stationsJsonString = getJSONFromAssets(); 
      try { 
       JSONArray stationsJsonArray = new JSONArray(stationsJsonString); 
       return stationsJsonArray; 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      //This will only happen if an exception is thrown above: 
      return null; 
     } 

     protected void onPostExecute (JSONArray result){ 
      if (result !=null){ 
       for (int i =0; i <result.length(); i++){ 
        JSONObject jsonObject= null; 
        try { 
         jsonObject= result.getJSONObject(i); 
         String name=jsonObject.getString("name"); 
         String lat=jsonObject.getString("lat"); 
         String lang=jsonObject.getString("lang"); 

         drawMarker(new LatLng(Double.parseDouble(lat), 
           Double.parseDouble(lang)), name); 

        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 

     } 

     private void drawMarker(LatLng point, String name) { 
      MarkerOptions markerOptions = new MarkerOptions(); 
      markerOptions.position(point); 
      markerOptions.snippet(name); 
      mMap.addMarker(markerOptions); 
     } 
    } 

} 
+0

太謝謝你了。有效 –