2013-08-28 10 views
7

Dies ist das Android-Äquivalent von this iOS Frage.Android - ScrollView wie foursquare mit Karten + Liste

Der Versuch, eine Ansicht zu erstellen, die eine MapView in etwa 20% des Bildschirms (unter einer ActionBar ...) enthält, und der Rest des Bildschirms ist eine ScrollView, die beim Scrollen über die MapView überlappt und versteckt es. Kurz wie die Android-App von FourSquare. Irgendwelche Ideen?

+0

[http://stackoverflow.com/questions/25487861/android-maps-markers-bounds-at-the-center-of-top-half-of-map-area](http://stackoverflow.com/questions/25487861/android-maps-markers-bounds-in-der-Mitte-der-oberen-Hälfte-der-Karte-Bereich) –

Antwort

0

Sie können einfach in Ihre xml deklarieren eine ScrollView-Datei, die eine LinearLayout bettet, das bettet ein MapView:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center_horizontal" 
    android:fillViewport="true" > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" > 

     <fragment 
      android:id="@+id/map" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      class="com.google.android.gms.maps.MapFragment" /> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" > 

     ...... Your list and other stuff ....... 

     </LinearLayout> 
    </LinearLayout> 
</ScrollView> 

Dann können Sie die Größe für jedes Element festlegen, indem das layout_weight Attribut Angabe

EDIT IvanDanDo, nach unserer Diskussion fand ich diesen Link, der tun kann, was Sie wollen (nicht sicher, aber ich habe es nicht versucht): Android: Have an arbitrary View slide under another View like the software keyboard does

+0

Versucht es, gab die 'MapFragment'' layout_weight' = 1 und die 'LinearLayout' 'layout_weight' = 3 aber alles, was ich sehe, ist eine Karte auf meinem gesamten Bildschirm und irgendwo auf der Unterseite, ein Hinweis auf eine Liste ... und es scrollt auch nicht über meiner Karte. – OferM

+0

Das ist seltsam, ich habe so ziemlich den gleichen Code in meiner App. Wenn Sie die Karte beispielsweise durch eine ImageView ersetzen, scrollt sie? Können Sie auch versuchen, das Attribut 'weightSum' im ersten' LinearLayout' auf 4 zu setzen? – jbihan

+0

OK, also änderte ich es zu einem 'ImageView' und mir wurde klar, dass meine Liste einfach nicht groß genug war, so dass kein Scrollen nötig war. (Dumm). Aber jetzt, wenn ich scrolle, rollt die 'ImageView' /' Map' einfach hoch, ich will, dass sie oben bleibt, da die Liste schließlich wie eine Überlappung über sie rollt und sie vollständig versteckt. Wie bekomme ich diesen Effekt? – OferM

4

LAST UPDATE

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
xmlns:map="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context=".MainActivity" > 

<fragment 
    android:id="@+id/map_fragment" 
    android:name="com.myapp.MapFragment" 
    android:layout_width="match_parent" 
    android:layout_height="fill_parent" /> 

<fragment 
    android:id="@id/list_fragment" 
    android:name="com.myapp.ListFragment" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" /> 

Dann füge ich einen unsichtbaren Header in die Liste wie folgt:

@Override 
public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    super.onCreateView(inflater, container, savedInstanceState); 

    View view = inflater.inflate(R.layout.listview, container, false); 
    SwipeListView listView = (SwipeListView) view.findViewById(R.id.venue_list); 

    // An invisible view added as a header to the list and clicking it leads to the mapfragment 
    TextView invisibleView = new TextView(inflater.getContext()); 
    invisibleView.setBackgroundColor(Color.TRANSPARENT); 
    invisibleView.setHeight(300); 
    invisibleView.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      listener.moveToMapFragment(); 
                     } 
    }); 
    listView.addHeaderView(invisibleView); 

Diese kaum ideal ist, aber es funktioniert. Ich hoffe es hilft jemandem ..

+1

: Wenn Sie eine bessere Lösung haben, lassen Sie es mich wissen – user965071

+0

Dies ist immer noch die beste Lösung, die ich bis heute gefunden habe. Ich habe einen Klick-Handler für den unsichtbaren Rahmen hinzugefügt, der die Karte für den gesamten Bildschirm öffnet. – OferM

+0

Könnten Sie bitte das Layout teilen, das Sie erstellt haben? – user965071

1

Die einfachste Lösung ist eine Marge auf Ihren Slider Inhalt (zweiter Parameter des SlidingUpPanel) hinzufügen und dann das Verblassen Hintergrund entfernen. Alles aus dem XML.