gpt4 book ai didi

android - 使用 Maps API v2 以编程方式初始化 MapFragment

转载 作者:IT王子 更新时间:2023-10-28 23:45:45 25 4
gpt4 key购买 nike

我正在尝试将 MapFragment 添加到我当前的 Fragment。嵌套 fragment 的使用仅限于 FragmentTransactions,您不能在布局中使用 xml 标签。另外,我希望在用户按下按钮时将其添加到主 fragment 中。因此,当用户按下该按钮并将其添加到适当的位置时,我使用 getInstance() 以编程方式创建 MapFragment。它显示正确,到目前为止一切顺利。

问题是,在附加 MapFragment 后,我​​需要获取对 GoogleMap 的引用以放置标记,但是 getMap()方法返回 null(因为 fragment 的 onCreateView() 还没有被调用)。

我查看了演示示例代码,发现他们使用的解决方案是在 onCreate() 中初始化 MapFragment 并在 onResume() 中获取对 GoogleMap 的引用,在 onCreateView() 被调用之后。

我需要在 MapFragment 初始化后立即获取对 GoogleMap 的引用,因为我希望用户能够使用按钮显示或隐藏 map 。我知道一个可能的解决方案是如上所述在开始时创建 map ,然后将其可见性设置为消失,但我希望 map 默认关闭,因此如果用户没有明确询问,它不会占用用户的带宽为它。

我尝试使用 MapsInitializer,但也不起作用。我有点卡住了。有任何想法吗?到目前为止,这是我的测试代码:

public class ParadaInfoFragment extends BaseDBFragment {
// BaseDBFragment is just a SherlockFragment with custom utility methods.

private static final String MAP_FRAGMENT_TAG = "map";
private GoogleMap mMap;
private SupportMapFragment mMapFragment;
private TextView mToggleMapa;
private boolean isMapVisible = false;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_parada_info, container, false);
mToggleMapa = (TextView) v.findViewById(R.id.parada_info_map_button);
return v;
}

@Override
public void onStart() {
super.onStart();
mToggleMapa.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!isMapVisible) {
openMap();
} else {
closeMap();
}
isMapVisible = !isMapVisible;
}
});
}

private void openMap() {
// Creates initial configuration for the map
GoogleMapOptions options = new GoogleMapOptions().camera(CameraPosition.fromLatLngZoom(new LatLng(37.4005502611301, -5.98233461380005), 16))
.compassEnabled(false).mapType(GoogleMap.MAP_TYPE_NORMAL).rotateGesturesEnabled(false).scrollGesturesEnabled(false).tiltGesturesEnabled(false)
.zoomControlsEnabled(false).zoomGesturesEnabled(false);

// Modified from the sample code:
// It isn't possible to set a fragment's id programmatically so we set a
// tag instead and search for it using that.
mMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentByTag(MAP_FRAGMENT_TAG);

// We only create a fragment if it doesn't already exist.
if (mMapFragment == null) {
// To programmatically add the map, we first create a
// SupportMapFragment.
mMapFragment = SupportMapFragment.newInstance(options);
// Then we add it using a FragmentTransaction.
FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.parada_info_map_container, mMapFragment, MAP_FRAGMENT_TAG);
fragmentTransaction.commit();
}
// We can't be guaranteed that the map is available because Google Play
// services might not be available.
setUpMapIfNeeded(); //XXX Here, getMap() returns null so the Marker can't be added
// The map is shown with the previous options.
}

private void closeMap() {
FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction();
fragmentTransaction.remove(mMapFragment);
fragmentTransaction.commit();
}

private void setUpMapIfNeeded() {
// Do a null check to confirm that we have not already instantiated the
// map.
if (mMap == null) {
// Try to obtain the map from the SupportMapFragment.
mMap = mMapFragment.getMap();
// Check if we were successful in obtaining the map.
if (mMap != null) {
mMap.addMarker(new MarkerOptions().position(new LatLng(37.4005502611301, -5.98233461380005)).title("Marker"));
}
}
}
}

谢谢

最佳答案

优秀的 AnderWebs 在 Google+ 中给了我答案但是他太懒了.... emm 忙到这里再写,所以这里是简短的版本:扩展 MapFragment 类并覆盖 onCreateView() 方法。完成此方法后,我们可以获得对 GoogleMap 对象的非空引用。

这是我的特殊解决方案:

public class MiniMapFragment extends SupportMapFragment {
private LatLng mPosFija;

public MiniMapFragment() {
super();
}

public static MiniMapFragment newInstance(LatLng posicion){
MiniMapFragment frag = new MiniMapFragment();
frag.mPosFija = posicion;
return frag;
}

@Override
public View onCreateView(LayoutInflater arg0, ViewGroup arg1, Bundle arg2) {
View v = super.onCreateView(arg0, arg1, arg2);
initMap();
return v;
}

private void initMap(){
UiSettings settings = getMap().getUiSettings();
settings.setAllGesturesEnabled(false);
settings.setMyLocationButtonEnabled(false);

getMap().moveCamera(CameraUpdateFactory.newLatLngZoom(mPosFija,16));
getMap().addMarker(new MarkerOptions().position(mPosFija).icon(BitmapDescriptorFactory.fromResource(R.drawable.marker)));
}
}

现在在我之前的 Fragment 类中

mMapFragment = MiniMapFragment.newInstance(new LatLng(37.4005502611301, -5.98233461380005));

也许还不完美,因为显示 map 时屏幕会闪烁。但不确定问题是因为这个还是其他原因。

关于android - 使用 Maps API v2 以编程方式初始化 MapFragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13733299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com