接手项目后的有一天,我在使用自家APP的时候,本来想分享一则消息到微信里,第一次分享很成功,但我还想继续给其他人分享,就再次弹出了分享的弹窗,我依旧点击微信分享,可是,并没有执行分享,弹窗就消失了,我就很奇怪为什么没有分享。之后去翻看代码,看到Dialog中使用的是RadioGroup,包含四个RadioButton,通过对RadioGroup设置onCheckchanged监听来实现分享的,我当时检查了一下分享的代码,发现被没有问题,就debug,发现第一次成功执行,但在第二次选中同一个radiobutton的时候,方法就不执行了,但是我很奇怪dialog为什么dismiss了,我查看代码,发现里面有onclick监听,里面直接调用dismiss方法,我想第二次不执行分享,应该就是这个方法调用了,之后去掉方法调用,在测试一下,果然如此。之后我仔细一想,是不是RadioGroup如果当前选中的id和之前选中的id是相同,是不是就不会回调onCheckChanged,经过测试,果然如此。RadioGroup的onCheckChange方法只有在RadioGroup的选中的id发生改变才会回调,否则就只会调用选中的那个RadioButton的onClick方法。
查看RadioGroup源码中看到:
真正回调onCheckChanged方法是在这里
private void setCheckedId(@IdRes int id) { mCheckedId = id; if (mOnCheckedChangeListener != null) { mOnCheckedChangeListener.onCheckedChanged(this, mCheckedId); } }
而调用setCheckedId是这个方法:
/** * <p>Sets the selection to the radio button whose identifier is passed in * parameter. Using -1 as the selection identifier clears the selection; * such an operation is equivalent to invoking {@link #clearCheck()}.</p> * * @param id the unique id of the radio button to select in this group * * @see #getCheckedRadioButtonId() * @see #clearCheck() */ public void check(@IdRes int id) { // don't even bother if (id != -1 && (id == mCheckedId)) { return; } if (mCheckedId != -1) { setCheckedStateForView(mCheckedId, false); } if (id != -1) { setCheckedStateForView(id, true); } setCheckedId(id); }
是不是立马就明白了,首先就有判断当前的id和之前选中的id是否相同,相同就被return了。我们可以调用clearCheck()方法清除选中。
/** * <p>Clears the selection. When the selection is cleared, no radio button * in this group is selected and {@link #getCheckedRadioButtonId()} returns * null.</p> * * @see #check(int) * @see #getCheckedRadioButtonId() */ public void clearCheck() { check(-1); }
dialog里面关键的分享代码如下:
@Override public void onCheckedChanged(RadioGroup radioGroup, int index) { // 分享QQ或微信的时候,title 和 text的内容不能为空 //1、判断shareBean是否非空 if (utils.isEmpty(shareBean)) { if (utils.isNotEmpty(callback)) { callback.onShareCallBack("分享失败。"); } else { utils.toast("分享失败!"); } return; } //2、设置分享的平台 Platform plat; //3、设置分享内容 Platform.ShareParams sp = new Platform.ShareParams(); switch (index) { case R.id.shareFriends: if (shareBean.getBitmap() != null) { sp.setImageData(shareBean.getBitmap()); } else { sp.setImageData(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher)); } sp.setImageUrl(shareBean.getImageUrl()); sp.setUrl(shareBean.getUrl()); // 微信的用setUrl网友点进链接后,可以看到分享的详情 sp.setShareType(Platform.SHARE_WEBPAGE);//非常重要:一定要设置分享属性 plat = ShareSDK.getPlatform(WechatMoments.NAME); break; case R.id.shareWx: if (shareBean.getBitmap() != null) { sp.setImageData(shareBean.getBitmap()); } else { sp.setImageData(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher)); } sp.setImageUrl(shareBean.getImageUrl()); sp.setUrl(shareBean.getUrl()); // 微信的用setUrl网友点进链接后,可以看到分享的详情 sp.setShareType(Platform.SHARE_WEBPAGE);//非常重要:一定要设置分享属性 plat = ShareSDK.getPlatform(Wechat.NAME); break; case R.id.shareQQZone: sp.setImageUrl(shareBean.getImageUrl()); sp.setTitleUrl(shareBean.getUrl());// QQ空间分享用titleUrl sp.setShareType(Platform.SHARE_WEBPAGE);//非常重要:一定要设置分享属性 plat = ShareSDK.getPlatform(QZone.NAME); break; case R.id.shareQQ: sp.setImageUrl(shareBean.getImageUrl()); sp.setTitleUrl(shareBean.getUrl());// QQ分享用titleUrl sp.setShareType(Platform.SHARE_WEBPAGE);//非常重要:一定要设置分享属性 plat = ShareSDK.getPlatform(QQ.NAME); break; default: if (utils.isNotEmpty(callback)) { callback.onShareCallBack("分享失败。"); } else { utils.toast("分享失败!"); } return; } sp.setTitle(shareBean.getTitle()); //分享标题 sp.setText(shareBean.getContent()); //分享文本 //4、设置分享的回调 plat.setPlatformActionListener(this); // 设置分享事件回调 //5、执行分享 plat.share(sp); utils.logD("执行分享"); //这里之所以需要清除radioGroup的选中,是因为,如果弹窗第二次弹出时,用户点击了同一个radioButton,就会导致不会回调onCheckChange方法,而是会走radioButton的点击事件。一定记得要清除选中 radioGroup.clearCheck(); //6、关闭分享框 dismiss(); }
shareSDK的回调如下:
@Override public void onComplete(Platform platform, int code, HashMap<String, Object> hashMap) { if (utils.isNotEmpty(callback)) { callback.onShareCallBack("分享成功。"); } else { utils.toast("分享成功"); } utils.logD("onComplete_platform:" + platform.getName() + ",code:" + code); } @Override public void onError(Platform platform, int code, Throwable throwable) { utils.logD("platform:" + platform.getName() + ",code:" + code + ",throwable:" + throwable.getMessage()); String expName = platform.getClass().getSimpleName(); if (expName.equals("WechatClientNotExistException")) { if (utils.isNotEmpty(callback)) { callback.onShareCallBack("您还没有安装微信哦。"); } else { utils.toast("您还没有安装微信哦"); } } else if (expName.equals("WechatTimelineNotSupportedException")) { if (utils.isNotEmpty(callback)) { callback.onShareCallBack("您当前微信版本太低,不支持分享到朋友圈。"); } else { utils.toast("您当前微信版本太低,不支持分享到朋友圈"); } } if (code == CancelCode) { if (utils.isNotEmpty(callback)) { callback.onShareCallBack("已取消分享。"); } else { utils.toast("已取消分享"); } dismiss(); } else { if (utils.isNotEmpty(callback)) { callback.onShareCallBack("分享失败。"); } else { utils.toast("分享失败"); } utils.logD("onError_platform:" + platform.getName() + ",code:" + code); } } @Override public void onCancel(Platform platform, int code) { if (code == CancelCode) { if (utils.isNotEmpty(callback)) { callback.onShareCallBack("已取消分享。"); } utils.toast("已取消分享"); } utils.logD("onCancel_platform:" + platform.getName() + ",code:" + code); }