4

Ich verwende PlaceAutoCompleteFragment innerhalb eines Fragments. Das erste Mal, wenn (App-Fragment, in dem PlaceAutoCompleteFragment platziert ist) öffnet es funktioniert wie ein Charme. Aber, wenn ich das zweite Mal auf den Knopf klicke, um Fragment zu öffnen, stürzt es mit einem Fehler ab. Es funktioniert nur ein einziges Mal.Wie verwende ich das Widget PlaceAutoCompleteFragment in einem Fragment - Android?

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 

Dies ist, wie ich dies mit:

SupportPlaceAutocompleteFragment placeAutocompleteFragment = (SupportPlaceAutocompleteFragment) getActivity().getSupportFragmentManager(). 
findFragmentById(R.id.place_autocomplete_fragment); 

placeAutocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() { 
    @Override 
    public void onPlaceSelected(Place place) { 
     System.out.println(place.getAddress()); 
    } 

    @Override 
    public void onError(Status status) { 
    } 
}); 

Fehler ist auf dieser Linie in onCreateDialog Verfahren, in dem das Layout aufbläst:

View view = inflater.inflate(R.layout.add_geofence_layout, null); 

XML:

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

Fragen sich! Warum funktioniert dieser Code nur einmal?

DialogFragment Klasse:

public Dialog onCreateDialog(Bundle savedInstanceState) { 
    LayoutInflater inflater = getActivity().getLayoutInflater(); 
    View view = inflater.inflate(R.layout.add_geofence_layout, null); 

    viewHolder = new ViewHolder(); 
    viewHolder.initializeView(view); 
    viewHolder.placeAutocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() { 
     @Override 
     public void onPlaceSelected(Place place) { 
      System.out.println(place.getAddress()); 
     } 

     @Override 
     public void onError(Status status) { 

     } 
    }); 
} 

Hinweis: - Ich bin ein PlaceautoCompleteFragment in einem DialogFragment verwenden. Wenn ich dies innerhalb einer Aktivität verwende, funktioniert es gut.

+0

teilen Sie den Code, den Sie verwenden, um das Fragment zu öffnen – x0r

+0

@ R.Kirill Code, den ich verwende, um zu öffnen Fragment: AddGeoFenceFragment dialogFragment = neu AddGeoFenceFragment(); dialogFragment.setAddGeoFenceListener (MainActivity.this); dialogFragment.setCancelable (false); dialogFragment.show (getSupportFragmentManager(), "AddGeoFenceFragment"); –

+0

Haben Sie Antworten hier angeschaut: http://stackoverflow.com/questions/14083950/duplicate-id-tag-null-or-parent-id-with-another-fragment-for-comp-google-androi. – WannaBeGeek

Antwort

0

die Sie interessieren, ob das funktioniert:

View view; 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
     LayoutInflater inflater = getActivity().getLayoutInflater(); 
      if(view == null) { 
      view = inflater.inflate(R.layout.add_geofence_layout, null); 
      } 
     viewHolder = new ViewHolder(); 
     viewHolder.initializeView(view); 

     viewHolder.placeAutocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() { 
      @Override 
      public void onPlaceSelected(Place place) { 
       System.out.println(place.getAddress()); 
      } 

      @Override 
      public void onError(Status status) { 

      } 
     }); 
} 
+0

Versucht, und es funktioniert nicht gut. :) Wie kann es sein? Wir werden die Ansicht jedes Mal, wenn diese Klasse aufgerufen wird, als null anzeigen, da die Ansicht noch nicht initialisiert ist. Recht? –

0

Sie sollten in Bezug auf das Layout mehr Kontext geben. Die Ausnahmen besagt: "Duplicate ID" sind Sie sicher, dass Sie nicht zweimal dieselbe ID verwenden?

0

Versuchen Sie das Fragment bei onDestroyView()

@Override 
public void onDestroyView() { 
    super.onDestroyView(); 
    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); 
    ft.remove(mPlaceAutocompleteFragment); 
    ft.commit(); 
} 
0

Fügen Sie keine PlaceAutocompleteFragment direkt auf Ihrem Fragment Layout zu entfernen. Sie müssen PlaceAutocompleteFragment dynamisch hinzufügen und auf onDestroyView() entfernen.

layout.xml

 <LinearLayout 
      android:id="@+id/placeLayout" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" 
      android:visibility="visible"> 
     </LinearLayout> 

hinzufügen PlaceAutocompleteFragment

PlaceAutocompleteFragment autocompleteFragment=new PlaceAutocompleteFragment(); 
    FragmentManager fragmentManager = getActivity().getFragmentManager(); 
    android.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.replace(R.id.placeLayout,autocompleteFragment); 
    fragmentTransaction.commit(); 

entfernen OnDestroy es

@Override 
public void onDestroyView() { 
    super.onDestroyView(); 
    if (getActivity() != null) { 
     FragmentManager fragmentManager = getActivity().getFragmentManager(); 
     android.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.remove(autocompleteFragment); 
     fragmentTransaction.commit(); 
    } 

}

Verwandte Themen