2

マップを表示するために2つの子フラグメントがプログラムで追加された親フラグメントがあります。これは子フラグメントのレイアウトです。マップはFrameLayoutでレンダリングされます。Androidのカスタム表示とネストされたフラグメント

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> 

対応FrameLayoutsにロードされるマップのクリックイベントがあります。私の問題は、FrameLayoutビューが正常に膨張していても(2つの子フラグメントのデバッグテキスト「ここにマップがロードされています」)、2番目の子フラグメントのマップは最初の子フラグメント自体でレンダリングされます2番目の地図クリックリスナがトリガされたとき)。ここで何がうまくいかないのでしょうか?次に、親フラグメントに追加されるレイアウト上に膨張させる

クラス:

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)); 
    } 
} 

答えて

1

はFrameLayoutsためのIDを設定することにより、問題を解決しメソッドgenerateViewId()を使用して動的にマップします。

FragmentManagerが以前に追加されたフレームのフレームIDを上書きしていたようです。 (彼らはすべての有する同一IDたので??)

(ケースの他の誰かの顔でこの問題)問題を解決するために必要なコードの変更を共有:

  1. は動的フレームレイアウトのためのIDを生成します。当初、フレームレイアウトのIDは になります。ビューオブジェクトを取得し、新しく生成されたビューIDを に割り当てます。

    mMapFrameId = View.generateViewId();

  2. 新しいフラグメントを追加しながら、フラグメントトランザクション中に同じIDを使用します。

    mMapFragment = new MapFragment(); 
    FragmentTransaction transaction = mFragmentManager.beginTransaction(); 
    transaction.add(mMapFrameId, mMapFragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
    
関連する問題