2016-10-11 3 views
0

Mapbox와 Android Studio IDE를 사용하여 Android 용지도 가이드를 만들고 있지만 맞춤 infowindow를 다루는 데 어려움을 겪고 있습니다.Mapbox의 맞춤 infowindow에서보기를 확장 할 수 없습니다. (이미지로 getinfowindow 설정하기)

infowindow (내가 마커를 클릭 한 후)를 팽창시키고 싶지만 쉬운 사용자 정의를 위해 XML을 사용하고 싶습니다. (제안을 위해 열었습니다. 아직 다른 각 마커에 대한 이미지). 나는 테스팅을 위해 코드 자체에서 커스터마이징을 사용하고 있지만, 그 퍼포먼스를 위해 XML을 부풀려 싶다.

: 나는 실제로 시험에서 얻고 무엇을

쇼 아래 다음 이미지

내가보기 및 다음 이미지를 개발하고 프로토 타입을 보여줍니다 나는 아래의 코드를 개발하고 (코드는 getInfoWindow 기능 내부)

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

What I am getting

여기 내가 사용하고 맵 코드의 일부를 다음, 다음 코드는 XML 코드를 보여줍니다.

홈페이지 코드 (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 코드 (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" /> 

편집 : 나는 경우 확실하지 않다 이것은 맞지만, 설정할 때마다 높이, 너비

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) 

편집 2 : 또는 이미지을 설정, 그것은 나에게이 오류 메시지를 제공합니다 (이 메시지 오류가 높이와 너비를 설정 한 후 주어진) 좋아, 그래서 '내가 할 수있는 것을 나는 사실에 좌절하고 tInfoWindow 안에 이미지를 넣으면 이미지를 어떻게 설정하든 문제가되지 않습니다. 항상 같은 오류 메시지입니다. 나는 그것이 이미지를 설정할 수 있다는 것을 알고있다. 그러나 자바 파일 안에 객체를 생성 할 때만 가능하다. 팽창 된 XML에서 이미지를 바꾸고 싶을 때 같은 것을 할 수 없다. 이것은 내가 상관없이 내가 선언 무엇을 얻을 메시지, 설정하거나 자바 파일 내부의 이미지를 사용할 수 있습니다 :

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

을 누군가가 그것을 해결하는 방법을 알고있는 경우에, 나는 그 스택 오버플로 여기에 내 질문을 닫을 것이라고 믿는다.

+0

XML 파일로 정보 파일을 부 풀리는 대신 자바 파일 내부의 정보 창을 편집하려고 할 때 치명적인 메시지가 추가되었습니다. –

답변

0

, 내가 문제를 발견했다 . 그것은 정확히 Cammace가 말했듯이 문제는 XML에서 어떻게 든 android : weightSum = "1"과 wrap_content가있는 내용이 있습니다.

도와 주셔서 감사합니다. 맵 박스 팀!

0

Mapbox Android Demo app에서 찾을 수있는 this 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; 
     } 
    }); 
    } 
}); 
    } 

정보창에 문제가있는 경우 알려주세요.

편집

: 내가 성공적으로이에게 제공되는 XML 코드의 일부를 변경하여 레이아웃을 팽창했다가 :

<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

infowindow 마커에 다른 레이아웃을 부 풀리는 문제는 해결되지 않지만이 코드는 각 마커에 대해 맞춤 이미지를 사용하는 솔루션을 제공합니다. 감사합니다! 비정상적인 XML 파일이있는 사용자 정의 infowindow와 관련된 것을 찾았습니까? 무리 감사! –

+0

'getInfoWindow'는 뷰를 반환합니다. XML 레이아웃을 부 풀려서 뷰로 반환하면됩니다. – cammace

+0

저에게 답변 해 주셔서 감사합니다! 과연! 위의 코드에 대한 뷰가 비정상적인 XML로 반환되었습니다. 'View v = getLayoutInflater(). inflate (R.layout.janela_infowindow, null); '여기서 XML 파일 인'R.layout.janela_infowindow '도 거기에 제공됩니다. 내가 인화 덩어리로 뭐가 그리워? –