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

1 0
原创粉丝点击