2

Ich habe ein Elternfragment in meiner Ansicht, in dem 2 Kindfragmente programmatisch hinzugefügt werden, um Karten anzuzeigen. Dies ist das Layout für das untergeordnete Fragment. Die Karte wird in FrameLayout gerendert.Benutzerdefinierte Android-Ansicht und verschachtelte Fragmente

location_field_view.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    style="@style/settings_action_item_row_style" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 
    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="256dp" 
     android:id="@+id/map_fragment_container" 
     android:layout_marginTop="2dp"> 
     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="This is where map loads."/> 
    </FrameLayout> 
</LinearLayout> 

Es ist ein Click-Ereignis für die Karte in den entsprechenden FrameLayouts geladen werden. Mein Problem ist, obwohl die FrameLayout-Ansicht erfolgreich aufgebläht wird (wie ich Debug-Text "Die Karte lädt hier" für beide Kindfragmente) aber die Karte für 2. Kind-Fragment im ersten Kind-Fragment selbst gerendert (Ich sehe es aktualisiert werden wenn der zweite Kartenklick-Listener ausgelöst wird). Was könnte hier schiefgehen?

Klasse über das Layout aufzublasen, die dann an Elternfragment zugegeben wird:

LocationField.java

public class LocationField extends LinearLayout 
{ 
    private MyMapFragment mMapFragment; 
    public LocationField() 
    { 
     LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     inflater.inflate(R.layout.location_field_view, this, true); 
     addMapFragment(); 
     //mMapFragment.loadMap() method gets triggered based on a click event. 
    } 

    private void addMapFragment() 
    { 
     mMapFragment = MyMapFragment.newInstance(lat, long, marker); 
     FragmentTransaction transaction = mParentFragment.getChildFragmentManager().beginTransaction(); 
     transaction.add(R.id.map_fragment_container, mMapFragment); 
     transaction.addToBackStack(null); 
     transaction.commit(); 
    } 
} 

MyMapFragment.java

public class MyMapFragment extends MapFragment implements OnMapReadyCallback 
{ 
    private static final String KEY_MARKER = "marker"; 
    private static final String KEY_LATITUDE = "latitude"; 
    private static final String KEY_LONGITUDE = "longitude"; 
    private LatLng mLatLng; 
    private String mMarker; 

    public static MyMapFragment newInstance(Double latitude, Double longitude, String marker){ 

     MyMapFragment myMapFragment = new MyMapFragment(); 
     Bundle arguments = new Bundle(); 
     arguments.putDouble(KEY_LATITUDE, latitude); 
     arguments.putDouble(KEY_LONGITUDE, longitude); 
     arguments.putString(KEY_MARKER, marker); 
     myMapFragment.setArguments(arguments); 
     return myMapFragment; 
    } 

    public void onCreate(Bundle savedInstance) 
    { 
     super.onCreate(savedInstance); 
     Bundle arguments = getArguments(); 
     mLatLng = new LatLng(arguments.getDouble(KEY_LATITUDE), arguments.getDouble(KEY_LONGITUDE)); 
     mMarker = arguments.getString(KEY_MARKER); 
    } 

    public void loadMap() 
    { 
     getMapAsync(this); 
    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     if (googleMap == null) { 
      return; 
     } 
     googleMap.addMarker(new MarkerOptions().position(mLatLng).title(mMarker)); 
     googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mLatLng, 10f)); 
    } 
} 

Antwort

1

das Problem gelöst, indem der ID-Einstellung für FrameLayouts Karte dynamisch mit Methode generateViewId().

Sieht aus wie FragmentManager die Frame-IDs von zuvor hinzugefügten Frames überschreibt. (Weil sie alle mit derselben ID ??)

die Code-Änderungen Gemeinsame Nutzung erforderlich, um das Problem zu lösen (falls jemand anderem Gesicht dieser Ausgabe):

  1. ID generiert für Frame-Layout dynamisch. Anfangs wird es eine ID für das Rahmenlayout in Ihrer Ansicht geben. Rufen Sie das View-Objekt ab und weisen Sie die neu generierte View-ID zu.

    mMapFrameId = View.generateViewId();

  2. Verwenden Sie dieselbe ID während der Fragmenttransaktion, während Sie ein neues Fragment hinzufügen.

    mMapFragment = new MapFragment(); 
    FragmentTransaction transaction = mFragmentManager.beginTransaction(); 
    transaction.add(mMapFrameId, mMapFragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
    
Verwandte Themen