0

Я создал приложение, которое использует Карты Google, чтобы получить текущее местоположение пользователей и нарисовать маршруты. Недавно я конвертировал это приложение в TabHost с пятью вкладками. Из-за этого я теперь нуждаюсь в способе очистки и перезапуска карты всякий раз, когда пользователь нажимает на эту вкладку. Как я могу это сделать. Ниже приведена layout.xml и код активности для моей карты.Как очистить карту всех точек и маркеров и маршрутов при переключении вкладок с помощью узла табуляции

activity_map_view.xml

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


    <Button 
     android:id="@+id/btn_draw" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text=" Get Directions" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" /> 

    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" > 

     <Button 
      android:id="@+id/btn_find" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/str_btn_find" 
      android:layout_alignParentRight="true" /> 

     <EditText 
      android:id="@+id/et_location" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:inputType="text" 
      android:hint="@string/hnt_et_location" 
      android:layout_toLeftOf="@id/btn_find" /> 

    </RelativeLayout> 



    <fragment 
      android:id="@+id/map" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    class="com.google.android.gms.maps.SupportMapFragment"/> 
</LinearLayout> 

И ниже мой мой на создание способа MapviewActivity.java

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    markerList = new ArrayList<Marker>(); 



    if (EvacRouteTableActivity.evacRouteStr !=null){ 
     fuelStopBundle = EvacRouteTableActivity.evacRouteStr; 
     evacName = EvacRouteTableActivity.evacRouteStr; 

    } else if (FuelStopActivity.type != null){ 
     fuelStopBundle = FuelStopActivity.type; 
     shelorfuelAddress = FuelStopActivity.type; 
    } else if (ShelterActivity.type != null){ 
     fuelStopBundle = ShelterActivity.type; 
     shelorfuelAddress = ShelterActivity.type; 
    } 
    //List<EvacRoute> evacRouteList = new ArrayList<EvacRoute>(DALController.sharedInstance().getAllEvacRoutes()); 
    lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    List<FuelStop> fuelStopList = new ArrayList<FuelStop>(); 
    List<Shelter> shelterList = new ArrayList<Shelter>(); 
    final boolean isGPS = lm.isProviderEnabled(LocationManager.GPS_PROVIDER); 
    setContentView(R.layout.activity_map_view); 
    MapAsyncClass ac = new MapAsyncClass(MapViewActivity.this); 
    ac.execute(); 
    Button btn_find = (Button) findViewById(R.id.btn_find); 
    btn_directions = (Button) findViewById(R.id.btn_draw); 
    // Getting reference to btn_find of the layout activity_main 

    final EditText etLocation = (EditText) findViewById(R.id.et_location); 
    if (isGPS){ 
     btn_find.setVisibility(View.GONE); 
     etLocation.setVisibility(View.GONE); 
    } else { 
     btn_find.setVisibility(View.VISIBLE); 

     etLocation.setVisibility(View.VISIBLE);  
     btn_directions.setVisibility(View.GONE); 
    } 


    //shelorfuelAddress = fuelStopBundle.getString("key"); 
    /** 
    * This will make sure that if the user selects the 
    */ 

    if (fuelStopBundle != null && evacName != null){ 



     //showCurrentLocationOnMap(); 


     // Defining button click event listener for the find button 
     findClickListener = new OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       // Getting user input location 
       String location = etLocation.getText().toString(); 


       if(location!=null && !location.equals("")){ 
        currentLocation = getLocationFromAddress(location); 

        AsyncTask<String, Void, List<Address>> execute = new GeocoderTask().execute(location); 
        String latStr = String.valueOf(latitude); 
        String longStr = String.valueOf(longitude); 

        try { 
         evacRoute = DALController.sharedInstance().getEvacuationRoutewithoutgps(evacName, currentLocation, latStr, longStr); 
        } catch (ClientProtocolException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (URISyntaxException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (ParserConfigurationException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (SAXException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        showEvacuationRoute(evacRoute); 
       } 
      } 
     }; 
    } 
    showCurrentLocationOnMap(); 

    if (isGPS){ 
    // Defining button click event listener for the find button 
     OnClickListener directionsClickListener = new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (shelorfuelAddress!=null){ 
        Intent intent = new Intent(android.content.Intent.ACTION_VIEW,  
          Uri.parse("http://maps.google.com/maps?saddr=<"+latitude+">,<"+longitude+">&daddr=<"+currentFuelLat+">,<"+currentFuellong+">")); 
        startActivity(intent); 
       } else { 
        LatLng destLatLng = DALController.sharedInstance().getDestPoint();   
        Double latDouble = destLatLng.latitude; 
        Double longDouble = destLatLng.longitude; 
        Intent intent = new Intent(android.content.Intent.ACTION_VIEW,   
          Uri.parse("http://maps.google.com/maps?saddr=<"+latitude+">,<"+longitude+">&daddr=<"+latDouble+">,<"+longDouble+">")); 
        startActivity(intent);     
       } 


      } 
     }; 
     btn_directions.setOnClickListener(directionsClickListener); 
    } 

    btn_find.setOnClickListener(findClickListener); 

    /** 
    * this ensures that if the user clicked on the Mapview from the MainActivity 
    * that ten shelters and ten fueling points will show on the map 
    */ 
    if (shelorfuelAddress==null && isGPS){ 


     // Setting button click event listener for the find button 
     btn_find.setOnClickListener(findClickListener); 
     fuelStopList = DALController.sharedInstance().getAllFuelStops(); 
     shelterList = DALController.sharedInstance().getAllShelters(); 
     if (fuelStopList == null){ 

     } else { 
      for (FuelStop fuelStop : fuelStopList){ 


       try { 
        ShowFuelStop(fuelStop.getAddress()); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

     for (Shelter shelter : shelterList){ 

      try { 
       ShowShelters(shelter.getAddress()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     }  

    } 

    mMenu = new CustomMenu(this, this, getLayoutInflater()); 
    mMenu.setHideOnSelect(true); 
    mMenu.setItemsPerLineInPortraitOrientation(4); 
    mMenu.setItemsPerLineInLandscapeOrientation(8); 
    //load the menu items 
    loadMenuItems(); 
} 

ответ

0

я нашел со временем в map.clear() работает, но объекты, где получение повторно добавлены карты из-за использования некоторых глобальных переменных, которые мне нужны. Поэтому мне пришлось сделать map.clear() в onResume(), а затем выполнить удаление объектов. Как только я это сделал, он сработал и фактически освободил объекты, помогавшие с сборкой мусора на карте, поскольку у java есть проблемы со сбором предметов, которые все еще имеют ссылку. См. Код ниже.

@Override 
public void onResume(){ 
    super.onResume(); 
    if (map != null){ 
     onCreateCalled += 1; 
     if (onCreateCalled >=3){ 
      if (fuelPolyLine != null){ 
       fuelPolyLine.remove(); 
       fuelPolyLine = null; 
       fuelStoprectLine = null; 
      } 
      if (shelterPolyLine != null){ 
       shelterPolyLine.remove(); 
       shelterPolyLine = null; 
       shelterRectLine = null; 
      } 
      if (evacPolyLine != null){ 
       evacPolyLine.remove(); 
       evacPolyLine = null; 
       evacRouteRectLine = null; 
      } 
      map.clear(); 
      currentLocation = null; 
      map = null; 
      markerOptions = null; 
      evacRoute = null; 
      lm = null; 
      ll = null; 
      mf = null; 


      setupMap(); 

     } 


    } 
} 
0

Использование mapview.clear(), чем mapview.invalidate(). После каждого изменения пользовательского интерфейса вы должны вызвать invalidate() на mapview.

+0

У меня нет карты на моем xml. Как я могу создать это и очистить, не могли бы вы привести мне пример. Все, что у меня есть в xml, - это mapfragment. – yams

+0

Ну, я никогда раньше не использовал mapfragment, но должен быть какой-то способ уничтожить все данные из него, позвольте мне посмотреть некоторые вещи на mapfragment, и я отвечу вам. –

+0

Ok Мой весь layer.xml размещен выше. – yams

-2
 setContentView(R.layout.activity_map_view); 

    // 
     SupportMapFragment fm = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map); 
     map = fm.getMap(); 
     // 
+0

Хорошо, но зачем нужен FragmentManager, если вы не собираетесь его использовать – yams

+0

А также нет MarkerPoints. – yams

+0

, потому что в вашем макете вы используете фрагмент не mapview попробуйте его без отметки маркера >>>> – H4F