- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这里我要做的是在 doInBackground 中设置 Id 并在 setOnInfoWindowClickListener
中调用它。但问题是它正在获取列表中第一个元素的 Id。我想要的是获得被点击的标记的 Id。我正在使用变量 private static String id;
来存储 id product.id=productJSON.getString("ID");
像这样 id=product.id ;
然后赋值。
googlemap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker arg0) {
intent.putExtra("PRODUCT_ID",id);
System.out.println(id);
startActivity(intent);
}
如何从 ondoInBackground 获取 ID 并在 intent.putExtra()
中使用。
public class Frnt_mapActivity extends Activity {
JSONArray jsonarray3;
// Google Map
private static GoogleMap googlemap;
private static String id;
private Intent intent;
HashMap<Marker, Integer> hashMap=new HashMap<Marker, Integer>();
public static LatLng latlong ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.frnt_map_activity);
googlemap=((MapFragment)getFragmentManager().findFragmentById(R.id.places_map)).getMap();
googlemap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
googlemap.setMyLocationEnabled(true);
googlemap.getUiSettings().setZoomControlsEnabled(true);
googlemap.getUiSettings().setMyLocationButtonEnabled(true);
googlemap.getUiSettings().setCompassEnabled(true);
googlemap.getUiSettings().setRotateGesturesEnabled(true);
googlemap.getUiSettings().setZoomGesturesEnabled(true);
googlemap.setMyLocationEnabled(true);
LatLng coordinate = new LatLng(50.85514, 0.58382);
CameraUpdate yourLocation = CameraUpdateFactory.newLatLngZoom(coordinate, 18);
googlemap.animateCamera(yourLocation);
new Frnt_mIcons_Activity().execute();
new LocationList().execute();
new LookingForList().execute();
CreateProductListTask responseDownloadTask = new CreateProductListTask("https://www.towncitycards.com/webservice_action.php?action=all_products");
responseDownloadTask.execute();
intent=new Intent(Frnt_mapActivity.this,MainActivity.class);
googlemap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker arg0) {
intent.putExtra("PRODUCT_ID",id);
System.out.println(id);
startActivity(intent);
}
});
protected class CreateProductListTask extends AsyncTask<Void, Void, List<Product>> {
private String serverUrl;
public CreateProductListTask(String url) {
super();
this.serverUrl = url;
}
@Override
protected List<Product> doInBackground(Void... params)
{
HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
DefaultHttpClient client = new DefaultHttpClient();
SchemeRegistry registry = new SchemeRegistry();
SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
registry.register(new Scheme("http", socketFactory, 443));
SingleClientConnManager mgr = new SingleClientConnManager(client.getParams(), registry);
DefaultHttpClient httpClient = new DefaultHttpClient(mgr, client.getParams());
// Set verifier
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
HttpPost httpPost = new HttpPost("http://towncitycards.com/webservice_action.php?action=all_products");
URLConnection urlConn = null;
BufferedReader bufferedReader = null;
try
{
URL url = new URL(this.serverUrl);
urlConn = url.openConnection();
bufferedReader = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
StringBuffer stringBuffer = new StringBuffer();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuffer.append(line);
}
JSONObject response = new JSONObject(stringBuffer.toString());
List<Product> products = new ArrayList<>();
HashMap<String, Bitmap> iconsMap = new HashMap<>();
try {
JSONArray productsJSON = response.getJSONArray("all_products");
for (int ixProduct=0; ixProduct<productsJSON.length(); ixProduct++) {
JSONObject productJSON = productsJSON.getJSONObject(ixProduct);
String mapIconStr = productJSON.getString("map_icon");
URI uri = new URI(mapIconStr);
String[] segments = uri.getPath().split("/");
String iconName = segments[segments.length-1];
// percetn-encode URL
String mapIconPath = mapIconStr.substring(0, mapIconStr.indexOf(iconName));
String iconUrlString = mapIconPath + URLEncoder.encode(iconName, "UTF-8");
// replace "http:" with "https:"
iconUrlString = iconUrlString.replace("http:", "https:");
Bitmap bmp;
if (!iconsMap.containsKey(iconUrlString)) {
bmp = getBitmapFromURL(iconUrlString);
// populate map with unique icons
iconsMap.put(iconUrlString, bmp);
} else {
bmp = iconsMap.get(iconUrlString);
}
if (bmp != null) {
try {
Product product = new Product();
product.id=productJSON.getString("ID");
product.name = productJSON.getString("post_title");
product.lat = productJSON.getDouble("latitude");
product.lon = productJSON.getDouble("longitude");
id=product.id;
bmp = Bitmap.createScaledBitmap(bmp,(int)(bmp.getWidth()*3), (int)(bmp.getHeight()*3), true);
product.icon = bmp;
products.add(product);
} catch (Exception ignore) {
}
}
}
} catch (JSONException ex) {
Log.e("App", "Failure", ex);
}
return products;
}
catch(Exception ex)
{
Log.e("App", "yourDataTask", ex);
return null;
}
finally
{
if(bufferedReader != null)
{
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@Override
protected void onPostExecute(List<Product> products)
{
if(products != null) {
for (final Product product : products) {
googlemap.addMarker(new MarkerOptions()
.position(new LatLng(product.lat, product.lon))
.title(product.name)
.icon(BitmapDescriptorFactory.fromBitmap(product.icon))
);
}
}
}
}
public static Bitmap getBitmapFromURL(String src) {
try {
URL url = new URL(src);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inSampleSize = 1;
bmOptions.inJustDecodeBounds = false;
Bitmap myBitmap = BitmapFactory.decodeStream(input, null, bmOptions);
return myBitmap;
} catch (IOException e) {
return null;
}
}
}
最佳答案
添加 product.id
作为tag
为你的 Marker
:
Marker marker = googleMap.addMarker(new MarkerOptions()
.position(new LatLng(product.lat, product.lon))
.title(product.name)
.icon(BitmapDescriptorFactory.fromBitmap(product.icon)));
marker.setTag(product.id);
然后在您的 OnInfoWindowClickListener
上得到 tag
:
googlemap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
intent.putExtra("PRODUCT_ID",(String) marker.getTag());
startActivity(intent);
}
}
另一种选择是保留 Map<Marker, String>
存储 id
关联到每个 Marker
:
private Map<Marker, String> markerIds = new HashMap<>();
您需要创建标记并像这样存储它们:
Marker marker = googleMap.addMarker(new MarkerOptions().position(markerPosition).title("my marker"));
markerIds.put(marker, product.id);
然后在您的 OnInfoWindowClickListener
上得到 tag
:
googlemap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
intent.putExtra("PRODUCT_ID",markerIds.get(marker));
startActivity(intent);
}
}
关于android - 如何在 setOnInfoWindowClickListener 中获取在 Google Map 中单击的标记的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43254665/
我在我的 Android 应用程序中使用带有许多标记的 Google map 。单击标记后显示标题。但我需要在单击该标题后打开一个具有更多值的新 Activity - 这将显示在 TextView 中
这里我要做的是在 doInBackground 中设置 Id 并在 setOnInfoWindowClickListener 中调用它。但问题是它正在获取列表中第一个元素的 Id。我想要的是获得被点击
我在我的应用程序中使用谷歌地图并显示标记。 现在点击标记窗口我想用其他 fragment 替换当前 fragment 。 for (StoreData store : comp.getArrStore
我是一名优秀的程序员,十分优秀!