【问题标题】:android - Add a Marker to a Fragment Map from Activityandroid - 从 Activity 向 Fragment Map 添加标记
【发布时间】:2017-12-17 07:07:24
【问题描述】:

我需要从 MainActivity 向 Android Google 地图(片段)添加标记

这是我的代码;

class Map extends android.app.Fragment implements OnMapReadyCallback


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.activity_mapa, container,false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        MapFragment fragment = (MapFragment)getChildFragmentManager().findFragmentById(R.id.map);
        fragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        LatLng marker = new LatLng(19.33978502, -99.19086277);
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(marker, 15));
        googleMap.addMarker(new MarkerOptions().title("Marca de Prueba 1").position(marker));
    }
}

我想从这里添加一个标记:

这一切都是因为我想从我的主 Activity 与我的地图进行交互,我有一些按钮和 EditText

MainActivity

public class MainActivityextends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener
{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_side_bar);
    }

    FragmentManager fm = getFragmentManager();
    fm.beginTransaction().replace(R.id.content_frame, new Mapa()).commit();
}

Here is how it looks, already has a mark, but insted of calling it from the map activity i need to set it from the MainActivity

【问题讨论】:

    标签: android google-maps fragment


    【解决方案1】:

    你只需要在Fragment中定义一个可以从Activity调用的公共方法:

    class Mapa extends android.app.Fragment implements OnMapReadyCallback
    
        GoogleMap mMap;
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            return inflater.inflate(R.layout.activity_mapa, container,false);
        }
    
        @Override
        public void onViewCreated(View view, Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
    
            MapFragment fragment = (MapFragment)getChildFragmentManager().findFragmentById(R.id.map);
            fragment.getMapAsync(this);
        }
    
        @Override
        public void onMapReady(GoogleMap googleMap) {
            mMap = googleMap;
        }
    
        //Added public method to be called from the Activity
        public void placeMarker(String title, double lat, double lon) {
          if (mMap != null) {
            LatLng marker = new LatLng(lat, lon);
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(marker, 15));
            mMap.addMarker(new MarkerOptions().title(title).position(marker));
          }
        }
    }
    

    然后,在Activity中,保留对Fragment的引用,以便调用placeMarker()方法:

    public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {
    
      private Mapa mMapFragment;
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_side_bar);
          }
    
          mMapFragment = new Mapa();
          FragmentManager fm = getFragmentManager();
          fm.beginTransaction().replace(R.id.content_frame, mMapFragment).commit();
      }
    
      private void placeMarkerInMap(String title, double lat, double lon) {
        if (mMapFragment != null) {
           mMapFragment.placeMarker(title, lat, lon); 
        }
      }
    }
    

    然后当用户填写EditText并点击按钮时,你可以在你的Activity中调用placeMarkerInMap()方法。

    请注意,如果您尝试在 onMapReady() 回调执行之前调用此方法,则不会有一个有效的 GoogleMap 引用用于放置标记。 如果您需要在 Activity 的初始启动时放置标记,则需要在 FragmentTransaction 中使用参数。 See here for more details.

    【讨论】:

    • 谢谢!我按照你说的做了,但是当我在主要活动上调用 placeMarker 方法时,它说无法解决。 :S 有什么想法吗?
    • 我的 Fragment 叫做 Mapa*
    • @JosCarrillo 我明白了问题所在。我刚刚更新了答案。声明实际上应该是private Mapa mMapFragment;,更改它就可以了。
    • 谢谢!现在正在工作,我必须将 placeMarker 方法静态和 Google 地图 mMap 也更改为静态。非常感谢!!
    • @JosCarrillo 我不建议将其设为静态......您应该能够使其工作而不使其成为静态!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 2018-04-14
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多