2015-10-25 6 views
5

Ich versuche, Unterstützung zu Tabletten in meiner Anwendung hinzuzufügen und laufen in Illegal durch diese Zeile Code geworfen:Android Google Maps Marker: Freigegeben unbekannt imagedata Referenz

marker.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.arrow_green_10by19)) 

Die Methode .fromResource mit der funktioniert gut R.drawable.arrow_green_10by19 aus einer Bilddatei (png), aber wenn das Png durch die Vektordatei arrow_green_10by19.xml (die in der Android Studio-IDE gerendert wird) ersetzt wird, wird wie erwähnt eine Laufzeit generiert.

Kann jemand eine Vektorressource in der BitmapDescriptorFactory implementieren und könnte mir helfen?

Danke.

Antwort

14

Ich hatte das gleiche Problem, aber ich erkannte, dass auf meinem Gerät mit API 16 funktioniert es gut, aber mit API 21 stürzt es ab. Schließlich funktioniert es in beiden Geräten mit this solution. Hier ist der Code:

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
private static Bitmap getBitmap(VectorDrawable vectorDrawable) { 
    Bitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(), 
      vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas(bitmap); 
    vectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); 
    vectorDrawable.draw(canvas); 
    return bitmap; 
} 

und diese:

private static Bitmap getBitmap(Context context, int drawableId) { 
    Drawable drawable = ContextCompat.getDrawable(context, drawableId); 
    if (drawable instanceof BitmapDrawable) { 
     return BitmapFactory.decodeResource(context.getResources(), drawableId); 
    } else if (drawable instanceof VectorDrawable) { 
     return getBitmap((VectorDrawable) drawable); 
    } else { 
     throw new IllegalArgumentException("unsupported drawable type"); 
    } 
} 

So kombiniert ich diese zwei Funktionen auf diese Weise:

private Marker addMark(LatLng latLng, String title) { 
    Bitmap bitmap = getBitmap(getContext(), R.drawable.ic_place_24dp); 
    Marker marker = googleMap.addMarker(new MarkerOptions().position(latLng) 
      .title(title) 
      .icon(BitmapDescriptorFactory.fromBitmap(bitmap)) 
      .draggable(true)); 

    return marker; 
} 

Wo R.drawable.ic_place_24dp ist ein Vektor Vermögenswert (.xml), nicht a .png

+0

Während dies theoretisch die Frage beantworten könnte, [wäre es vorzuziehen] (// meta.stackoverflow.com/q/8259), die e wesentliche Teile der Antwort hier und bieten den Link als Referenz. –

+0

Danke, ich denke es ist jetzt besser :) –

+0

Es ist viel besser jetzt. Dank dafür. Und ein Lob für die Mühe –