java - 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
解决方案
所以最后我做了一个“影子类”来保存来自地点请求的所有数据
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+进入了我通往这个光荣工作解决方案的道路
推荐阅读
- android - 如何在 OkHttp 中拦截请求?
- angular - 无法使用 Angular 导入 Google Vision API
- css - Bootstrap 4 - 带选项卡的模态对话框 - 下拉菜单
- html - 如何控制 CSS 箭头大小
- ios - WKWebView 与钱包的连接?
- django - 在 Django admin 中提交新帖子时如何检查重复的帖子?
- wordpress - 图像无法在移动设备上正确显示
- angular - Angular Material Paginator 使用数据库数据,而不是静态计数器
- r - R中表格的字符列表
- python - 用 pyplot 在离散时间绘制分布图