I can't inflate a view in a custom infowindow

2019-06-11 16:36发布

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.

2条回答
一夜七次
2楼-- · 2019-06-11 17:02

So, I have found the problem. It was exactly as Cammace said, the problem was in the XML which somehow there were properties such as android:weightSum="1" and the contents that had wrap_content.

Thanks for the help, Mapbox Team!

查看更多
走好不送
3楼-- · 2019-06-11 17:10

Have a look at this example found in the Mapbox Android Demo app which might help you. The important snippet of code found in the example:

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;
      }
    });
  }
});
  }

Let me know if you are still having info window issues.

EDIT: i've successfully inflated your layout by changing some of the XML code you provided to this:

<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"/>

查看更多
登录 后发表回答