在Fragment的布局中只有一个登录的点击按钮和显示头像的ImageView
Step:1在Fragment的onCreateView中,把视图加载好,同时传入参数APPID和全局getActivity()上下文
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { view = View.inflate(getActivity(), R.layout.activity_frag,null); mTencent = Tencent.createInstance(APP_ID,getActivity()); return view; }Step:2在Fragment中的onActivityCreated方法中获取我们需要的控件
public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //登录按钮 btn = (Button) view.findViewById(R.id.btn); image = (ImageView) view.findViewById(R.id.image); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mIUiListener = new MyBaseUIlistener(getActivity(),image); //all表示获取所有权限 mTencent.login(getActivity(),"all", mIUiListener); } }); }特别说明:*在MyBaseUIlistener中就是一个实现UIListener的一个类
public class MyBaseUIlistener implements IUiListener { private Tencent mTencent; private Context context; private UserInfo mUserInfo; private String str; ImageView image; public MyBaseUIlistener(Context context) { this.context = context; } public MyBaseUIlistener(Context context, ImageView image) { this.context = context; this.image = image; } @Override public void onComplete(Object response) { mTencent = Tencent.createInstance("1105602574",context); Toast.makeText(context, "授权成功", Toast.LENGTH_SHORT).show(); Log.e("=======", "response:" + response); JSONObject obj = (JSONObject) response; try { String openID = obj.getString("openid"); String accessToken = obj.getString("access_token"); String expires = obj.getString("expires_in"); mTencent.setOpenId(openID); mTencent.setAccessToken(accessToken,expires); QQToken qqToken = mTencent.getQQToken(); mUserInfo = new UserInfo(context,qqToken); mUserInfo.getUserInfo(new IUiListener() { @Override public void onComplete(Object response) { Log.e("======","登录成功"+response.toString()); if(response ==null){ return; } try { JSONObject jo = (JSONObject) response; String img = jo.getString("figureurl_qq_1"); ImageLoader.getInstance().displayImage(img,image); } catch (Exception e) { e.printStackTrace(); } } @Override public void onError(UiError uiError) { Log.e("======","登录失败"+uiError.toString()); } @Override public void onCancel() { Log.e("====","登录取消"); } }); } catch (JSONException e) { e.printStackTrace(); } } @Override public void onError(UiError uiError) { Toast.makeText(context, "授权失败", Toast.LENGTH_SHORT).show(); } @Override public void onCancel() { Toast.makeText(context, "授权取消", Toast.LENGTH_SHORT).show(); } }
在该类中创建了两个有参构造器。因为我们要把QQ头像放到Fragment上。需要传入一个Imageview来加载这个图片。但是ManinActivity中无法找到Fragment布局中的控件。所以使用了两个构造器
我们把回调的方法放到Activity中
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mIUiListener = new MyBaseUIlistener(this); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == Constants.REQUEST_LOGIN){ Tencent.onActivityResultData(requestCode,resultCode,data,mIUiListener); } super.onActivityResult(requestCode, resultCode, data); }
这样一来,就实现了在Fragment中登录QQ并获取头像
注:在加载图片时。使用了Imageloader,通过请求数据,我们可以得到头像的地址。大家可以自行决定使用哪种图片加载方式进行加载。