places placeautocompletefragment google geodataclient example edittext custom java android-fragments autocomplete widget

java - google - ¿Se puede llamar a PlaceAutocompleteFragment(modo de superposición) desde dentro de la clase Fragment?



place autocomplete android (5)

Use getActivity ()

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

Estoy trabajando en mi proyecto para crear una actividad (amplía AppCompatActivity) con un panel de navegación para cambiar entre múltiples Fragmentos y uno de ellos es un MapFragment (extiende el Fragmento) con una implementación de MapView. Me gustaría llamar al widget Autocompletar, provisto por Google, dentro de la clase MapFragment.

Aquí está mi código dentro de la clase MapFragment

PlaceAutocompleteFragment autocompleteFragment = (PlaceAutocompleteFragment) getFragmentManager().findFragmentById(R.id.place_autocomplete_fragment); AutocompleteFilter typeFilter = new AutocompleteFilter.Builder() .setTypeFilter(AutocompleteFilter.TYPE_FILTER_ADDRESS) .build(); autocompleteFragment.setFilter(typeFilter); autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() { @Override public void onPlaceSelected(Place place) { // TODO: Get info about the selected place. String placeDetailsStr = place.getName() + "/n" + place.getId() + "/n" + place.getLatLng().toString() + "/n" + place.getAddress() + "/n" + place.getAttributions(); Log.i("OnPlaceSelected", placeDetailsStr); map.moveCamera(CameraUpdateFactory.newLatLngZoom(place.getLatLng(), 15)); } @Override public void onError(Status status) { // TODO: Handle the error. Log.i("OnPlaceSelected", "An error occurred: " + status); } });

error de sintaxis fue en

PlaceAutocompleteFragment autocompleteFragment = (PlaceAutocompleteFragment) getFragmentManager().findFragmentById(R.id.place_autocomplete_fragment);

dijo eso

Tipo inconvertible; no se puede convertir ''android.support.v4.app.Fragment'' en ''com.google.android.gms.location.places.ui.PlaceAutocompleteFragment''

Pero cuando pongo este conjunto de código dentro de MainActivity, funciona bien. Así que me pregunto si hay alguna forma de llamar a Autocompletar Widget dentro de Fragment, simplemente no puedo.

Cualquier respuesta será apreciada. :)


Tienes que usar algo como esto si estás tratando de encontrar el fragmento dentro de un fragmento:

placeAutocompleteFragment = (PlaceAutocompleteFragment)getChildFragmentManager().findFragmentById(R.id.fragmentPlaces);

Es posible que tenga problemas con el hecho de que onPlaceSelected no se haya llamado, esto se debe a que su actividad propietaria debe reenviar el resultado al fragmento.

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); mapFragment.onActivityResult(requestCode, resultCode, data); }

y mapFragment tiene que enviar el resultado al fragmento de lugares:

@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); placeAutocompleteFragment.onActivityResult(requestCode, resultCode, data); }

Incluso con esto, he tenido problemas con onPlacesSelected no se ha llamado. Por lo general, es mejor no anidar el mapa y colocar fragmentos, sino simplemente separarlos en la actividad propietaria.


Tenía la misma pregunta, y gracias a @Kalpesh idea, funciona bien, y no hay problema de eventListenner, aquí está mi código si puede ayudar a alguien.

Tengo un tablayout con un viewpager y 3 fragmentos que podemos deslizar hacia la derecha o hacia la izquierda.

googlePLacesLayout.xml

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/colorFragment_bg"> <android.support.v7.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="0dp" android:layout_marginBottom="0dp"> <fragment android:id="@+id/autocomplete_fragment" android:name="com.google.android.gms.location.places.ui.PlaceAutocompleteFragment" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="80dp" /> </android.support.v7.widget.CardView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Large Text" android:id="@+id/largeTexxt" android:layout_centerVertical="true" android:layout_alignParentStart="true" /> </RelativeLayout>

MyFragmentClass.java

package com.raccoon.trash.aregood.TabFragments; public class MyFragmentClass extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final RelativeLayout mRelativeLayout = (RelativeLayout) inflater.inflate( R.layout.googlePLacesLayout, container, false); PlaceAutocompleteFragment autocompleteFragment = (PlaceAutocompleteFragment) getActivity().getFragmentManager().findFragmentById(R.id.autocomplete_fragment); autocompleteFragment.setHint("Let''s find some restaurants"); final TextView textView = (TextView) mRelativeLayout.findViewById(R.id.largeTexxt); autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() { @Override public void onPlaceSelected(Place place) { textView.setText("Place: " + place.getName()+ place.getId()+ place.getAddress()+ place.getPhoneNumber()+ place.getWebsiteUri()); System.out.println("Place: " + place.getName()+ place.getId()+ place.getAddress()+ place.getPhoneNumber()+ place.getWebsiteUri()); } @Override public void onError(Status status) { System.out.println("An error occurred: " + status); } }); return mRelativeLayout; }

}


He estado buscando en el interwebz también y no pude encontrar una solución, hasta que me di cuenta de que tenía el mismo problema exacto con MapFragment, ¡así que apliqué esa técnica y funcionó!

Fragmento:

private SupportPlaceAutocompleteFragment autocompleteFragment; public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) { ... autocompleteFragment = (SupportPlaceAutocompleteFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment); if(autocompleteFragment==null){ autocompleteFragment = (SupportPlaceAutocompleteFragment) SupportPlaceAutocompleteFragment.instantiate(context, "com.google.android.gms.location.places.ui.SupportPlaceAutocompleteFragment"); autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() { @Override public void onPlaceSelected(Place place) { } @Override public void onError(Status status) { } }); fm.beginTransaction().replace(R.id.autocomplete_fragment, autocompleteFragment).commit(); } ...

Nota: Estoy usando el fragmento de soporte (android.support.v4.app.Fragment), es por eso que uso SupportPlaceAutocompleteFragment

XML:

<RelativeLayout android:id="@+id/autocomplete_fragment" android:layout_width="match_parent" android:layout_height="wrap_content" />


Debes usar SupportPlaceAutocompleteFragment lugar de PlaceAutocompleteFragment , se reemplaza al usar Fragment supportv4

SupportPlaceAutocompleteFragment autocompleteFragment = (SupportPlaceAutocompleteFragment) getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment);