【发布时间】:2012-12-03 08:59:30
【问题描述】:
我试图从不同的角度来解决这个问题,但没有运气。也许问一个一般性问题会有所帮助。
从技术上讲,我使用的是 osmdroid 的 MapView 实现,而不是 Google 的 Maps API,但我认为这个问题是更通用的编程视图与 onCreate 中定义的 main_activity.xml 视图。
如果我在我的 MainActivity 中创建一个视图,例如 MapView,然后以编程方式将其设置为 ContentView,我还必须以编程方式添加我想在我的应用中显示的任何其他视图:
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.mapView = new MapView(this, 256);
...
this.setContentView(this.mapView);
}
如果我尝试将 ContentView 设置为 activity_main,则无法在创建时调整 MapView。也许我遗漏了一些东西:(请注意,我有一些方法可以处理加载自定义离线图块集,并在地图上放置标记等...)
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.mapView = (MapView)findViewById(R.id.mapview);
...
this.intializeMapTiles();
this.mapView.setBuiltInZoomControls(true);
this.mapView.setMultiTouchControls(true);
this.mapController.setCenter(new GeoPoint((int)(50.349622 * 1E6), (int)(-71.823700 *1E6)));
...
this.mapView.invalidate();
}
在这种情况下,这是我的 activity_main.xml:
<RelativeLayout 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=".MainActivity" >
<org.osmdroid.views.MapView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="false"/>
</RelativeLayout>
当尝试从 ContentView (acitivty_main) 获取 MapView 时,我对它的任何方法更改都不会产生任何影响。就好像我无法访问正在呈现的确切 MapView。我试过让我的 MapView 无效,但这没关系。我得到一个默认外观和行为的 MapView。
我试图解决这个问题的原因自然是我在寻找我的应用程序来包含多个 MapView。我想包括一个SlidingDrawer,或者一些显示带有按钮的视图的方法,只有在你长按地图标记时才会显示。 (请注意,我在地图标记长按时会显示 Toast 弹出窗口,所以我在这方面做得很好)
我必须以编程方式而不是从 main_activity.xml 添加这些其他视图(SlideingDrawer 等)。即使这样也有一个 catch-22,其中 SlidingDrawer 构造函数需要一个来自 xml 的 AttributeSet,这对自己构建来说很痛苦。 (我试过了)那你也得担心布局了。
有人有什么建议吗?通用还是其他?谢谢!
【问题讨论】:
-
从您提交的代码来看,它应该可以工作。有两件事要尝试——确保您不会通过留下 this.mapView = new mapView(...) 调用而意外覆盖您的 this.mapView。其次,有时您需要在更改后刷新,因此请在更改后尝试 this.mapView.invalidate()。
-
感谢您的建议。我更新了我的第二个样本。 this.mapView.invalidate() 没有帮助。 MapView 不接受我的方法调用(例如,图块、中心、缩放等都是默认设置,甚至不显示缩放控件)
-
我仍然会检查您对 mapView 的引用,并确保它没有被意外修改。同时,您可以将编程视图元素与 XML 混合。您可以使用布局的
addView方法将代码实例化的地图视图添加到 Xml 布局。有关这方面的示例,请参阅this question 的答案 -
废话,你是对的!我在设置映射器的自定义 MapTiles 方法中重置了 MapView。我还没有说它是固定的,我只有时间来达到顶峰,但你应该提供这个作为答案,这样我就可以代表你了!
-
Arg... 我刚刚意识到我仍然存在必须以编程方式构造 MapView 的原始问题。 SlidingDrawer 视图等......都来自 Main_Activity,而我正在尝试用我自己的替换 Main_Activity 的 MapView。 (为我的图块、缩放按钮等构建和配置...)
标签: android android-activity android-mapview