2

지도를 표시하기 위해 프로그래밍 방식으로 2 개의 하위 단편이 추가되는 상위보기가 있습니다. 이것은 자식 조각을위한 레이아웃이고, Map은 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 뷰가 성공적으로 부풀려지고 있지만 (두 자식 조각 모두에 대해 "지도가 여기로드됩니다") 디버그 텍스트를 볼 수 있지만 두 번째 자식 조각의지도는 첫 번째 자식 조각 자체에서 렌더링됩니다. 두 번째지도 클릭 리스너가 트리거 될 때). 여기서 무엇이 잘못 될 수 있습니까? 다음 부모 단편에 첨가 레이아웃 상기 풀리는

분류 :

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(); 
    
관련 문제