Search code examples
dictionarydialogfragmentlayout-inflater

Duplicate id , tag null, or parent id with another fragment for com.google.android.gms.maps.SupportMapFragment , android?


I have dialog with my own layout which contains a map fragment.

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

}

This is my 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>

When I open the dialog 1st time it runs perfectly.

But when I open it the second time I get this exception

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) 

How do I get rid of this?


Solution

  • Not sure if this is the right process but it works

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