PutParcelable не может быть применен к ошибке Place.Type? - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь передать данные карты из фрагмента карты в отдельном фрагменте того же действия.

Когда пользователь нажимает на POI карты, я звоню в Google и беру куча данных, включая Place.Type, которые я хочу передать новому фрагменту, к сожалению, Place.Type возвращает ошибку, говорящую, что это неправильный тип .. unparcelable. Android студия предложила мне вариант приведения к parcelable, который я пробовал и разбил.

Глядя в ссылку, Google говорит, что Place.Types реализует parcelable, поэтому я немного запутался, почему это не удается

Я уверен, что есть способ l oop подумать и переделать или что-то еще, но мое отсутствие знаний сдерживает меня, может кто-нибудь, пожалуйста, помогите здесь?

public class ZombieMapActivity extends FragmentActivity implements OnMapReadyCallback, GoogleMap.OnMyLocationButtonClickListener, GoogleMap.OnMyLocationClickListener, GoogleMap.OnPoiClickListener {

    private GoogleMap mMap;
    private final int PERM_REQUEST_LOCATION_INT = 1;
    private FusedLocationProviderClient FusedLocationClient;
    private String apiKey;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_zombie_map);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        //location
        FusedLocationClient = LocationServices.getFusedLocationProviderClient(this);

        //places API stuff
        apiKey  = getResources().getString(R.string.google_maps_key);
        Places.initialize(getApplicationContext(), apiKey);

    }




    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
    //perm check
        ...{
         mapSetup();
        }
    }

    private void requestPerms() { ... }

//catch request reply
    @Override
    public void onRequestPermissionsResult(
            int requestCode,
            String permissions[],
            int[] grantResults)    { ... }
    }

    private void mapSetup() {...}

    @Override
    public boolean onMyLocationButtonClick() {...}

    @Override
    public void onMyLocationClick(@NonNull Location location) {
        makeToast("This is you");
    }

    @Override
    public void onPoiClick(final PointOfInterest poi) {
        //distance check and throw out if to far

        //great place to think about a caching system for types.. to cut down on requests

        //placeId to place type method
        PlacesClient placesClient = Places.createClient(this);
        String placeId = poi.placeId;
        List<Place.Field> placeFields = Arrays.asList(Place.Field.ID, Place.Field.TYPES);
        FetchPlaceRequest request = FetchPlaceRequest.newInstance(placeId, placeFields);

        placesClient.fetchPlace(request).addOnSuccessListener(new OnSuccessListener<FetchPlaceResponse>() {
            @Override
            public void onSuccess(FetchPlaceResponse fetchPlaceResponse) {
                Place place = fetchPlaceResponse.getPlace();
                List<Place.Type> types = place.getTypes();
                String placeName = poi.name;
                makeLootFragment(types,placeName);

                makeToast(placeName);
            }
        });
    }

    private void makeLootFragment(List<Place.Type> _types,String name){

        //pack it for sending
        Bundle lootBundle = new Bundle();

        lootBundle.putParcelable("bLootTypes" , (Parcelable) _types);//not working
        lootBundle.putString("bName",name);

        FragmentManager lootFragMan = getSupportFragmentManager();
        FragmentTransaction LootTrans = lootFragMan.beginTransaction();
        LootFragment lootFragment = new LootFragment();
        lootFragment.setArguments(lootBundle);
        LootTrans.add(R.id.lootContainer,lootFragment);
        LootTrans.addToBackStack("LootStack");
        LootTrans.commit();

    }





    private void makeToast(String words) {
        Toast.makeText(this, words, Toast.LENGTH_SHORT).show();
    }
}

Любой другой совет, основанный на ужасная кодировка, отображаемая здесь, также будет очень полезна: D

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Итак, в конце я создал «теневой класс» для хранения всех данных из запроса места.

public class PlaceDataHolder implements Parcelable {

    private Place placeData;


    public PlaceDataHolder(Place _place){
        placeData = _place;
    }
}

Когда я закончил писать этот класс, он получает объект из google OnSuccessListener и slams. это в переменную держателя только для того, чтобы я мог реализовать Parcelable для указанного класса ...

Android Студия тогда получила кучу жалоб, которые были автоматически исправлены для получения всего этого замечательного дополнительного кода

    protected PlaceDataHolder(Parcel in) {
    placeData = in.readParcelable(Place.class.getClassLoader());
}

public static final Creator<PlaceDataHolder> CREATOR = new Creator<PlaceDataHolder>() {
    @Override
    public PlaceDataHolder createFromParcel(Parcel in) {
        return new PlaceDataHolder(in);
    }

    @Override
    public PlaceDataHolder[] newArray(int size) {
        return new PlaceDataHolder[size];
    }
};

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeParcelable(placeData, flags);
}

public List<Place.Type> getTypes(){
    return placeData.getTypes();
}

Этот последний бит был сгенерирован с почти нулевым размышлением мною, просто поднял красные линии и alt + вошел в мой путь к этому великолепному рабочему решению

0 голосов
/ 19 февраля 2020

Класс объекта, который вы хотите отправить, должен реализовывать интерфейс Parcelable следующим образом -

public class Student implements Parcelable {

    private Integer rollno;
    private String name;
    private Integer age;


    protected Student(Parcel in) {

        age = in.readInt();
        name  = in.readString();
        rollno = in.readInt();

    }

    public Student(Integer age, String name, Integer rollno) {
        this.age = age;
        this.name = name;
        this.rollno = rollno;
    }


    public static final Creator<Student> CREATOR = new Creator<Student>() {
        @Override
        public Student createFromParcel(Parcel in) {
            return new Student(in);
        }

        @Override
        public Student[] newArray(int size) {
            return new Student[size];
        }
    };


    @Override
    public int describeContents() {
        return 0;
    }

    public Integer getRollno() {
        return rollno;
    }

    public void setRollno(Integer rollno) {
        this.rollno = rollno;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }



    public static Creator<Student> getCREATOR() {
        return CREATOR;
    }


  @Override
    public void writeToParcel(Parcel parcel, int i) {

        parcel.writeInt(age);
        parcel.writeString(name);
        parcel.writeInt(rollno);


    }
}

Итак, вам нужно создать класс и реализовать Parcelable и записать содержимое Place.Type в его члены а затем передать его другому фрагменту

...