在列表中存储标记位置

Posted

技术标签:

【中文标题】在列表中存储标记位置【英文标题】:Storing marker locations in list 【发布时间】:2015-10-19 10:15:33 【问题描述】:

我正在使用 onmapclicklistener 在谷歌地图上添加标记并以相同的方式删除它。我想要的是,当用户添加标记时,它的位置和半径将保存在列表中(半径取自对话框片段中的用户),当用户删除标记时,它也应该从列表中删除。我应该使用什么方法。 我的代码是 公共类 MainActivity 扩展 FragmentActivity 实现 View.OnClickListener,MapDropdown.DialogListener

public static final String mapLongitude="longitude";
public static final String mapLatitude="latitude";
FragmentManager fm = getSupportFragmentManager();
Button displayareas;
Switch deleteareas;
private boolean del = false;


private GoogleMap newmap; // Might be null if Google Play services APK is not available.

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    displayareas = (Button) findViewById(R.id.display);
    displayareas.setOnClickListener(this);
    deleteareas = (Switch) findViewById(R.id.delete);
    deleteareas.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() 

        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                                     boolean isChecked) 

            if (isChecked) 
                del = true;
                Toast.makeText(getApplicationContext(), "Deleting enabled", Toast.LENGTH_LONG).show();
             else 
                del = false;
                Toast.makeText(getApplicationContext(), "Deleting disabled", Toast.LENGTH_LONG).show();
            

        
    );
    Log.d("Map","MapCreated");
    setUpMapIfNeeded();


@Override
public void onClick(View v) 
    if (v.getId() == R.id.display) 
        Intent intent = new Intent(this, AllAreas.class);

        startActivity(intent);
    



@Override
protected void onResume() 
    super.onResume();
    //setUpMapIfNeeded();



private void setUpMapIfNeeded() 
    // Do a null check to confirm that we have not already instantiated the map.
    if (newmap == null) 
        // Try to obtain the map from the SupportMapFragment.
        newmap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                .getMap();
        // Check if we were successful in obtaining the map.
        if (newmap != null) 
            setUpMap();
            Log.d("MAPS","Map working");


        
        else Log.d("MAPS","not working");

    



private void setUpMap() 

    newmap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker").snippet("Snippet"));

    // Enable MyLocation Layer of Google Map
    newmap.setMyLocationEnabled(true);

    // Get LocationManager object from System Service LOCATION_SERVICE
    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    // Create a criteria object to retrieve provider
    Criteria criteria = new Criteria();

    // Get the name of the best provider
    String provider = locationManager.getBestProvider(criteria, true);

    // Get Current Location
    Location myLocation = locationManager.getLastKnownLocation(provider);

    // set map type
    newmap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

    // Get latitude of the current location
    double latitude = myLocation.getLatitude();

    // Get longitude of the current location
    double longitude = myLocation.getLongitude();

    // Create a LatLng object for the current location
    LatLng latLng = new LatLng(latitude, longitude);

    // Show the current location in Google Map
    newmap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

    // Zoom in the Google Map
    newmap.animateCamera(CameraUpdateFactory.zoomTo(20));
    newmap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title("My location"));

    Log.d("LATITUDE",String.valueOf(latitude));
    Log.d("LONGITUDE",String.valueOf(longitude));
    GoogleMap.OnMarkerClickListener listener = new GoogleMap.OnMarkerClickListener() 

        @Override
        public boolean onMarkerClick(final Marker marker) 
            if(del == false)

           MapDropdown dFragment = new MapDropdown();
            // Show DialogFragment
            dFragment.show(fm, "Dialog Fragment");
            else if(del == true)
                marker.remove();
            
            return true;


        

    ;

    newmap.setOnMarkerClickListener(listener);

    newmap.setOnMapClickListener(new GoogleMap.OnMapClickListener() 

        @Override
        public void onMapClick(LatLng latLng) 

            // Creating a marker
            MarkerOptions markerOptions = new MarkerOptions();

            // Setting the position for the marker
            markerOptions.position(latLng);

            // Setting the title for the marker.
            // This will be displayed on taping the marker
            markerOptions.title(latLng.latitude + " : " + latLng.longitude);


            // Animating to the touched position
            newmap.animateCamera(CameraUpdateFactory.newLatLng(latLng));

            // Placing a marker on the touched position
            Marker mmarker = newmap.addMarker(markerOptions);
            Log.d("ADDED LATITUDE",String.valueOf(latLng.latitude));
            Log.d("ADDED LONGITUDE",String.valueOf(latLng.longitude));

            Toast.makeText(getApplicationContext(),"Block area updated",Toast.LENGTH_LONG).show();





        
    );


@Override
public void onDialogPositiveClick(DialogFragment dialog)
    Log.d("Button","positive");


@Override
public void onDialogNegativeClick(DialogFragment dialog)
Log.d("Button","negative");

  
  

【问题讨论】:

【参考方案1】:

如果您想在应用重新打开时检索列表。您可以使用location file system 来存储列表。

首先,如果您想同时保存locationradius,您可以为此创建一个名为UserLocation 的对象。

当用户创建标记时,第二次为该对象创建一个名为itemsArraylist,将该对象添加到Arraylist。然后使用以下方法保存Arraylist

private void writeItems() 
        File fileDir = getFilesDir();
        File locationFile = new File(fileDir, "locations.txt");
        try 
            FileUtils.writeLines(locationFile, items);
         catch (IOException e) 
            e.printStackTrace();
        
    

最后,您可以使用以下方法检索数据:

private void readItems() 
        File filesDir = getFilesDir();
        File locationFile = new File(filesDir, "locations.txt");
        try 
            items = new ArrayList<UserLocation>(FileUtils.readLines(locationFile));
         catch (IOException e) 
            items = new ArrayList<locationFile>();
        
    

【讨论】:

以上是关于在列表中存储标记位置的主要内容,如果未能解决你的问题,请参考以下文章

五线谱调号 ( 调号标识位置 | 调号标记列表 | A 大调标识原理 | FCG 位置标记升号 # | F 大调标识原理 | B 位置标记降号 b )

如何使用地图标记列表创建实时搜索淘汰赛?

0911内容。

用大量的地理位置数据标记带有纬度/经度的大量元素列表

在 Android Studio 中使用动画更新标记位置

地图标记未指向确切位置