Android 仿知乎分享控制元件

iMeiji發表於2017-10-01

Android 仿知乎分享控制元件

使用 BottomSheetDialog 實現仿知乎分享控制元件
主要步驟:

  1. 首先獲取手機內所有支援分享的應用,得到 ResolveInfo 物件,利用反射獲取應用圖示等資訊
  2. 然後用 RecyclerView 的 GridLayoutManager 網格佈局展示,自己實現點選事件就差不多完成了

截圖

知乎
知乎
仿
仿
原生
原生
知乎 仿 原生

簡單實現

  • 寫一個分享介面的佈局

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="16dp"
            android:text="我是廣告欄"
            android:textAppearance="@style/TextAppearance.AppCompat"
            android:textSize="18sp"/>
    
        <View
            android:layout_width="match_parent"
            android:layout_height="1px"
            android:background="@android:color/darker_gray"/>
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/list_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    
    </LinearLayout>複製程式碼
  • 在 Activity 裡使用 BottomSheetDialog 控制元件顯示

    BottomSheetDialog mBottomSheetDialog = new BottomSheetDialog(this);
    mBottomSheetDialog.setContentView(R.layout.dialog_bottom_sheet);
    mBottomSheetDialog.show();複製程式碼
  • 寫一個 RecyclerViewAdapter 和 appinfo_item 佈局

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="vertical">
    
        <ImageView
            android:id="@+id/img_list_item"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:scaleType="centerCrop"
            tools:src="@mipmap/ic_launcher"/>
    
        <TextView
            android:id="@+id/text_list_item"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="2dp"
            android:ellipsize="end"
            android:singleLine="true"
            tools:text="分享11111111111111"/>
    </LinearLayout>複製程式碼
  • 獲取手機內所有支援分享的應用列表

    public static List<ResolveInfo> getShareApps(Context context, Intent intent) {
            List<ResolveInfo> resolveInfoList;
            PackageManager pm = context.getPackageManager();
            resolveInfoList = pm.queryIntentActivities(intent, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
            return resolveInfoList;
        }複製程式碼
  • 返回資料給 Activity,然後設定 Adapter 就差不多完成,詳細程式碼見 ZhihuShareDialog

缺點

  • 通過 PackageManager 的 queryIntentActivities 方法獲取到的應用是按照應用安裝的先後順序,而 Lollipop(5.0) 開始原生分享已支援自動把常用應用排在最頂部。當然也可以自己實現應用的排序,但比較折騰,可參考原始碼 ResolverActivity

優點

  • 可以自定義分享介面,比如像知乎那樣新增廣告欄,設計一套屬於自己的 UI ,設定應用的排列順序等等

原始碼下載地址 : github.com/iMeiji/Zhih…

相關文章