I am doing a map guide for Android using Mapbox and Android Studio IDE, but I am having a hard time dealing with the custom infowindow.
I want to inflate the infowindow (the one after I click on a marker) but as of yet I want to use an XML for that for an easy customization (I am open for suggestions, I still need to add a different image for each of the markers.). I am using a customization in the code itself just for testing, but I want to inflate an XML for that purporse.
The following images below show the prototype I am developing for the view and the next image shows what I am actually getting from the test (The code is inside the getInfoWindow function) I am developing with the code below:
Prototype in XML (Where as: ID-Translation-Type)
What I am getting
Here follows the part of the map code I am using, and the next code shows the XML code.
Main code (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: I am not sure if this is correct, but every time I am going to set the height, width or set the image, it gives me this error message (This message error was given after setting the height and width):
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 I am getting frustrated with the fact that I can't put an image inside the getInfoWindow, it does not matter how I set the images, it's always the same error message. I know that it's possible to set images, but that is only when you create the object inside the java file, it's not possible to do the same when you want to change images from an inflated XML. This is the message I get no matter what I declare, set or use the image inside the java file:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageResource(int)' on a null object reference
If someone knows how to solve that, I do believe that would close my question here in Stack Overflow.