Android自定义系统分享UI,不使用系统的Dialog和Actionbar,完全自定义

不会调用系统的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

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:C马雯娟 返回首页