How to use PlaceAutoCompleteFragment widget in a Fragment

4.5k views Asked by At

I am using PlaceAutoCompleteFragment inside a Fragment. First time when Fragment(App fragment in which PlaceAutoCompleteFragment is placed) opens it works fine like a charm.

But, then second time I hit button to open Fragment it crashes with below error. It works only a single time.

FATAL EXCEPTION:

android.view.InflateException: Binary XML file line #64: Error inflating class fragment Caused by: java.lang.IllegalArgumentException: Binary XML file line #64: Duplicate id 0x7f0d0094, tag null, or parent id 0xffffffff with another fragment for com.google.android.gms.location.places.ui.PlaceAutocompleteFragment

This is how I am using this,for Search location

public View onCreateView(LayoutInflater inflater,  ViewGroup container, Bundle savedInstanceState) {

            View view = inflater.inflate(R.layout.parkingview_fragment, container, false);

            mapFragment = (SupportMapFragment) this.getChildFragmentManager().findFragmentById(R.id.map_parkingview);
            mapFragment.getMapAsync(this);

          // For Search location
          PlaceAutocompleteFragment  autocompleteFragment = null;

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {

                    autocompleteFragment = (PlaceAutocompleteFragment) getActivity().getFragmentManager().findFragmentById(R.id.place_fragment_parkingview);
            }

        autocompleteFragment.setOnPlaceSelectedListener(this);
        autocompleteFragment.setHint("Search a Location");
//        autocompleteFragment.setBoundsBias(BOUNDS_MOUNTAIN_VIEW);

        return view;

    }

XML:

 <fragment
        android:id="@+id/place_fragment_parkingview"
        android:name="com.google.android.gms.location.places.ui.PlaceAutocompleteFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
3

There are 3 answers

0
Varun Kumar On

I was using-

<fragment
        android:id="@+id/location_autocomplete_fragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/plain_border"
        android:name="com.google.android.gms.location.places.ui.PlaceAutocompleteFragment" />

inside my fragment layout file and initializing it using-

PlaceAutocompleteFragment locationAutocompleteFragment = (PlaceAutocompleteFragment)
        getActivity().getFragmentManager()
                .findFragmentById(R.id.location_autocomplete_fragment);

I switched to-

<fragment
        android:id="@+id/location_autocomplete_fragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/plain_border"
        android:name="com.google.android.gms.location.places.ui.SupportPlaceAutocompleteFragment" />

and initialisation by-

SupportPlaceAutocompleteFragment locationAutocompleteFragment = (SupportPlaceAutocompleteFragment)
            getChildFragmentManager()
                    .findFragmentById(R.id.location_autocomplete_fragment);
2
Jordon On

Declare your fragment Dynamically it will solve the issue.

<FrameLayout android:id="@+id/fragment_content" android:layout_width="match_parent" android:layout_height="wrap_content" />

And Update your fragment onCreateView

SupportPlaceAutocompleteFragment autocompleteFragment = new SupportPlaceAutocompleteFragment(); android.support.v4.app.FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.fragment_content, autocompleteFragment); ft.commit();

1
Ramiro G.M. On

This problem is caused because you haven't removed yet the PlaceAutoCompleteFragment instance created before at some point.

Careful guys! If you use the method posted by Jordon, it will work, but the fragment's views (the input edittext, and the clearbutton for example) won't be accesible because the fragment's views aren't created yet...the correct answer is REMOVE the instance of the fragment putted in the xml file, programmatically, overwriting the onDestroyView method on the Fragment containing the PlaceAutoCompleteFragment.

@Override
public void onDestroyView() {    
if (autocompleteFragment != null) {
   android.support.v4.app.FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction(); 
   fragmentTransaction.remove(autocompleteFragment).commitNowAllowingStateLoss();
}
super.onDestroyView();    
}     

This way, anytime you recreate your Fragment it won't have an instance of the PlaceAutoCompleteFragment already created. Happy Coding!