2016-10-11 2 views
0

Ich mache eine Map-Anleitung für Android mit Mapbox und Android Studio IDE, aber ich habe eine harte Zeit mit dem benutzerdefinierten Infofenster zu tun.Ich kann eine Ansicht in einem benutzerdefinierten Infowindow in Mapbox nicht aufblasen. (Einstellung getinfowindow mit Bildern)

Ich möchte das Infowindow aufblähen (das nachdem ich auf einen Marker geklickt habe), aber bis jetzt möchte ich ein XML für eine einfache Anpassung verwenden (Ich bin offen für Vorschläge, ich muss noch ein anderes hinzufügen Bild für jeden der Marker.). Ich benutze eine Anpassung im Code selbst nur zum Testen, aber ich möchte ein XML für dieses Ziel aufblasen.

Die folgenden Bilder unten zeigen den Prototyp I für die Ansicht und das nächste Bild entwickle zeigt, was ich eigentlich aus dem Test bekommen bin (Der Code ist in der getInfoWindow Funktion) I mit dem Code entwickle unter:

Prototype in XML (Where as: ID-Translation-Type)

What I am getting

folgt hier den Teil der Karte Code, den ich verwende, und der nächste Code zeigt den XML-Code.

Hauptcode (Mapa.Java):

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    MapboxAccountManager.start(this,getString(R.string.access_token)); 

    setContentView(R.layout.activity_main); 

    mapView = (MapView) findViewById(R.id.mapView); 
    mapView.onCreate(savedInstanceState); 
    mapView.getMapAsync(new OnMapReadyCallback() { 
     @Override 
     public void onMapReady(MapboxMap mapboxMap) { 

      IconFactory iconFactory = IconFactory.getInstance(Mapa.this); 
      Drawable iconDrawable = ContextCompat.getDrawable(Mapa.this, R.drawable.infoicon); 
      Icon icon = iconFactory.fromDrawable(iconDrawable); 

      mapboxMap.setInfoWindowAdapter(new MapboxMap.InfoWindowAdapter() { 
       @Override 
       public View getInfoWindow(@NonNull Marker marker) { 

        View v = getLayoutInflater().inflate(R.layout.janela_infowindow, null); 

        TextView titulo = (TextView) v.findViewById(R.id.titulo); 
        TextView desc = (TextView) v.findViewById(R.id.descricao); 
        titulo.setText(marker.getTitle()); 
        desc.setText(marker.getSnippet()); 

        titulo.setTextColor(Color.WHITE); 
        desc.setTextColor(Color.WHITE); 

        v.setBackgroundColor(Color.rgb(27,77,62)); 
        v.setPadding(10, 10, 10, 10); 
        return v; 
       } 
      }); 

      mapboxMap.addMarker(new MarkerOptions() 
        .position(new LatLng(-15.76363, -47.86949)) 
        .title("ICC Centro") 
        .snippet(getString(R.string.desc_ICC_Centro)) 
        .icon(icon)); 

      mapboxMap.addMarker(new MarkerOptions() 
        .position(new LatLng(-15.7629936, -47.86717415)) 
        .title("Reitoria") 
        .snippet(getString(R.string.desc_Reitoria)) 
        .icon(icon)); 

      mapboxMap.addMarker(new MarkerOptions() 
        .position(new LatLng(-15.76196106, -47.87008166)) 
        .title("FAU") 
        .snippet(getString(R.string.desc_FAU)) 
        .icon(icon)); 
     } 
    }); 
} 

XML-Code (janela_infowindow.xml):

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:orientation="vertical" 
    android:layout_width="200dp" 
    android:layout_height="270dp" 
    android:weightSum="1"> 

<ImageView 
    android:layout_width="200dp" 
    android:layout_height="0dp" 
    android:id="@+id/imagem" 
    android:adjustViewBounds="true" 
    android:layout_gravity="end" 
    android:contentDescription="@string/nome_local" 
    android:layout_weight="0.11" /> 

<TextView 
    android:layout_width="200dp" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="-30dp" 
    android:gravity="center" 
    android:textAlignment="center" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:id="@+id/titulo" 
    android:typeface="serif" 
    android:textStyle="bold"/> 

<TextView 
    android:layout_width="200dp" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:id="@+id/descricao" /> 

EDIT: Ich bin nicht sicher, ob das ist richtig, aber jedes Mal, wenn ich die Höhe, Breite einstellen werde oder stellen Sie das Bild, es mir diese Fehlermeldung gibt (Diese Fehlermeldung wurde nach dem Einstellen der Höhe und Breite angegeben):

FATAL EXCEPTION: main 
Process: afinal.projeto.unb.guiadoaluno, PID: 8979 
java.lang.NullPointerException: Attempt to write to field 'int android.view.ViewGroup$LayoutParams.height' on a null object reference 
at afinal.projeto.unb.guiadoaluno.Mapa$1$1.getInfoWindow(Mapa.java:87) 
at com.mapbox.mapboxsdk.annotations.Marker.showInfoWindow(Marker.java:165) 
at com.mapbox.mapboxsdk.maps.MapboxMap.selectMarker(MapboxMap.java:1295) 
at com.mapbox.mapboxsdk.maps.MapView$GestureListener.onSingleTapConfirmed(MapView.java:1792) 
at android.view.GestureDetector$GestureHandler.handleMessage(GestureDetector.java:280) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:145) 
at android.app.ActivityThread.main(ActivityThread.java:5940) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1389) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1184) 

EDIT 2: Ok, so dass ich immer mit der Tatsache frustriert, dass ich kann‘ t ein Bild in die getInfoWindow, es ist egal, wie ich die Bilder einstellen, es ist immer die gleiche Fehlermeldung. Ich weiß, dass es möglich ist, Bilder zu setzen, aber nur wenn Sie das Objekt in der Java-Datei erstellen, ist es nicht möglich, dasselbe zu tun, wenn Sie Bilder von einem überhöhten XML-Code ändern wollen. Dies ist die Botschaft, die ich egal, was ich erkläre, einstellen oder das Bild innerhalb der Java-Datei:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageResource(int)' on a null object reference 

Wenn jemand weiß, wie das zu lösen, ich glaube das wäre meine Frage hier in Stack-Überlauf schließen.

+0

Ich habe die fatale Nachricht hinzugefügt, wenn ich versuche, das Info-Fenster in der Java-Datei zu bearbeiten, anstatt es nur mit dem XML-Code aufzublasen. –

Antwort

0

Also, ich habe das Problem gefunden haben . Es war genau wie Cammace sagte, das Problem lag in der XML, die irgendwie Eigenschaften wie Android hatte: weightSum = "1" und der Inhalt, der wrap_content hatte.

Danke für die Hilfe, Mapbox Team!

0

Werfen Sie einen Blick auf this example in der Mapbox Android Demo app, die Ihnen helfen könnte. Der wichtige Codeschnipsel im Beispiel:

mapboxMap.setInfoWindowAdapter(new MapboxMap.InfoWindowAdapter() { 
     @Nullable 
     @Override 
     public View getInfoWindow(@NonNull Marker marker) { 

     // The info window layout is created dynamically, parent is the info window 
     // container 
     LinearLayout parent = new LinearLayout(CustomInfoWindowActivity.this); 
     parent.setLayoutParams(new LinearLayout.LayoutParams(
      ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 
     parent.setOrientation(LinearLayout.VERTICAL); 

     // Depending on the marker title, the correct image source is used. If you 
     // have many markers using different images, extending Marker and 
     // baseMarkerOptions, adding additional options such as the image, might be 
     // a better choice. 
     ImageView countryFlagImage = new ImageView(CustomInfoWindowActivity.this); 
     switch (marker.getTitle()) { 
      case "spain": 
      countryFlagImage.setImageDrawable(ContextCompat.getDrawable(
       CustomInfoWindowActivity.this, R.drawable.flag_of_spain)); 
      break; 
      case "egypt": 
      countryFlagImage.setImageDrawable(ContextCompat.getDrawable(
       CustomInfoWindowActivity.this, R.drawable.flag_of_egypt)); 
      break; 
      default: 
      // By default all markers without a matching title will use the 
      // Germany flag 
      countryFlagImage.setImageDrawable(ContextCompat.getDrawable(
       CustomInfoWindowActivity.this, R.drawable.flag_of_germany)); 
      break; 
     } 

     // Set the size of the image 
     countryFlagImage.setLayoutParams(new android.view.ViewGroup.LayoutParams(150, 100)); 

     // add the image view to the parent layout 
     parent.addView(countryFlagImage); 

     return parent; 
     } 
    }); 
    } 
}); 
    } 

Lassen Sie mich wissen, wenn Sie noch Probleme mit dem Infofenster haben.

EDIT: i Ihr Layout erfolgreich aufgeblasen haben, indem ein Teil des XML-Code ändern Sie diese zur Verfügung gestellt:

<ImageView 
    android:id="@+id/imagem" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="end" 
    android:adjustViewBounds="true"/> 

<TextView 
    android:id="@+id/titulo" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center" 
    android:textAlignment="center" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:textStyle="bold" 
    android:typeface="serif"/> 

<TextView 
    android:id="@+id/descricao" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge"/> 

+0

Auch wenn es nicht das Problem löst, andere Layouts auf den Infowindow-Marker aufzublasen, hat dieses Stück Code tatsächlich eine Lösung, um benutzerdefinierte Bilder für jeden der Marker zu verwenden, Danke! Haben Sie etwas mit dem benutzerdefinierten Infowindow mit aufgeblähten XML-Dateien gefunden? Vielen Dank! –

+0

'getInfoWindow' gibt eine Ansicht zurück, Sie müssen lediglich das XML-Layout aufblasen und es als Ansicht zurückgeben. – cammace

+0

Danke für Ihre Zeit, um mir zu antworten! Tatsächlich! Ich habe eine Sicht auf den obigen Code mit einem überhöhten XML-Code zurückgegeben: "View v = getLayoutInflater(). Inflate (R.layout.janela_infowindow, null); 'wo auch die XML-Datei' R.layout.janela_infowindow 'oben gegeben ist. Habe ich etwas mit dem Inflator vermisst? –

Verwandte Themen