2016-04-28 5 views
0

Ich habe Dialog mit meinem eigenen Layout, das ein Kartenfragment enthält.Doppelte ID, Tag-Null oder Eltern-ID mit einem anderen Fragment für com.google.android.gms.maps.SupportMapFragment, android?

public class DialogEditCustomer extends Dialog implements View.OnClickListener, OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { 

private DialogEditCustomer.OnButtonClick onButtonClick; 
private EditText etOwnerName, etOwnerNumber; 
private TextView tvLatLong; 
private Button buttonSave, buttonCancel; 
private GoogleMap mMap; 
private String ownerName, ownerNumber, latitude, longitude; 
private FragmentManager fragmentManager; 
private Context context; 
private Location locationLatLong; 
private LatLng markerLatLong; 
SupportMapFragment mapFragment; 

//initialize the dialog 
public DialogEditCustomer(Context context, String ownerName, String ownerNumber, String latitude, String longitude, FragmentManager fragmentManager) { 
    super(context); 
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    this.setContentView(R.layout.dialog_edit_customer); 
    this.ownerName = ownerName; 
    this.ownerNumber = ownerNumber; 
    this.latitude = latitude; 
    this.longitude = longitude; 
    this.fragmentManager = fragmentManager; 
    this.context = context; 
    initViews(); 
    if (context instanceof DialogEditCustomer.OnButtonClick) { 
     onButtonClick = (DialogEditCustomer.OnButtonClick) context; 
    } 
} 

//initialise views 
private void initViews() { 
    tvLatLong = (TextView) findViewById(R.id.textViewLatLong); 
    etOwnerName = (EditText) findViewById(R.id.editTextOwnerName); 
    etOwnerNumber = (EditText) findViewById(R.id.editTextOwnerNumber); 
    buttonSave = (Button) findViewById(R.id.buttonSave); 
    buttonCancel = (Button) findViewById(R.id.buttonCancel); 
    if (mGoogleApiClient == null) { 
     mGoogleApiClient = new GoogleApiClient.Builder(context) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
     mGoogleApiClient.connect(); 
    } 
    mapFragment = (SupportMapFragment) fragmentManager 
      .findFragmentById(R.id.mapDialog); 

    buttonSave.setOnClickListener(this); 
    buttonCancel.setOnClickListener(this); 
    if (ownerName != null) { 
     etOwnerName.setText(ownerName); 
    } 
    if (ownerNumber != null) { 
     etOwnerNumber.setText(ownerNumber); 
    } 
    if (latitude != null && longitude != null) { 
     tvLatLong.setText(latitude + "," + longitude); 
    } 

} 

GoogleApiClient mGoogleApiClient; 

@Override 
public void onClick(View v) { 
    if (v == buttonSave) { 
     ownerName = etOwnerName.getText().toString(); 
     ownerNumber = etOwnerNumber.getText().toString(); 
     if (markerLatLong == null) { 
      latitude = "" + locationLatLong.getLatitude(); 
      longitude = "" + locationLatLong.getLongitude(); 
     } else { 
      latitude = "" + markerLatLong.latitude; 
      longitude = "" + markerLatLong.longitude; 
     } 
     onButtonClick.onSaveButtonClick(ownerName, ownerNumber, latitude, longitude); 
    } 
    if (v == buttonCancel) { 
     onButtonClick.onCancelButtonClick(); 
    } 
} 

// implement for button clicks in activity and fragment 
public interface OnButtonClick { 
    void onSaveButtonClick(String ownerName, String ownerNumber, String latitude, String longitude); 

    void onCancelButtonClick(); 
} 

//only to be used in case of fragment 
public void setListener(DialogEditCustomer.OnButtonClick onButtonClick) { 
    this.onButtonClick = onButtonClick; 
} 

@Override 
public void onMapReady(GoogleMap googleMap) { 
    mMap = googleMap; 
    try { 
     mMap.setMyLocationEnabled(true); 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } 

    LatLng sydney = new LatLng(locationLatLong.getLatitude(), locationLatLong.getLongitude()); 
    MarkerOptions m1 = new MarkerOptions().draggable(true); 
    mMap.addMarker(m1.position(sydney).title(ownerName)); 
    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); 
    mMap.setOnMarkerDragListener(new GoogleMap.OnMarkerDragListener() { 
     @Override 
     public void onMarkerDragStart(Marker marker) { 

     } 

     @Override 
     public void onMarkerDrag(Marker marker) { 

     } 

     @Override 
     public void onMarkerDragEnd(Marker marker) { 
      markerLatLong = marker.getPosition(); 
     } 
    }); 
} 

@Override 
public void onConnected(@Nullable Bundle bundle) { 
    try { 
     locationLatLong = LocationServices.FusedLocationApi.getLastLocation(
       mGoogleApiClient); 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } 
    mapFragment.getMapAsync(this); 
} 

@Override 
public void onConnectionSuspended(int i) { 

} 

@Override 
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

} 

@Override 
protected void onStart() { 
    mGoogleApiClient.connect(); 
    super.onStart(); 

} 

@Override 
protected void onStop() { 
    mGoogleApiClient.disconnect(); 
    super.onStop(); 
} 

} 

Das ist mein Layout XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:padding="10dp"> 

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="Edit Customer Info" 
    android:textColor="@android:color/black" /> 

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="Owner Name" 
    android:textColor="@android:color/black" 
    android:textStyle="bold" /> 

<EditText 
    android:id="@+id/editTextOwnerName" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="Enter Contact Person Name" /> 

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="Owner Number" 
    android:textColor="@android:color/black" 
    android:textStyle="bold" /> 

<EditText 
    android:id="@+id/editTextOwnerNumber" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="Enter Customer Number" /> 

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="Latitude and Longitude" 
    android:textColor="@android:color/black" 
    android:textStyle="bold" /> 

<TextView 
    android:id="@+id/textViewLatLong" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="xxxxx" 
    android:textColor="@android:color/black" 
    android:textStyle="bold" /> 

<fragment 
    android:id="@+id/mapDialog" 
    android:name="com.google.android.gms.maps.SupportMapFragment" 
    android:layout_width="match_parent" 
    android:layout_height="200dp" /> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="10dp" 
    android:orientation="horizontal"> 

    <Button 
     android:id="@+id/buttonSave" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:background="@color/login_button" 
     android:text="Save" 
     android:textColor="@android:color/white" /> 

    <Button 
     android:id="@+id/buttonCancel" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="10dp" 
     android:layout_weight="1" 
     android:background="@color/login_button" 
     android:text="Cancel" 
     android:textColor="@android:color/white" /> 
</LinearLayout> 
</LinearLayout> 

Wenn ich den Dialog ersten Mal öffnen sie perfekt läuft.

Aber wenn ich es zum zweiten Mal öffnen bekomme ich diese Ausnahme

Caused by: java.lang.IllegalArgumentException: Binary XML file line #55: Duplicate id 0x7f0d00a8, tag null, or parent id 0xffffffff with another fragment for com.google.android.gms.maps.SupportMapFragment 
                     at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2293) 
                     at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:120) 
                     at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:357) 
                     at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:31) 
                     at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:80) 
                     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689) 
                     at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)  
                     at android.view.LayoutInflater.inflate(LayoutInflater.java:492)  
                     at android.view.LayoutInflater.inflate(LayoutInflater.java:397)  
                     at android.view.LayoutInflater.inflate(LayoutInflater.java:353)  
                     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:294)  
                     at android.app.Dialog.setContentView(Dialog.java:485)  
                     at com.gfat.ui.DialogEditCustomer.<init>(DialogEditCustomer.java:62)  

Wie kann ich das beheben?

Antwort

1

Nicht sicher, ob dies der richtige Prozess ist, aber es funktioniert

@Override 
protected void onStop() { 
    mGoogleApiClient.disconnect(); 
    FragmentManager fm = fragmentManager; 
    Fragment fragment = (fm.findFragmentById(R.id.mapDialog)); 

    if (fragment.isResumed()) { 
     FragmentTransaction ft = fm.beginTransaction(); 
     ft.remove(fragment); 
     ft.commit(); 
    } 
    super.onStop(); 
}