Android自定义系统分享UI,不使用系统的Dialog和Actionbar,完全自定义
来源:互联网 发布:重庆mac专柜在哪里 编辑:程序博客网 时间:2024/06/06 15:18
不会调用系统的dialog或者其他分享界面,比如点击QQ后会直接调转到QQ。
Android分享内容到其他应用,调用系统的Dialog或者ActionBar的弹窗都不太自由,对于我们自定义UI限制太大,这里我做了简单的封装,可以弹窗,也可以直接在Activity或者Fragment里边自定义界面。这里展示一个关键类的代码,做了封装处理,先讲原理,项目连接在文章末。
最终效果(我这里只是略显示了一下,并没有做UI美化,你可以完全自定义噢):
项目结构:
扫描支持分享的代码都在Share类中,扫描出来的支持分享APP的Bean是ShareItem,分享类型选择ShareType中,支持分享 text文字和image图片。
先来看怎么扫描支持分享的APP,打开Share类:
/** * 得到支持分享的应用 * * @param type 分享的类型是文字还是图片 * @return 返回支持分享的app集合 */ public List<ShareItem> scanShreaApp(ShareType type, String content) { mShareIntent = new Intent(Intent.ACTION_SEND); switch (type) { case Image: mShareIntent.setType("image/*"); File file = new File(content); Uri uri = Uri.fromFile(file); mShareIntent.putExtra(Intent.EXTRA_STREAM, uri); break; case Text: mShareIntent.setType("text/plain"); mShareIntent.putExtra(Intent.EXTRA_TEXT, content); break; } PackageManager packageManager = mContext.getPackageManager(); mResolveInfos.clear(); mResolveInfos.addAll(packageManager.queryIntentActivities(mShareIntent, 0)); ArrayList<ShareItem> shareItems = new ArrayList<>(); for (ResolveInfo resolveInfo : mResolveInfos) { ShareItem shareItem = new ShareItem(resolveInfo.loadLabel(packageManager), resolveInfo.loadIcon(packageManager)); shareItems.add(shareItem); } return shareItems; }
这里根据传入的分享类型(图片、文字)扫描支持分享的APP,如果是图片,那么content就是图片地址,如果是文字,那么content就是分享的文字内容。
第一 packageManager.queryIntentActivities(mShareIntent, 0)这一句就是扫描支持分享的APP了,疑问来了,就传如一个intent和0怎么就是扫描分享了,我们往最上面看,应该注意到new Intent(Intent.ACTION_SEND)这句话了吧,这里是的action是Intent.ACTION_SEND,要想支持分享,那么这个APP的某个activity就得声明这个action,所以可以扫描到支持分享的APP。
第二 我们把扫描到的支持分享的APP的icon和title用ShareItem包装起来,用List return给调用扫描者,那么调用扫描的地方就可以用ListView或者RecylerView来显示支持分享的APP了
第三 扫描到了,如何执行分享?我们看到代码中有一个mResolveInfos成员变量,保存了没有解析的支持分享的APP信息的List,在上面还有一个这样的方法:
/** * 执行分享 * * @param position 用户选中的item */ public void share(int position) { ResolveInfo resolveInfo = mResolveInfos.get(position); if (resolveInfo != null) { ComponentName chosenName = new ComponentName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name); Intent intent = new Intent(mShareIntent); intent.setComponent(chosenName); try { mContext.startActivity(intent); } catch (Throwable e) { } } }
这个方法需要传入一个position的int值,和解呢?刚才scanShreaApp方法return出去的不是一个list吗?那么用户点击了之后从ListView中得到这个position,用户直接调用这个方法就可以执行分享了。
完整源码连接:http://download.csdn.net/detail/yanzhenjie1003/8910107
- Android自定义系统分享UI,不使用系统的Dialog和Actionbar,完全自定义
- android 系统Dialog,自定义Dialog
- 【Android UI】自定义圆形SeekBar和自定义Dialog的结合使用
- Android自定义系统分享面板
- 如何在AppCompatActivity中屏蔽系统的ActionBar使用自定义的ActionBar获得兼容性
- 自定义view__封装Dialog-分享功能UI的实现
- 自定义Dialog&actionbar布局
- Android UI设计:自定义Dialog
- android自定义的actionbar
- 完全自定义Android对话框AlertDialog的实现(系统源码)
- 系统自定义UI示例
- Android actionbar Menu 和 overflow的自定义
- ActionBar的使用,设置和自定义
- Android 自定义Dialog使用
- Android开发UI之自定义ActionBar的风格
- Android 自定义dialog,去除系统默认黑色背景,边框并设置dialog的显示位置
- Andorid 系统自定义的 文字和图片 分享功能
- Android UI ActionBar功能-自定义Tab功能
- 第18题
- ZeptoLab Code Rush 2015 C. Om Nom and Candies
- Bash Shell字符串操作小结
- 第19题
- [基础]原码反码补码
- Android自定义系统分享UI,不使用系统的Dialog和Actionbar,完全自定义
- hdu 1863 最小生成树
- Bash字符串处理(与Java对照) - 20.查找子串的位置
- next-unique-digit-number
- Android studio 的配置
- win7/win8 64位系统注册TeeChart8.ocx 控件---以及dllregisterserver调用失败问题解决办法
- 存储器体系结构
- 使用 gyp 生成工程文件
- LeetCode7~9 Reverse Integer/String to Integer (atoi)/Palindrome Number