2016-04-12 31 views
0

私のコードからわかるように、まだ学習中です。フィルタでHashMapマーカーを表示または非表示にする

たとえば、いくつかのマーカー(列車、バスなど)を含む2つ以上のHashMapsが必要です。私がしたいのは、それらをHashMapでフィルタリングし、選択したHashMapからのマーカーのみを表示することです。利用可能な回答を検索した後、私はmarker.setVisibility(true)でそれを行うことができることを学びました。アプリを起動すると、すべてのマーカーが表示されます。ユーザーがフィルタリングボタンを使用して[OK]を押すと、選択したマーカーのみが表示されるようにするにはどうすればよいですか。ここで

は私MainActivity.javaです:ここでは

package com.example.hartatest; 

import android.support.v4.app.FragmentActivity; 
import android.os.Bundle; 
import android.support.v7.app.AlertDialog; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.View; 
import android.widget.Button; 
import android.widget.CheckBox; 

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.BitmapDescriptor; 
import com.google.android.gms.maps.model.BitmapDescriptorFactory; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.Marker; 
import com.google.android.gms.maps.model.MarkerOptions; 

import java.util.ArrayList; 
import java.util.HashMap; 

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { 

    private GoogleMap mMap; 
    HashMap<String, LatLng> trainMarkers; 
    HashMap<String, LatLng> busMarkers; 



    @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; 

     LatLng australia = new LatLng(-26.128583, 135.158759); 

     mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(australia, 3)); 

     // Markers locations 
     LatLng sydney = new LatLng(-34, 151); 
     LatLng katoomba = new LatLng(-33.717901, 150.312149); 
     LatLng portland = new LatLng(-38.311725, 141.585761); 
     LatLng adelaide = new LatLng(-34.928401, 138.605669); 
     LatLng perth = new LatLng(-31.951340, 115.857019); 
     LatLng campbell = new LatLng(-34.072022, 150.806118); 
     LatLng albany = new LatLng(-34.977138, 117.884153); 


     // trainMarkers HashMap 
     trainMarkers = new HashMap<>(); 
     trainMarkers.put("Marker in Sydney", sydney); 
     trainMarkers.put("Marker in Katoomba", katoomba); 
     trainMarkers.put("Marker in Portland", portland); 
     trainMarkers.put("Marker in Adelaide", adelaide); 
     trainMarkers.put("Marker in Perth", perth); 

     //Add the markers 
     mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_gps_fixed_black_24dp)).snippet("an hour interval for Sydney")); 
     mMap.addMarker(new MarkerOptions().position(katoomba).title("Marker in Katoomba").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_gps_fixed_black_24dp)).snippet("an hour interval for Katoomba")); 
     mMap.addMarker(new MarkerOptions().position(portland).title("Marker in Portland").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_gps_fixed_black_24dp)).snippet("an hour interval for Portland")); 
     mMap.addMarker(new MarkerOptions().position(adelaide).title("Marker in Adelaide").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_gps_fixed_black_24dp)).snippet("an hour interval for Adelaide")); 
     mMap.addMarker(new MarkerOptions().position(perth).title("Marker in Perth").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_gps_fixed_black_24dp)).snippet("an hour interval for Perth")); 
     mMap.addMarker(new MarkerOptions().position(campbell).title("Marker in Campbell").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_gps_fixed_black_24dp)).snippet("an hour interval for Campbell")); 
     mMap.addMarker(new MarkerOptions().position(albany).title("Marker in Albany").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_gps_fixed_black_24dp)).snippet("an hour interval for Albany")); 


     // busMarkers HashMap 

     busMarkers = new HashMap<>(); 
     busMarkers.put("Marker in Campbell", campbell); 
     busMarkers.put("Marker in Albany", albany); 


    } 

    public void filterTheMarkers(View view) { 

     AlertDialog.Builder builder = new AlertDialog.Builder(this); 

     LayoutInflater inflater = this.getLayoutInflater(); 
     View checkBoxView = inflater.inflate(R.layout.marker_selection, null); 
     builder.setView(checkBoxView); 
     CheckBox buses = (CheckBox) checkBoxView.findViewById(R.id.checkBox1); 
     CheckBox trains = (CheckBox) checkBoxView.findViewById(R.id.checkBox2); 

     Button okButton = (Button) checkBoxView.findViewById(R.id.okButton); 
     Button cancelButton = (Button) checkBoxView.findViewById(R.id.cancelButton); 


     builder.show(); 


    } 


public void displaySelectedMarkers(View view) { 


} 

public void doNothing(View view) { 


} 

} 

は私のactivity_maps.xmlファイルです:

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

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Choose Your Transport!" 
     android:textSize="25sp" 
     android:layout_marginTop="20dp" 
     android:layout_marginBottom="10dp" 
     android:layout_gravity="center" 
     android:id="@+id/title_hour_selection" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" /> 

    <CheckBox 
     android:id="@+id/checkBox1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/title_hour_selection" 
     android:layout_marginLeft="30dp" 
     android:layout_marginStart="30dp" 
     android:text="Buses" /> 

    <CheckBox 
     android:id="@+id/checkBox2" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="30dp" 
     android:layout_marginStart="30dp" 
     android:text="Trains" 
     android:layout_below="@+id/checkBox1"/> 


    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="OK" 
     android:layout_marginLeft="30dp" 
     android:layout_marginStart="30dp" 
     android:layout_marginBottom="30dp" 
     android:layout_below="@+id/checkBox2" 
     android:id="@+id/okButton" 
     android:onClick="displaySelectedMarkers"/> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Cancel" 
     android:id="@+id/cancelButton" 
     android:layout_below="@+id/checkBox2" 
     android:layout_alignRight="@+id/checkBox2" 
     android:layout_alignEnd="@+id/checkBox2" 
     android:layout_marginRight="30dp" 
     android:layout_marginEnd="30dp" 
     android:layout_marginBottom="30dp" 
     android:onClick="doNothing"/> 




</RelativeLayout> 

のJava:

<FrameLayout 

xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="com.example.hartatest.MapsActivity" > 

<fragment 
    xmlns:map="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/map" 
    android:layout_weight="1" 
    android:scrollbars="vertical" 
    class="com.google.android.gms.maps.SupportMapFragment"/> 

<ImageButton 
    android:layout_width="50dp" 
    android:layout_height="50dp" 
    android:src="@drawable/ic_marker_filter" 
    android:id="@+id/marker_filter" 
    android:adjustViewBounds="true" 
    style="?android:attr/borderlessButtonStyle" 
    android:onClick="filterTheMarkers"/> 


</FrameLayout> 

そして、ここでは私のmarker_selection.xmlファイルですアップデート

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { 

private GoogleMap mMap; 

List<Marker> busesList = new ArrayList<>(); 
List<Marker> trainsList = new ArrayList<>(); 



@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; 

    LatLng australia = new LatLng(-26.128583, 135.158759); 

    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(australia, 3)); 

    addMarkers2Map(); 



    /*// trainMarkers HashMap 
    trainMarkers = new HashMap<>(); 
    trainMarkers.put("Marker in Sydney", sydney); 
    trainMarkers.put("Marker in Katoomba", katoomba); 
    trainMarkers.put("Marker in Portland", portland); 
    trainMarkers.put("Marker in Adelaide", adelaide); 
    trainMarkers.put("Marker in Perth", perth);*/ 


/* // busMarkers HashMap 

    busMarkers = new HashMap<>(); 
    busMarkers.put("Marker in Campbell", campbell); 
    busMarkers.put("Marker in Albany", albany);*/ 


} 
public void addMarkers2Map(){ 

    // Markers locations 
    LatLng sydney = new LatLng(-34, 151); 
    LatLng katoomba = new LatLng(-33.717901, 150.312149); 
    LatLng portland = new LatLng(-38.311725, 141.585761); 
    LatLng adelaide = new LatLng(-34.928401, 138.605669); 
    LatLng perth = new LatLng(-31.951340, 115.857019); 
    LatLng campbell = new LatLng(-34.072022, 150.806118); 
    LatLng albany = new LatLng(-34.977138, 117.884153); 


    busesList.add(mMap.addMarker(new MarkerOptions().position(campbell).title("Marker in Campbell").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_gps_fixed_black_24dp)).snippet("an hour interval for Campbell"))); 
    busesList.add(mMap.addMarker(new MarkerOptions().position(albany).title("Marker in Albany").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_gps_fixed_black_24dp)).snippet("an hour interval for Albany"))); 
    trainsList.add(mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_gps_fixed_black_24dp)).snippet("an hour interval for Sydney"))); 
    trainsList.add(mMap.addMarker(new MarkerOptions().position(katoomba).title("Marker in Katoomba").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_gps_fixed_black_24dp)).snippet("an hour interval for Katoomba"))); 
    trainsList.add(mMap.addMarker(new MarkerOptions().position(portland).title("Marker in Portland").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_gps_fixed_black_24dp)).snippet("an hour interval for Portland"))); 
    trainsList.add(mMap.addMarker(new MarkerOptions().position(adelaide).title("Marker in Adelaide").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_gps_fixed_black_24dp)).snippet("an hour interval for Adelaide"))); 
    trainsList.add(mMap.addMarker(new MarkerOptions().position(perth).title("Marker in Perth").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_gps_fixed_black_24dp)).snippet("an hour interval for Perth"))); 
} 

AlertDialog dialog; 
CheckBox buses, trains; 

public void filterTheMarkers(View view) { 

    if (dialog == null) { 
     AlertDialog.Builder builder; 
     builder = new AlertDialog.Builder(this); 
     LayoutInflater inflater = this.getLayoutInflater(); 
     View checkBoxView = inflater.inflate(R.layout.marker_selection, null); 
     builder.setView(checkBoxView); 
     buses = (CheckBox) checkBoxView.findViewById(R.id.checkBox1); 
     trains = (CheckBox) checkBoxView.findViewById(R.id.checkBox2); 
     Button okButton = (Button) checkBoxView.findViewById(R.id.okButton); 
     Button cancelButton = (Button) checkBoxView.findViewById(R.id.cancelButton); 
     dialog = builder.create(); 
    } 
    dialog.show(); 

} 



public void displaySelectedMarkers(View view) { 

    dialog.dismiss(); 
    Log.i("TAG", "Trains Status " + trains.isChecked() + " Bus Status " + buses.isChecked()); 
    //according these check boxes status execute your code to show/hide markers 
    if (trains.isChecked() && buses.isChecked()) { 
     //show all markers 
     dialog.dismiss(); 
    } else if (trains.isChecked() && !buses.isChecked()) { 
     //show trains and hide buses markers 
     //if (view.getId() == R.id.checkBox1){ 
      for (Marker marker : busesList){ 
       marker.setVisible(false); 
      } 
     //} 
    } else if (!trains.isChecked() && buses.isChecked()) { 
     //hide trains and show buses markers 
     //if (view.getId() == R.id.checkBox2){ 
      for (Marker marker : trainsList){ 
       marker.setVisible(false); 
      } 
     //} 
    } 
} 

public void doNothing(View view) { 
    dialog.dismiss(); 
} 

}

+0

マップ( 'mMap.clear()')をクリアし、選択したマーカーのみを再追加することができます。 – Titus

答えて

1

私がやっていることは、それぞれのマーカーを自分のカテゴリーList(バス、列車)に保存していて、visibilityメソッドを使ってこのように表示/非表示にすることができます。

List<MarkerOptions> busesList = new ArrayList<>(); 
List<MarkerOptions> tarinsList = new ArrayList<>(); 
    public void addMarker2Map() { 

     busesList.add(mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_gps_fixed_black_24dp)).snippet("an hour interval for Sydney"))); 
     //add others like this 

     tarinsList.add(mMap.addMarker(new MarkerOptions().position(albany).title("Marker in Albany").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_gps_fixed_black_24dp)).snippet("an hour interval for Albany"))); 
     //add others like this 

    } 

//UPDATED 

AlertDialog dialog; 
CheckBox buses, trains; 

public void filterTheMarkers(View view) { 
    if (dialog == null) { 
     AlertDialog.Builder builder; 
     builder = new AlertDialog.Builder(this); 
     LayoutInflater inflater = this.getLayoutInflater(); 
     View checkBoxView = inflater.inflate(R.layout.custom_dialog, null); 
     builder.setView(checkBoxView); 
     buses = (CheckBox) checkBoxView.findViewById(R.id.checkBox1); 
     trains = (CheckBox) checkBoxView.findViewById(R.id.checkBox2); 
     //Button okButton = (Button) checkBoxView.findViewById(R.id.okButton); 
     //Button cancelButton = (Button) checkBoxView.findViewById(R.id.cancelButton); 
     dialog = builder.create(); 
    } 
    dialog.show(); 
} 

public void displaySelectedMarkers(View view) { 
    dialog.dismiss(); 
    Log.i("TAG", "Trains Status " + trains.isChecked() + " Bus Status " + buses.isChecked()); 
    //according these check boxes status execute your code to show/hide markers 
    for(MarkerOptions train : trainsList){ 
     train.visible(trains.isChecked()); 
    } 
    for(MarkerOptions buss : busesList){ 
     buss.visible(buses.isChecked()); 
    } 
} 

public void doNothing(View view) { dialog.dismiss(); } 

Happy_Coding;

+0

これは確かに私の正解です。それはまさに私がやろうとしていることです。現時点の唯一の問題は、チェックを行った後、[AlertDioalog]ボタンの[OK]ボタンをクリックしても何も起こらないという事実です...さらにリスト busesList = new ArrayList <>();私に黄色いエラーが表示されます:コレクション 'busesList'の内容は照会されますが、更新されることはありません。 –

+0

黄色のエラーはどういう意味ですか? – Bharatesh

+0

更新された答えを確認してください.. – Bharatesh

0

のHashMapであなたのマーカーを保存:HashMapを使用して、マップ内の

trainMarkers.put("Marker in Sydney",new MarkerOptions().position(sydney).title("Marker in Sydney").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_gps_fixed_black_24dp)).snippet("an hour interval for Sydney")); 
trainMarkers.put("Marker in Katoomba".position(katoomba).title("Marker in Katoomba").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_gps_fixed_black_24dp)).snippet("an hour interval for Katoomba")); 
trainMarkers.put("Marker in Portland".position(portland).title("Marker in Portland").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_gps_fixed_black_24dp)).snippet("an hour interval for Portland")); 

セットマーカー:

mMap.addMarker(trainMarkers.get("Marker in Sydney")); 
mMap.addMarker(trainMarkers.get("Marker in Katoomba")); 
mMap.addMarker(trainMarkers.get("Marker in Portland")); 

をそうしないマーカーをマップから削除します。あなたがほしいと思う場合例えば、表示したいポートランド市場:

trainMarkers.get("Marker in Sydney").remove(); 
trainMarkers.get("Marker in Katoomba").remove(); 
+0

これは1つのマーカーだけを削除したい場合には問題ありません。私はカテゴリー内のすべてのマーカーを削除したい。 –

+0

すべてのカテゴリに対してHashMapを作成し、usingおよびIteratorを設定および設定解除して、それらのHashMap内のすべてのデータを取得します。 –

0

マップを消去し(mMap.clear())、選択したマーカーのみを再追加できます。あなたがMap Sを使用している理由は、あなたがMarkerOptionsのリストを使用することができます(場所の情報を変更する必要がない場合、私は、よく分からない

public void filterTheMarkers(View view) { 
    .... 

    okButton.setOnClickListener(
     new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(mMap!=null){ 
        mMap.clear(); 
        if(buses.isSelected()){ 
         for(String key : busMarkers.keySet()){ 
          mMap.addMarker(new MarkerOptions().position(busMarkers.get(key)).title(key).icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_gps_fixed_black_24dp)).snippet("...")); 
         } 
        }else if(..){ 
         .... 
        } 
        builder.dismiss(); 
       } 
      } 
     }); 

     .... 
} 

:ここ

は一例です List<MarkerOptions>)を使用します。

+0

私はそれらをクリアしたくありませんが、私はそれらを表示して非表示にしたいだけです。私はそれらをクリアして毎回追加するのは大丈夫ではないと言ったチュートリアルを見ました。 –

+0

@AlexSimion 'LatLng'オブジェクトへの参照のみを保持している場合は、' GoogleMap'に追加した 'MarkerOptions'オブジェクトへの参照を保持する必要があります。それらを隠す。 – Titus

+0

はい、それは私がbharatの答えが必要なものだと私が考えている理由です... –

関連する問題