在Fragment中使用QQ第三方登录时回调方法的问题

来源:互联网 发布:大数据面试题 编辑:程序博客网 时间:2024/06/04 18:45

在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中

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    mIUiListener = new MyBaseUIlistener(this);}@Overrideprotected 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,通过请求数据,我们可以得到头像的地址。大家可以自行决定使用哪种图片加载方式进行加载。

原创粉丝点击