2014-04-14 10 views
7

Stworzyłem znaczniki na mapie. Kiedy je klikam, niestandardowe okna informacyjne są zawsze tak szerokie jak ekran.Ustaw szerokość niestandardowego okna InfoWindow w Mapach Google api v2

Próbowałem ustawić layout_width="200dp", ale to nie pomogło. Próbowałem również ustawienie

view.setLayoutParams(new LayoutParams(GetDipsFromPixel(200), GetDipsFromPixel(300))); 

mogę ustawić szerokość TextView ustawiając snippetUi.setWidth(GetDipsFromPixel(200)); ale układ nadal pozostaje szeroki ekran.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:background="#FFFFFF" 
    android:layout_marginLeft="30dp" 
    android:layout_marginRight="30dp" 
    android:padding="10dp" > 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:background="#FFFFFF" 
     android:gravity="center_vertical"> 

     <ImageView 
      android:id="@+id/worldmap_infowindow_profileimg" 
      android:layout_width="20dp" 
      android:layout_height="20dp" 
      android:src="@drawable/noimage" /> 

     <TextView 
      android:id="@+id/worldmap_infowindow_username" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="To do No.2." 
      android:textColor="#000000" 
      android:textSize="16sp" 
      android:textStyle="bold" 
      android:paddingLeft="5dp"/> 
    </LinearLayout> 

    <View android:id="@+id/separator" 
     android:background="#ababab" 
     android:layout_width = "fill_parent" 
     android:layout_marginTop="3dp" 
     android:layout_marginBottom="3dp" 
     android:layout_height="1dp"/> 

    <TextView 
     android:id="@+id/worldmap_infowindow_name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="See the Giza Pyramids" 
     android:textColor="#000000" 
     android:textSize="16sp" 
     android:textStyle="bold" /> 

    <TextView 
     android:id="@+id/worldmap_infowindow_details" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="It was fascinating! It's a shame that it was raining, though." 
     android:textColor="#000000" 
     android:textSize="14sp" 
     android:textStyle="normal" /> 

</LinearLayout> 

Klasa:

private class CustomInfoWindowAdapter implements InfoWindowAdapter { 

     private View view; 

     public CustomInfoWindowAdapter() { 
      view = getLayoutInflater().inflate(R.layout.custom_infowindow, null); 
     } 

     @Override 
     public View getInfoContents(Marker marker) { 

      if (WorldMap.this.myMarker != null 
        && WorldMap.this.myMarker.isInfoWindowShown()) { 
       WorldMap.this.myMarker.hideInfoWindow(); 
       WorldMap.this.myMarker.showInfoWindow(); 
      } 
      return null; 
     } 

     @Override 
     public View getInfoWindow(final Marker marker) { 
      WorldMap.this.myMarker = marker; 


      final String title = marker.getTitle(); 
      final TextView titleUi = ((TextView) view.findViewById(R.id.worldmap_infowindow_name)); 
      if (title != null) { 
       titleUi.setText(title); 
      } else { 
       titleUi.setText(""); 
      } 

      final String snippet = marker.getSnippet(); 
      final TextView snippetUi = ((TextView) view.findViewById(R.id.worldmap_infowindow_details)); 
      if (snippet != null) { 
       snippetUi.setText(snippet); 
      } else { 
       snippetUi.setText(""); 
      } 

      return view; 
     } 
    } 

enter image description here

+0

Może to pomoże u http : //stackoverflow.com/questions/16711522/how-to-change-the-custom-infowidnow-shape-of-the-google-maps-api-v2/16712599#16712599 @erdomester – TheFlash

+0

Pomogło, dziękuję. Właśnie dodałem 'android: background =" @ drawable/bg_custominfowindow "' gdzie bg_custominfowindow jest kształtem utworzonym w xml. Dodaj to jako rozwiązanie. – erdomester

+0

Świetnie pomógł .. Zamierzam dodać odpowiedź z krótkim wyjaśnieniem. – TheFlash

Odpowiedz

5

Jeśli chcesz pokazać niestandardowe okno ze stałym rozmiarze (wysokość lub szerokość) to trzeba zrobić odkształcalne i ustawić go jako tło XML .

Zrobiłem odpowiedź HERE z rozwiązaniem. Możesz polecić, jak to działa.

+0

Właściwie prawdziwym rozwiązaniem jest użycie rysowania jako tła. Określenie layout_width nie pomaga sam! – erdomester

+0

@erdomester Edytowany. Jeśli jakakolwiek korekta daj mi znać. – TheFlash

+3

To nie może być prawda, wydaje się tak sprzeczne intuicyjne. Jeśli tak, to jest szalona implementacja. Grrrr, myślałem, że Google zatrudnia najlepszych programistów, szkoda, że ​​nie "myślą" tak jak reszta z nas. –

39

Zasadniczo po prostu trzeba mieć inny poziom układ poniżej korzenia, tak:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="wrap_content" 
android:background="@android:color/transparent" 
android:layout_height="wrap_content"> 

<LinearLayout 
    android:layout_width="250dp" 
    android:layout_height="wrap_content" 
    android:background="@android:color/white" 
    android:orientation="horizontal"> 
    ... 
+5

To powinno być poprawną odpowiedzią. –

+0

Jeśli ktoś chce, aby jego rozwiązanie działało na ekranie o innym wymiarze, po prostu pobierz wartość z innego wymiaru dimen.xml – ArhatBaid

+0

To jest odpowiednia odpowiedź – Noman

1

W moim przypadku, ustawić stałą szerokość jednego dziecka w układzie i to działało. Nie wiem, dlaczego nie działało podczas ustawiania szerokości widoku głównego. Oto przykład:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@color/white" 
    android:orientation="vertical" 
    android:padding="3dp"> 

    <ImageView 
     android:id="@+id/info_window_image" 
     android:layout_width="200dp" 
     android:layout_height="wrap_content" 
     android:scaleType="fitXY" 
     android:src="@drawable/facebook"/> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:lines="1" 
     android:maxLines="1" 
     android:singleLine="true" 
     android:text="Free for All Soccer Game" 
     android:textColor="@color/blue" 
     android:textSize="@dimen/medium" /> 
</LinearLayout 

>

0
@Override 
public View getInfoWindow(Marker arg0) { 
    return null; 
} 

@Override 
public View getInfoContents(Marker arg0) { 
    View v = getActivity().getLayoutInflater().inflate(R.layout.custom_info_window, null); 
    v.setLayoutParams(new LinearLayout.LayoutParams(500,300)); 
} 
2

Wystarczy utworzyć układ nadrzędny z "wrap_content" i układ dziecięcej z pożądanym rozmiarze:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:orientation="vertical"> 

    <!-- This layout defines the desired size --> 
    <LinearLayout 
     android:layout_width="240dp" 
     android:layout_height="320dp" 
     android:orientation="vertical"> 

     <!-- Your views here --> 

    </LinearLayout> 

</LinearLayout> 
Powiązane problemy