我查看了演示示例代码,发现他们使用的解决方案是在oncreate()
中初始化MapFragment,并在调用oncreateView()
之后,在oncreame()
中获取对GoogleMap的引用。
我需要在MapFragment初始化后立即获得对GoogleMap的引用,因为我希望用户能够用按钮显示或隐藏地图。我知道一个可能的解决方案是像上面所说的那样在开始时创建地图,然后设置它的可见性消失,但我希望地图默认关闭,这样如果用户没有明确要求,它就不会占用用户的带宽。
我尝试使用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()
方法。完成此方法后,我们可以获得对queGoogleMap
对象的非空引用。
这是我的特殊解决方案:
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)));
}
}
在前面的片段类中
mMapFragment = MiniMapFragment.newInstance(new LatLng(37.4005502611301, -5.98233461380005));
问题内容: 如果我们有以下代码片段: 在终端中,输入请求如下所示 如何以编程方式模拟用户的输入。 问题答案: 这是一个示例,该示例如何使用函数来操纵的输入缓冲区,以从检索假输入 看到它正常工作 另一个选择(与JoachimPileborg在其评论恕我直言中所说的更接近)是将阅读代码放入单独的函数中,例如 这使您可以进行不同的测试和生产要求,例如
问题内容: 我正在使用JDT生成一些类。之后,我想格式化整个ICompilationUnit,就像我在没有选择的打开的编辑器中按Ctrl + Shift + F(源>格式)一样。 高度赞赏JDT中用于以编程方式格式化源代码的API的任何指针。 另外:我像这样尝试过,但是代码没有改变。我在说什么 问题答案: 这可能是一个错误,但是使用Elcipse 4.2.2中的JDK时,有必要创建ICompila
使用 lavas init 创建的模板项目中,在以下场景下都会以编程方式使用 Lavas: server.dev.js 开发环境下的 SPA/SSR 模式。 server.prod.js 生产环境下的 SSR 模式。 可见以编程方式使用 Lavas 的主要场景就是 SSR 模式,而在 SPA 模式下仅仅是供开发服务器使用。因此,如果开发者选择了 SSR 模式,阅读下面的内容将十分有帮助: 如何选择
1. 前言 通过之前的学习,我们可以熟练掌握 Spring 容器初始化的方法。常用的方法:一种是纯 xml 文件的方式,第二种是使用群体最多的一种,就是 xml 文件搭配类上面的注解,来进行初始化容器。 我们今天讲解一种全新的方法,也是目前最为流行的一种方法。是基于 JavaConfig 的方式来实现。通俗地说也叫基于注解的方式。 疑问导出: 我们学完了那么多种 Spring 的使用,其实完全可以
问题内容: 如何以编程方式为情节提要设置?我想根据不同的启动条件将情节提要板打开到其他视图。 问题答案: 如何 不 使用虚拟初始视图控制器 确保所有初始视图控制器都有一个Storyboard ID。 在情节提要中,取消选中第一个视图控制器中的“是初始视图控制器”属性。 如果您此时运行应用程序,则将阅读: 您会注意到,应用程序委托中的window属性现在为nil。 在应用程序的设置中,转到目标和选项
在XML中,我用TableRow(表的标题)定义了TableLayout。每隔一行将以编程方式添加。问题:我无法使新行与XML中的行对齐 > 3个TextView数组,1个TableRow数组 循环使用TextViews和TableRows填充这些数组 全部赋予setTableRowParams方法 设置TextViews的文本 将所有行添加到TableLayout setTableRowPara