【问题标题】:How to show search marker with title and hide others marker android map如何显示带有标题的搜索标记并隐藏其他标记android地图
【发布时间】:2016-11-08 07:13:34
【问题描述】:

我使用 json 和 php 从数据库中检索几个标记,现在我想按标题搜索标记并显示带有标题的标记并隐藏其他标记。 这是java代码

public class MainActivity extends FragmentActivity {

    private GoogleMap googleMap;
    private List<Marker> markers = new ArrayList<>();



    // Search EditText
    EditText inputSearch;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SupportMapFragment fragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        googleMap = fragment.getMap();
        //  googleMap.setMyLocationEnabled(true);
        new RetrieveTask().execute();

        inputSearch = (EditText) findViewById(R.id.editText);

        inputSearch.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // When user changed the Text
                showMarker(s.toString());
            }


            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub    

            }

    });
    }

private void showMarker(String s) {

        for (Marker marker : markers) {

            if (marker.getTitle().equalsIgnoreCase(name)) {
                marker.setVisible(true);
                marker.showInfoWindow();
            } else {
                marker.setVisible(false);
            }
        }
    }   




    private class RetrieveTask extends AsyncTask<Void, Void, String> {
        @Override
        protected String doInBackground(Void... params) {
            String strUrl = "http://192.168.43.229/location_marker_mysql/retrieve.php";
            URL url = null;
            StringBuffer sb = new StringBuffer();

            try {
                url = new URL(strUrl);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.connect();
                InputStream iStream = connection.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(iStream));
                String line = "";
                while ((line = reader.readLine()) != null) {
                    sb.append(line);
                }

                reader.close();
                iStream.close();

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return sb.toString();
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            new ParserTask().execute(result);

       }
    }

    MarkerOptions markerOptions = new MarkerOptions();
    String name;
    LatLng latLng;
    double lat;
    double lng;

    private class ParserTask extends AsyncTask<String, Void, List<HashMap<String, String>>> {
        @Override
        protected List<HashMap<String, String>> doInBackground(String... params) {
            MarkerJSONParser markerParser = new MarkerJSONParser();
            JSONObject json = null;
            try {
                json = new JSONObject(params[0]);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            List<HashMap<String, String>> markersList = markerParser.parse(json);
            return markersList;
        }

        @Override
        protected void onPostExecute(List<HashMap<String, String>> result) {
            for (int i = 0; i < result.size(); i++) {
                HashMap<String, String> hmPlace = result.get(i);
                lat = Double.parseDouble(hmPlace.get("lat"));
                lng = Double.parseDouble(hmPlace.get("lng"));
                name = hmPlace.get("name");
                String locality = hmPlace.get("locality");
                String city = hmPlace.get("city");
                latLng = new LatLng(lat, lng);
                markerOptions.position(latLng);
                markerOptions.title(name);
                markerOptions.snippet(locality + "," + city);
                markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.school_marker));
                markers.add(googleMap.addMarker(markerOptions));
                googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(24.66372, 93.90627), 8.0f));
            }
        }
    }

这里是xml文件

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    tools:context=".MainActivity" >

        <EditText
            android:id="@+id/editText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="4"
            android:hint="Search Here" />
 <fragment  
     android:id="@+id/map"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     class="com.google.android.gms.maps.SupportMapFragment" />

</LinearLayout>

任何帮助将不胜感激。

【问题讨论】:

    标签: android json google-maps


    【解决方案1】:

    您只需要创建一个List&lt;Marker&gt; 来保存您的标记(我使用的是List 而不是Map,因为您需要遍历所有标记以隐藏除一个之外的所有标记):

    private List<Marker> markers = new ArrayList<>();
    

    然后,您需要像这样将它们添加到List&lt;Marker&gt;,而不是将它们添加到地图上:

    markers.add(googleMap.addMarker(markerOptions));
    

    现在您可以隐藏所有标记,除了具有所需标题的标记:

    private void showMarker(String title) {
        for (Marker marker : markers) {
            if (marker.getTitle().equalsIgnoreCase(title)) {
                marker.setVisible(true);
            } else {
                marker.setVisible(false);
            }
        }
    }
    

    在您的代码中:

    public class MainActivity extends FragmentActivity {
    
        private GoogleMap googleMap;
        private List<Marker> markers = new ArrayList<>();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            SupportMapFragment fragment = (SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.map);
            googleMap = fragment.getMap();
            //  googleMap.setMyLocationEnabled(true);
            new RetrieveTask().execute();
        }
    
        private void showMarker(String title) {
            for (Marker marker : markers) {
                if (marker.getTitle().equalsIgnoreCase(title)) {
                    marker.setVisible(true);
                } else {
                    marker.setVisible(false);
                }
            }
        }
    
        private class RetrieveTask extends AsyncTask<Void, Void, String> {
            @Override
            protected String doInBackground(Void... params) {
                String strUrl = "http://192.168.43.229/location_marker_mysql/retrieve.php";
                URL url = null;
                StringBuffer sb = new StringBuffer();
    
                try {
                    url = new URL(strUrl);
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    connection.connect();
                    InputStream iStream = connection.getInputStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(iStream));
                    String line = "";
                    while ((line = reader.readLine()) != null) {
                        sb.append(line);
                    }
    
                    reader.close();
                    iStream.close();
    
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return sb.toString();
            }
    
            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);
                new ParserTask().execute(result);
            }
        }
    
        MarkerOptions markerOptions = new MarkerOptions();
        String name;
        LatLng latLng;
        double lat;
        double lng;
    
        private class ParserTask extends AsyncTask<String, Void, List<HashMap<String, String>>> {
            @Override
            protected List<HashMap<String, String>> doInBackground(String... params) {
                MarkerJSONParser markerParser = new MarkerJSONParser();
                JSONObject json = null;
                try {
                    json = new JSONObject(params[0]);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                List<HashMap<String, String>> markersList = markerParser.parse(json);
                return markersList;
            }
    
            @Override
            protected void onPostExecute(List<HashMap<String, String>> result) {
                for (int i = 0; i < result.size(); i++) {
                    HashMap<String, String> hmPlace = result.get(i);
                    lat = Double.parseDouble(hmPlace.get("lat"));
                    lng = Double.parseDouble(hmPlace.get("lng"));
                    name = hmPlace.get("name");
                    String locality = hmPlace.get("locality");
                    String city = hmPlace.get("city");
                    latLng = new LatLng(lat, lng);
                    markerOptions.position(latLng);
                    markerOptions.title(name);
                    markerOptions.snippet(locality + "," + city);
                    markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.school_marker));
                    markers.add(googleMap.addMarker(markerOptions));
                    googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(24.66372, 93.90627), 8.0f));
                }
            }
        }
    }
    

    您只需要使用所需的标题调用showMarker 即可隐藏(但不删除)除所需标记之外的所有标记。

    【讨论】:

    • 我不明白该怎么做请帮我写代码
    • 请告诉我如何使用edittext搜索和显示标记
    • 为了提高您的问题的可见度,以便其他人可以回答并帮助解决相同问题的其他人,您应该提出一个新问题(请参阅meta.stackexchange.com/questions/19457/…)
    【解决方案2】:
    private final Marker YourMarker;
    //Your code
    
    YourMarker=googleMap.addMarker(markerOptions);
    YourMarker.showInfoWindow();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 2014-12-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多