- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 Android 上的 MapView 中的某些标记顶部放置一个弹出窗口,类似于 iPhone 的标注。我到处都看到每个人都推荐第 3 方 API 来做到这一点?
没有本地方法可以做到这一点吗?我需要放置一些基本信息,例如文本和按钮,我的首要任务是在每部 Android 手机上尽可能做到原生,因为它们或多或少都有所不同。
这是本地 map 应用程序的示例:
最佳答案
是的,它在 Android 中要容易得多。这是代码;
在您的 MapActivity 类中声明此变量(或者最好在互联网上阅读有关此变量的信息)
private List<Overlay> mapOverlays;
private CustomItemizedOverlay customItemizedOverlay;
在你的 onCreate() 中
mapOverlays = mapView.getOverlays();
customItemizedOverlay = new CustomItemizedOverlay(
GoogleMapsActivity.this);
if (arrayList != null) {
//here Marker is my custom class which contains GeoPoints
for (Marker marker : arrayList) {
GeoPoint point = new GeoPoint(
(int) (marker.getLat() * 1E6),
(int) (marker.getLng() * 1E6));
OverlayItem overlayitem = new OverlayItem(point,
marker.getTitle(), marker.getDescription());
customItemizedOverlay.addOverlay(overlayitem);
}
//finally add all GeoPoints to the mapOverlays
mapOverlays.add(customItemizedOverlay);
if (arrayList.size() > 0) {
GeoPoint geoPoint = new GeoPoint((int) (arrayList.get(1)
.getLat() * 1E6),
(int) (arrayList.get(1).getLng() * 1E6));
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if (currentapiVersion >= android.os.Build.VERSION_CODES.FROYO) {
mapController.animateTo(geoPoint, new Message());
}
}
public MapView getMapView() {
return this.mapView;
}
这是我的 CustomItemizedOverlay 类的代码(它可能会吓到你)
public class CustomItemizedOverlay extends ItemizedOverlay<OverlayItem>
implements OnKeyListener {
private final Bitmap bitMap;
private ViewFlipper viewFlipper;
private final ArrayList<OverlayItem> overLayItems = new ArrayList<OverlayItem>();
private final GoogleMapsActivity googleMapsActivity;
public int selectedIndex = -1;
private View view = null;
private RelativeLayout relativeLayout = null;
private static WebView webView;
public CustomItemizedOverlay(GoogleMapsActivity googleMapsActivity) {
super(boundCenterBottom(googleMapsActivity.getResources().getDrawable(
R.drawable.pingreen)));
this.googleMapsActivity = googleMapsActivity;
bitMap = BitmapFactory.decodeResource(
googleMapsActivity.getResources(), R.drawable.pingreen);
populate();
}
@Override
public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
long when) {
if (overLayItems == null || overLayItems.isEmpty()) {
return false;
}
return super.draw(canvas, mapView, false, when);
}
public void addOverlay(OverlayItem overlay) {
overLayItems.add(overlay);
populate();
}
@Override
protected OverlayItem createItem(int index) {
return overLayItems.get(index);
}
@Override
public int size() {
return overLayItems.size();
}
public void refresh() {
populate();
}
public void clear() {
overLayItems.clear();
resetLastFocuesIndex();
}
@Override
protected boolean onTap(final int index) {
googleMapsActivity.getMapView().setOnTouchListener(
new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
if (!overLayItems.isEmpty()) {
if (view != null) {
view.setVisibility(View.GONE);
}
}
googleMapsActivity.getMapView().invalidate();
return false;
}
});
if (view != null) {
view.setVisibility(View.GONE);
googleMapsActivity.getMapView().removeView(view);
googleMapsActivity.getMapView().invalidate();
view = null;
}
view = googleMapsActivity.getLayoutInflater().inflate(
R.layout.popupwindow, null);
LinearLayout layout = (LinearLayout) view.findViewById(R.id.layout);
layout.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
view.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
view.setBackgroundResource(R.drawable.popupwindow);
ImageView image = (ImageView) view.findViewById(R.id.imageview);
TextView text = (TextView) view.findViewById(R.id.text);
text.setText(overLayItems.get(index).getTitle());
if (overLayItems.get(index).getTitle() != null
&& overLayItems.get(index).getTitle().equals("Me") == false) {
image.setImageResource(R.drawable.wwwpd);
}
Projection projection = googleMapsActivity.getMapView().getProjection();
Point point = new Point();
projection.toPixels(overLayItems.get(index).getPoint(), point);
int x = (int) (view.getWidth() / 2f);
int y = -bitMap.getHeight() - 3;
MapView.LayoutParams lp = new MapView.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT, overLayItems.get(index)
.getPoint(), x, y, MapView.LayoutParams.BOTTOM_CENTER);
googleMapsActivity.getMapView().removeView(view);
googleMapsActivity.getMapView().invalidate();
googleMapsActivity.getMapView().addView(view, lp);
googleMapsActivity.getMapView().invalidate();
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
if (Common.haveNetworkConnection(googleMapsActivity)) {
googleMapsActivity.getMapView().removeView(view);
googleMapsActivity.getMapView().invalidate();
view = null;
String desription = googleMapsActivity.getMarkersList()
.get(index).getDescription();
String str1 = desription.substring(
desription.indexOf("\"") + 1, desription.length());
String str2 = str1.substring(0, str1.indexOf("\""));
viewFlipper = (ViewFlipper) googleMapsActivity
.findViewById(R.id.flipper);
viewFlipper.setDisplayedChild(2);
relativeLayout = (RelativeLayout) googleMapsActivity
.findViewById(R.id.relativeLayout);
Button button = new Button(googleMapsActivity);
button.setText("Back");
button.setId(1);
RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
params1.addRule(RelativeLayout.ALIGN_PARENT_TOP);
params1.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
button.setLayoutParams(params1);
button.setVisibility(View.GONE);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
viewFlipper.setDisplayedChild(0);
}
});
relativeLayout.addView(button);
webView = new WebView((Context) (googleMapsActivity
.getParent() == null ? this : googleMapsActivity
.getParent()));
webView.setId(2);
webView.getSettings().setDefaultZoom(ZoomDensity.MEDIUM);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setSupportZoom(true);
webView.getSettings().setBuiltInZoomControls(true);
// webView.getSettings()
// .setUserAgentString(
// "Mozilla/5.0 (Linux; U; Android 2.3.3; en-au; GT-I9100 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.12011-10-16 20:22:55");
RelativeLayout.LayoutParams params2 = new RelativeLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
webView.setLayoutParams(params2);
params2.addRule(RelativeLayout.BELOW, 1);
relativeLayout.addView(webView);
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view,
String url) {
view.loadUrl(url);
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onPageStarted(WebView view, String url,
Bitmap favicon) {
super.onPageStarted(view, url, favicon);
viewFlipper.setDisplayedChild(2);
}
@Override
public void onPageFinished(WebView view, String url) {
viewFlipper.setDisplayedChild(1);
webView.requestFocus(View.FOCUS_DOWN);
webView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_UP:
if (!v.hasFocus()) {
v.requestFocus();
}
break;
}
return false;
}
});
}
@Override
public void onReceivedError(WebView view,
int errorCode, String description,
String failingUrl) {
super.onReceivedError(view, errorCode, description,
failingUrl);
viewFlipper.setDisplayedChild(0);
}
});
webView.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View view, int keyCode,
KeyEvent keyEvent) {
if ((keyCode == KeyEvent.KEYCODE_BACK)
&& webView.canGoBack()) {
webView.goBack();
return true;
}
googleMapsActivity.finish();
return true;
}
});
webView.loadUrl(str2);
}
}
});
selectedIndex = index;
return true;
}
public void resetLastFocuesIndex() {
setLastFocusedIndex(-1);
selectedIndex = -1;
}
@Override
public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
viewFlipper.showPrevious();
return true;
}
return true;
}
}
关于android - 在 Android 上显示标记弹出窗口, native 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8151905/
我最近在/ drawable中添加了一些.gifs,以便可以将它们与按钮一起使用。这个工作正常(没有错误)。现在,当我重建/运行我的应用程序时,出现以下错误: Error: Gradle: Execu
Android 中有返回内部存储数据路径的方法吗? 我有 2 部 Android 智能手机(Samsung s2 和 s7 edge),我在其中安装了一个应用程序。我想使用位于这条路径中的 sqlit
这个问题在这里已经有了答案: What's the difference between "?android:" and "@android:" in an android layout xml f
我只想知道 android 开发手机、android 普通手机和 android root 手机之间的实际区别。 我们不能从实体店或除 android marketplace 以外的其他地方购买开发手
自Gradle更新以来,我正在努力使这个项目达到标准。这是一个团队项目,它使用的是android-apt插件。我已经进行了必要的语法更改(编译->实现和apt->注释处理器),但是编译器仍在告诉我存在
我是android和kotlin的新手,所以请原谅要解决的一个非常简单的问题! 我已经使用导航体系结构组件创建了一个基本应用程序,使用了底部的导航栏和三个导航选项。每个导航选项都指向一个专用片段,该片
我目前正在使用 Facebook official SDK for Android . 我现在正在使用高级示例应用程序,但我不知道如何让它获取应用程序墙/流/状态而不是登录的用户。 这可能吗?在那种情
我在下载文件时遇到问题, 我可以在模拟器中下载文件,但无法在手机上使用。我已经定义了上网和写入 SD 卡的权限。 我在服务器上有一个 doc 文件,如果用户单击下载。它下载文件。这在模拟器中工作正常但
这个问题在这里已经有了答案: What is the difference between gravity and layout_gravity in Android? (22 个答案) 关闭 9
任何人都可以告诉我什么是 android 缓存和应用程序缓存,因为当我们谈论缓存清理应用程序时,它的作用是,缓存清理概念是清理应用程序缓存还是像内存管理一样主存储、RAM、缓存是不同的并且据我所知,缓
假设应用程序 Foo 和 Eggs 在同一台 Android 设备上。任一应用程序都可以获取设备上所有应用程序的列表。一个应用程序是否有可能知道另一个应用程序是否已经运行以及运行了多长时间? 最佳答案
我有点困惑,我只看到了从 android 到 pc 或者从 android 到 pc 的例子。我需要制作一个从两部手机 (android) 连接的 android 应用程序进行视频聊天。我在想,我知道
用于使用 Android 以编程方式锁定屏幕。我从 Stackoverflow 之前关于此的问题中得到了一些好主意,并且我做得很好,但是当我运行该代码时,没有异常和错误。而且,屏幕没有锁定。请在这段代
文档说: android:layout_alignParentStart If true, makes the start edge of this view match the start edge
我不知道这两个属性和高度之间的区别。 以一个TextView为例,如果我将它的layout_width设置为wrap_content,并将它的width设置为50 dip,会发生什么情况? 最佳答案
这两个属性有什么关系?如果我有 android:noHistory="true",那么有 android:finishOnTaskLaunch="true" 有什么意义吗? 最佳答案 假设您的应用中有
我是新手,正在尝试理解以下 XML 代码: 查看 developer.android.com 上的文档,它说“starStyle”是 R.attr 中的常量, public static final
在下面的代码中,为什么当我设置时单选按钮的外观会发生变化 android:layout_width="fill_parent" 和 android:width="fill_parent" 我说的是
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
假设我有一个函数 fun myFunction(name:String, email:String){},当我调用这个函数时 myFunction('Ali', 'ali@test.com ') 如何
我是一名优秀的程序员,十分优秀!