How to use PlaceAutoCompleteFragment widget in a Fragment

2

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"/>
android
android-fragments
inflate-exception
asked on Stack Overflow Dec 27, 2016 by user5829709 • edited Dec 27, 2016 by Charuāļš

3 Answers

4

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

answered on Stack Overflow Jan 18, 2017 by Jordon
2

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);
answered on Stack Overflow Nov 19, 2018 by Varun Kumar
1

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!

answered on Stack Overflow Feb 23, 2018 by Ramiro G.M.

User contributions licensed under CC BY-SA 3.0