2 votes

Un autre fragment au dessus d'un Mapview (SupportMapFragment)

J'ajoute un autre fragment à l'écran. Cet écran a déjà une MapView dans un SupportMapFragment, donc le Fragment ajouté doit être au dessus de la MapView. Cette nouvelle vue couvre environ 2/3 de l'écran et une grande partie de la carte, mais lorsque je fais défiler la vue, la carte défile en dessous. Ce n'est pas ce que j'attendais car la nouvelle vue est ajoutée au-dessus de la carte. La nouvelle vue est constituée d'une mise en page relative contenant une ImageView qui englobe son contenu. Ainsi, lorsque l'on fait défiler l'ImageView (qui n'a aucune fonctionnalité), la MapView défile. Quelqu'un peut-il expliquer pourquoi cela se produit et, si possible, me fournir une solution ?

EDIT :

En fait, j'ai un MapView qui remplit tout l'écran. Ce code met en place mon MapView :

public void setUpMapIfNeeded(int satelliteMode, LatLng startPoint, float zoomLevel) {
        // Do a null check to confirm that we have not already instantiated the map.
        if (mapView == null) {
            // Try to obtain the map from the SupportMapFragment.
            mapView = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapview))
                    .getMap();
            // Check if we were successful in obtaining the map.
            if (mapView != null) {
                setUpMap(satelliteMode, startPoint, zoomLevel);
            }
        }
    }

    private void setUpMap(int satelliteMode, LatLng startPoint, float zoomLevel) {
        // more settings
        }

Ensuite, lorsqu'un utilisateur clique sur un marqueur, un fragment doit être affiché en haut de la vue cartographique.

public void createDetailView() {
        detailView = new DetailViewFragment();
        android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
        android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(R.id.viewLayout, detailView).commit();
        fragmentManager.executePendingTransactions();
    }

Tout cela fonctionne bien. La vue est affichée (qui occupe environ 2/3 de l'écran) mais l'utilisateur peut faire défiler la carte en faisant glisser la vue détaillée. La vue détaillée consiste en une mise en page relative avec beaucoup de texte et de boutons :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:layout_marginTop="45sp">

<!-- a lot of text and buttons here -->

</RelativeLayout>

0voto

Mark Molina Points 1988

Je n'ai donc toujours pas trouvé de moyen approprié pour régler ce problème. Au lieu de cela, j'ai simplement désactivé tous les contacts et les clics sur la vue de la carte lorsqu'une autre vue se trouve au-dessus de la vue de la carte, ce qui fonctionne bien.

0voto

J.Nieminen Points 331

Au cas où cela serait encore pertinent, la façon dont j'ai géré ce type de mise en page (une vue apparaissant "au-dessus" d'une autre) est d'utiliser la méthode suivante LinearLayout au lieu d'un RelativeLayout de la manière suivante :

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

    <SomeView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <PopOutView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="2"
        android:visibility="gone" />

</LinearLayout>

Dans votre cas, la carte serait la suivante SomeView et la disposition relative la PopOutView . Ensuite, dans le code, il suffit d'appeler popOutView.setVisibility = View.VISIBLE quand vous voulez qu'il apparaisse. Il réduit la première vue au lieu d'être dessiné sur le dessus (ce qui donne un effet visuel un peu différent), mais au moins de cette façon, les événements tactiles devraient aller à la bonne vue.

0voto

John Langone Points 31

Définissez la propriété clickable de la disposition du fragment à true. Cela empêchera les événements de toucher de se propager vers le bas.

<FrameLayout
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#FFF"
    android:clickable="true">
</FrameLayout>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X