在Fragment中使用GoogleApiClient遇类型转换问题求助
Fragment中正确创建GoogleApiClient.Builder的解决方案
咱们先来拆解下你遇到的问题:
- 传
getContext()报错,是因为MyGoogleClass里把传入的Context(也就是你的Activity)强制转换成了回调接口,但你的Activity根本没实现这些接口——实现接口的是你的Fragment,不是Activity。 - 直接传
this编译失败,是因为Fragment本身不是Context类型,GoogleApiClient.Builder的构造器需要的是Context实例。
下面给你两种可行的解决思路,推荐第一种,更清晰也更符合代码规范:
方案一:修改MyGoogleClass的方法(推荐)
把buildGoogleApiClient改成分别接收Context和回调接口的形式,彻底避免强制类型转换的坑:
public class MyGoogleClass { private static GoogleApiClient mGoogleApiClient; public static synchronized GoogleApiClient buildGoogleApiClient( Context context, GoogleApiClient.ConnectionCallbacks connectionCallbacks, GoogleApiClient.OnConnectionFailedListener failedListener) { if (mGoogleApiClient == null) { mGoogleApiClient = new GoogleApiClient.Builder(context) .addConnectionCallbacks(connectionCallbacks) .addOnConnectionFailedListener(failedListener) .addApi(LocationServices.API) .build(); } return mGoogleApiClient; } }
然后在你的Fragment里调用时,传入getActivity()作为Context(Fragment关联的Activity是合法的Context),同时把this作为回调实例(因为你的Fragment已经实现了那两个接口):
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (MyGoogleClass.checkPlayServices(getContext(), getActivity())) { // 这里传入正确的Context和回调实例 MyGoogleClass.buildGoogleApiClient(getActivity(), MyFrag.this, MyFrag.this); // 别忘了调用connect()建立连接 if (MyGoogleClass.mGoogleApiClient != null) { MyGoogleClass.mGoogleApiClient.connect(); } } } });
方案二:让Activity实现回调接口(不推荐)
如果实在不想修改MyGoogleClass,那只能让你的Fragment所在的Activity实现GoogleApiClient.ConnectionCallbacks和GoogleApiClient.OnConnectionFailedListener接口,然后把Activity作为参数传入buildGoogleApiClient:
不过这种方式需要你在Activity的回调方法里把事件传递给Fragment,代码会变得冗余,而且不符合“谁使用谁处理”的原则,所以不太推荐。
另外还要提醒你:
- 在Fragment中使用
getActivity()时,最好先判空,避免Fragment脱离Activity时出现空指针异常。 - 记得在Fragment的生命周期里管理GoogleApiClient的状态,比如在
onStart()调用connect(),onStop()调用disconnect(),防止内存泄漏。
内容的提问来源于stack exchange,提问作者LorenzoBerti
相关产品推荐
相关产品推荐

