博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
仿知乎分享界面
阅读量:7037 次
发布时间:2019-06-28

本文共 4282 字,大约阅读时间需要 14 分钟。

前言

最近在做一个资讯类的APP,上面需要一个分享功能,项目不大,如果去使用官方的SDK还需要审查之类的,感觉太麻烦。偶然看到知乎的分享界面做得不错,拿到我这个项目中正合适,在网上查了一下资料,使用BottomSheetDialogFragment结合系统自带的分享功能就可以做到它的效果。

知乎分享界面:

自己完成的效果图:

)

布局文件

数据

获取手机中可接收我们分享的数据的App集合,方法很简单:

public static List
getShareList(Context context) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); PackageManager packageManager = context.getPackageManager(); List
list = packageManager.queryIntentActivities(intent, 0); return list; }

如果你只想显示指定的APP,或者把一些APP的显示位置提前,在这里可以通过APP的包名进行筛选或过滤。

例如你想把腾讯旗下的APP提前一点,可以这么做:

//调整顺序,把微信、QQ提到前面来        Collections.sort(list, new Comparator
() { @Override public int compare(ResolveInfo resolveInfo, ResolveInfo t1) { ActivityInfo activityInfo1 = resolveInfo.activityInfo; ActivityInfo activityInfo2 = t1.activityInfo; if (activityInfo1.packageName.contains("com.tencent.") && !activityInfo2.packageName.contains("com.tencent.")) { return -1; } else if (!activityInfo1.packageName.contains("com.tencent.") && activityInfo2.packageName.contains("com.tencent.")) { return 1; } return 0; } });

之后我们就能很容易获取到这些App的名字和图标。

Drawable icon = list.get(i).loadIcon(context.getPackageManager());String label = list.get(i).loadLabel(context.getPackageManager()).toString();

界面代码

新建一个Fragment继承BottomSheetDialogFragmentBottomSheetDialogFragment的使用很简单,界面代码的编写与在普通的Fragment一样,然后我们只需调用它的show()/dismiss()即可让它显示或关闭。

完整的shareFragment代码:

public class ShareFragment extends BottomSheetDialogFragment {    private List
mShareResolveInfoList; private List
mShareList; private Context mContext; private static String mTitle; private static String mUrl; public static ShareFragment getInstance(String title, String url) { mTitle = title; mUrl = url; return new ShareFragment(); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { mContext = getContext(); View view = inflater.inflate(R.layout.fragment_share, container, false); initData(); initViews(view); return view; } private void initViews(View view) { RecyclerView recyclerView = view.findViewById(R.id.fragment_share_recyclerView); recyclerView.setLayoutManager(new GridLayoutManager(mContext, 3)); ShareRecyclerViewAdapter adapter = new ShareRecyclerViewAdapter(mShareList, mContext); adapter.setOnClickShareItemListener(new ShareRecyclerViewAdapter.OnClickShareItemListener() { @Override public void OnClick(int position) { Intent intent = new Intent(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_TEXT, "我在讯博上发现一篇好文章:" + "\n" + mTitle + "\n" + mUrl); intent.setType("text/plain"); ActivityInfo activityInfo = mShareResolveInfoList.get(position).activityInfo; intent.setClassName(activityInfo.packageName, activityInfo.name); startActivity(intent); dismiss(); } }); recyclerView.setAdapter(adapter); } private void initData() { mShareList = new ArrayList<>(); mShareResolveInfoList = ShareUtil.getShareList(mContext); for (int i = 0; i < mShareResolveInfoList.size(); i++) { ShareItem item = new ShareItem(); item.setIcon(mShareResolveInfoList.get(i).loadIcon(mContext.getPackageManager())); item.setLabel(mShareResolveInfoList.get(i).loadLabel(mContext.getPackageManager()).toString()); mShareList.add(item); } }}

这里我实现的是分享文字,如果要分享其他东西例如图片,把intent.setType("text/plain")修改成intent.setType("image/jpeg"),再在intent.putExtra()中传去入分享的东西即可。

把分享的显示封装成一个工具类方法,方便在任何界面调用

public static void share(FragmentManager fragmentManager, String title, int id) {        String url = "xxx";        ShareFragment.getInstance(title, url).show(fragmentManager, "dialog");  }

最后

文章中如果有什么错误或可以改进的地方,欢迎在评论区给我留言。

转载地址:http://qwfal.baihongyu.com/

你可能感兴趣的文章
jquery ready 延迟
查看>>
对adapter的封装优化
查看>>
jquery bind、delegate、live、on的区别及联系
查看>>
实体框架 Code First
查看>>
leetcode - Sort Colors
查看>>
&quot;伪中国移动client&quot;--伪基站诈骗
查看>>
Connection reset by peer问题分析
查看>>
nohup php -f xx.php &
查看>>
JDBC Oracle sys 用户连接
查看>>
不下载SDK启动Android Studio
查看>>
【ORACLE】使用数据泵的生产环境impd,expdp数据迁移
查看>>
房地产行业的商业智能BusinessIntelligence介绍
查看>>
【转】管理者与领导者的区别
查看>>
Redmine、Apache、Git集成遇到的重重困难
查看>>
emSecure Use Digital Signatures to protect your products
查看>>
hdu 4911 Inversion
查看>>
理解 OpenStack + Ceph (1):Ceph + OpenStack 集群部署和配置
查看>>
Yii2结合webuploader实现图片上传
查看>>
STM32-F0/F1/F2
查看>>
angularjs 实现 文件拖拽,缩略图显示
查看>>