首页 > 解决方案 > PutParcelable 不能应用于 Place.Type 错误?

问题描述

我正在尝试将地图数据从活动的地图片段传递到同一活动的单独片段。

当用户点击地图 POI 时,我打电话给谷歌并获取一堆数据,包括我想传递给新片段的 Place.Type,不幸的是 Place.Type 返回一个错误,说是错误类型..不可分割。Android Studio 为我提供了一个转换为 parcelable 的选项,我尝试过并崩溃了。

查看参考资料,谷歌说 Place.Types 实现了 parcelable 所以我有点困惑为什么这会失败

我确信有一种方法可以循环思考和重铸或其他东西,但我缺乏知识让我退缩了,有人可以在这里帮忙吗?

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

标签: javaandroidgoogle-mapsandroid-fragments

解决方案


所以最后我做了一个“影子类”来保存来自地点请求的所有数据

public class PlaceDataHolder implements Parcelable {

    private Place placeData;


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

当我完成编写这个类时,它从谷歌 OnSuccessListener 中接收对象并将其猛烈撞击到一个持有者变量中,这样我就可以在所述类上实现 Parcelable ......

然后,Android Studio 收到了一堆抱怨,并自动修复了导致所有这些美妙的额外代码

    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+进入了我通往这个光荣工作解决方案的道路


推荐阅读