Android 仿知乎分享控制元件
使用 BottomSheetDialog 實現仿知乎分享控制元件
主要步驟:
- 首先獲取手機內所有支援分享的應用,得到 ResolveInfo 物件,利用反射獲取應用圖示等資訊
- 然後用 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…